Wiktionary
viwiktionary
https://vi.wiktionary.org/wiki/Wiktionary:Trang_Ch%C3%ADnh
MediaWiki 1.47.0-wmf.2
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
2353534
2350317
2026-05-15T07:27:57Z
Hiyuune
50834
/* Tháng 5 năm 2026 */
2353534
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 5 năm 2026 ==
=== Thứ sáu, ngày 15 tháng 5 năm 2026 ===
* [[ine]] đồng thời trở thành mục từ đầu tiên của các ngôn ngữ: Aka-Kede, Itene.
=== Thứ ba, ngày 5 tháng 5 năm 2026 ===
* {{l|rtm|hạni}} trở thành mục từ tiếng Rotuman đầu tiên của Wiktionary tiếng Việt.
== Tháng 4 năm 2026 ==
=== Thứ ba, ngày 14 tháng 4 năm 2026 ===
* {{l|anw|eka}} trở thành mục từ tiếng Anaang đầu tiên của Wiktionary tiếng Việt.
=== Thứ năm, ngày 9 tháng 4 năm 2026 ===
* {{l|bni|kana}} trở thành mục từ tiếng Bangi đầu tiên của Wiktionary tiếng Việt.
=== Chủ nhật, ngày 5 tháng 4 năm 2026 ===
* {{l|zle-ono|аньгеле}} trở thành mục từ tiếng Novgorod cổ đầ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}}]]
qvrmi4fw4zxpeq138gey1d6cb00g1ky
măm
0
31983
2353425
2350078
2026-05-15T02:51:21Z
WhoAlone
40420
2353425
wikitext
text/x-wiki
{{-vie-}}
{{-pron-}}
{{vie-pron|măm}}
{{-nôm-}}
{{top}}
*[[鑁]]: [[măm]]
*[[敏]]: [[mắn]], [[mẫn]], [[mẩn]], [[măm]]
{{bottom}}
{{-paro-}}
{{đầu}}
:* [[mắm]]
:* [[mầm]]
{{giữa}}
:* [[mâm]]
:* [[mẫm]]
{{cuối}}
{{-verb-}}
'''măm'''
# [[từ|Từ]] dùng để [[nói]] [[trẻ em]] [[ăn]].
{{-ref-}}
{{R:FVDP}}
{{R:WinVNKey:Lê Sơn Thanh}}
[[Thể loại:Động từ tiếng Việt]]
=={{langname|rmx}}==
==={{ĐM|verb}}===
{{head|rmx|Động từ}}
# [[bú]].
==={{ĐM|ref}}===
* Võ Đức Tám. ''Âm tiết trong tiếng Rơ-măm''.
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá khô]].
#:{{ux|sed|kâ hmê ƀă '''măm'''|Ăn cơm với '''cá khô'''}}
#:{{syn|sed|ká khăng}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá|Thực phẩm}}
ieiaztlyc3p08sbamfaqmx8o894kpqz
limoger
0
55513
2353199
1868258
2026-05-14T15:26:11Z
TheHighFighter2
42988
/* */
2353199
wikitext
text/x-wiki
=={{langname|fr}}==
==={{ĐM|etym}}===
Từ {{affix|fr|Limoges|-er<id:động từ>}}. Trong [[Thế chiến I]], tướng {{w|Joseph Joffre}} (Tổng tư lệnh quân đội Pháp từ năm 1914 đến 1916) thường điều những sĩ quan cấp cao mà ông coi là vô dụng hoặc đã bị cách chức chỉ huy trực tiếp đến vùng [[Limoges]], một nơi nằm cách xa mặt trận. Được chứng thực kể từ năm 1916.
==={{ĐM|pron}}===
* {{fr-IPA|pos=v}}
* {{audio|fr|LL-Q150 (fra)-Lyokoï-limoger.wav|a=<<Pháp>> (<<Lyon>>)}}
* {{audio|fr|LL-Q150 (fra)-Jérémy-Günther-Heinz Jähnick-limoger.wav|a=<<Pháp>> (<<Somain>>)}}
==={{ĐM|verb}}===
{{fr-verb}}
# {{lb|fr|transitive}} [[cách chức|Cách chức]], [[hạ bệ]].
#: {{uxi|fr|'''Limoger''' un incapable|'''cách chức''' một kẻ bất tài}}
#* {{RQ:Proust Temps|volume=7|passage=M<sup>me</sup> Verdurin disait : « C'est désolant, je vais téléphoner à Bontemps de faire le nécessaire pour demain, on a encore « caviardé » toute la fin de l'article de Norpois et simplement parce qu'il laissait entendre qu'on avait « '''limogé''' » Percin. »|t=Bà Verdurin nói: “Thật chán quá, tôi sẽ gọi điện bảo Bontemps lo liệu những việc cần thiết cho ngày mai. Họ lại vừa ‘kiểm duyệt’ toàn bộ đoạn cuối bài viết của Norpois, chỉ đơn giản vì ám chỉ người ta đã ‘'''cách chức'''’ Percin.”}}
#* {{quote-journal|fr|title=Corée du Nord : plusieurs hauts responsables limogés après un «grave incident» lié au Covid-19|trans-title=Triều Tiên: Nhiều quan chức cấp cao bị cách chức sau "sự cố nghiêm trọng" liên quan đến Covid-19|journal=w:Le Figaro|date=June 30, 2021|url=https://www.lefigaro.fr/international/coree-du-nord-plusieurs-hauts-responsables-limoges-apres-un-grave-incident-lie-au-covid-19-20210630|text=Le dirigeant nord-coréen Kim Jong Un a '''limogé''' plusieurs hauts responsables du pays en raison d'un «grave incident» lié à la lutte contre la pandémie de Covid-19, a annoncé mercredi 30 juin l'agence officielle KCNA.|t=Hãng Thông tấn Trung ương Triều Tiên (KCNA) hôm thứ Tư ngày 30 tháng 6 đưa tin, nhà lãnh đạo Kim Jong Un đã '''cách chức''' nhiều quan chức cấp cao của nước này do để xảy ra một 'sự cố nghiêm trọng' liên quan đến công tác phòng chống đại dịch Covid-19.}}
===={{ĐM|conjug}}====
{{fr-conj-auto}}
===={{ĐM|der}}====
* {{l|fr|limogeage}}
==={{ĐM|ref}}===
* {{R:FVDP|db=fv}}
==={{ĐM|further}}===
* {{R:fr:TLFi}}
{{cln|fr|Từ dẫn xuất từ địa danh}}
dt629u9wq9g3asfcuh2oq8hbkuixce2
apparently
0
61820
2353202
1795504
2026-05-14T15:31:57Z
Hiyuune
50834
2353202
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|etym}}===
{{ety|en|:af|apparent|-ly<id:phó từ>|text=+|tree=1}}
==={{section|pron}}===
* {{IPA4|en|/əˈpæɹəntli/|a=RP,AU}}
* {{IPA4|en|/əˈpaɹəntlɪj/|a=SSB}}
* {{IPA4|en|/əˈpæɹəntli/|a=US,nMmmm}}, {{enPR|ə-părʹənt-lē}}
* {{IPA4|en|/əˈpɛɹəntli/|a=US,Mmmm,Canada}}
** {{audio|en|en-us-apparently.ogg|a=US,Mmmm}}
* {{IPA4|en|/əˈpaɾəntle/|a=Scotland}}
* {{IPA4|en|/əˈpaɾəntli/|a=Wales}}
==={{section|adv}}===
{{en-adv}}
# {{lb|en|rare}} [[nhìn|Nhìn]] [[bên ngoài]], [[hình như]].
==={{section|ref}}===
* {{R:FVDP|db=ev}}
29uzr53rggy9r26gju05tnzsjcmdgtk
2353203
2353202
2026-05-14T15:33:03Z
Hiyuune
50834
/* Tham khảo */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353203
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|etym}}===
{{ety|en|:af|apparent|-ly<id:phó từ>|text=+|tree=1}}
==={{section|pron}}===
* {{IPA4|en|/əˈpæɹəntli/|a=RP,AU}}
* {{IPA4|en|/əˈpaɹəntlɪj/|a=SSB}}
* {{IPA4|en|/əˈpæɹəntli/|a=US,nMmmm}}, {{enPR|ə-părʹənt-lē}}
* {{IPA4|en|/əˈpɛɹəntli/|a=US,Mmmm,Canada}}
** {{audio|en|en-us-apparently.ogg|a=US,Mmmm}}
* {{IPA4|en|/əˈpaɾəntle/|a=Scotland}}
* {{IPA4|en|/əˈpaɾəntli/|a=Wales}}
==={{section|adv}}===
{{en-adv}}
# {{lb|en|rare}} [[nhìn|Nhìn]] [[bên ngoài]], [[hình như]].
===={{section|drv}}====
{{col|en|appaz|unapparently}}
==={{section|ref}}===
* {{R:FVDP|db=ev}}
16wpwyjn70vgd6ep9yxdhlx16rpiv74
2353204
2353203
2026-05-14T15:33:15Z
Hiyuune
50834
/* Tham khảo */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353204
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|etym}}===
{{ety|en|:af|apparent|-ly<id:phó từ>|text=+|tree=1}}
==={{section|pron}}===
* {{IPA4|en|/əˈpæɹəntli/|a=RP,AU}}
* {{IPA4|en|/əˈpaɹəntlɪj/|a=SSB}}
* {{IPA4|en|/əˈpæɹəntli/|a=US,nMmmm}}, {{enPR|ə-părʹənt-lē}}
* {{IPA4|en|/əˈpɛɹəntli/|a=US,Mmmm,Canada}}
** {{audio|en|en-us-apparently.ogg|a=US,Mmmm}}
* {{IPA4|en|/əˈpaɾəntle/|a=Scotland}}
* {{IPA4|en|/əˈpaɾəntli/|a=Wales}}
==={{section|adv}}===
{{en-adv}}
# {{lb|en|rare}} [[nhìn|Nhìn]] [[bên ngoài]], [[hình như]].
===={{section|drv}}====
{{col|en|appaz|unapparently}}
==={{section|ref}}===
* {{R:Webster 1913}}
* {{R:OneLook}}
* {{R:FVDP|db=ev}}
66xqbvnoh7ipwedlmys8dqvm02rfy5p
cảm quan
0
93870
2353200
2059805
2026-05-14T15:28:54Z
Hiyuune
50834
2353200
wikitext
text/x-wiki
=={{langname|vi}}==
==={{section|pron}}===
{{vi-pron}}
==={{section|n}}===
{{vi-noun}}
# [[nhận thức|Nhận thức]], [[cảm nhận]] [[trực tiếp]] bằng các [[giác quan]].
#: {{ux|vi|Kiểm tra sản phẩm bằng phương pháp '''cảm quan'''.}}
==={{section|ref}}===
* {{R:Tratu}}
0973w8g3sl15dfsg4i6pl1vfpgxn8g1
紫
0
234870
2353520
2262725
2026-05-15T07:11:20Z
Hiyuune
50834
2353520
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=120|rad=糸|as=06|sn=12|four=21903|canj=YPVIF|ids=⿱此糸}}
===={{ĐM|derived characters}}====
* {{l|mul|[[㗪]] [[橴]] [[䔝]] [[𫄕]] [[𨄐]] [[𥲕]] [[𬈶]] [[𬎏]] [[𬠭]] [[𮬒]]}}
===={{ĐM|ref}}====
* {{Han ref|kx=0919.290|dkj=27337|dj=1350.120|hdz=53392.120|uh=7D2B|ud=32043|bh=B5B5|bd=46517}}
=={{langname|zh}}==
{{zh-forms|alt=紪}}
==={{ĐM|glyph origin}}===
{{Han etyl}}
{{Han compound|此|糸|ls=psc|c1=p|c2=s}}.
==={{ĐM|pron}}===
{{zh-pron
|m=zǐ
|m-s=zi3
|c=zi2
|ca=LL-Q9186-Luilui6666-紫.wav
|c-t=du2
|g=zi3
|h=pfs=chṳ́;hrs=h:ziiˊ;gd=zi3
|j=zi2
|mb=cǔ
|md=ciē
|mn=chí/xm:chú/qz:chír
|mn_note=Hạ Môn, Tuyền Châu: chí - ngôn ngữ bản địa; chú/chír - ngôn ngữ văn chương
|mn-t=zi2
|px=pt,jk,nr,xy,yy,ft:zi3/pt,jk,nr,xy,yy:zo3/ft:zer3
|px_note=zi3 - ngôn ngữ bản địa; zo3/zer3 - ngôn ngữ văn chương
|w=sh:5tsy
|x=zr3
|mc=y
|oc=y
|ma=Zh-zǐ.oga
|cat=a,pn
}}
==={{ĐM|dfn}}===
{{head|zh|hanzi}}
# Màu [[tím]], [[tía]].
# {{surname|zh}}
==={{ĐM|com}}===
{{col3|zh|紫菜|紫丁香|紫紅|紫羅蘭|紫砂|紫檀|紫外線|紫薇|紫藥水|紫雲英|洋紫荊|佩紫懷黃|俯拾青紫|千紅萬紫|大紅大紫|奼紫嫣紅|姚黃魏紫|帶金佩紫|惡紫奪朱|懷金垂紫|懷金拖紫|懷黃佩紫|拖紫垂青|掇青拾紫|朱紫|朱紫難別|東來紫氣|爭紅鬥紫|珥金拖紫|甘紫菜|百紫千紅|碧眼紫髯|碧眼紫鬚|萬紅千紫|萬紫千紅|紅光紫霧|紅得發紫|紅紫亂朱|紆青拖紫|紫塞|紫姑|紫宮|紫宸|紫府|紫式部|紫微|紫微斗數|紫斑病|紫書|紫杉|紫毫|紫氣|紫氣東來|紫水晶|紫河車|紫泥|紫泥封|紫燕|紫玉釵|紫珠|紫瘢|紫砂器|紫砂陶|紫禁|紫禁城|紫竹|紫籜|紫綬金章|紫背草|紫脹|紫臺|紫色|紫色蛙聲|紫芝|紫芝眉宇|紫花地丁|紫茉莉|紫草|紫荊|紫荊花|紫荊關|紫菀|紫菫|紫葛|紫葳|紫藤|紫蘇|紫虛|紫衣|紫袍玉帶|紫貂|紫金山|紫金牛|紫釵記|紫銅|紫闕|紫陌|紫陌紅塵|紫雪|紫雲鄉|紫電|紫駝|紫騮|絳紫|背紫腰金|腰金拖紫|腰金紫綬|腰金衣紫|芥拾青紫|葡萄紫|衣紫腰金|衣紫腰銀|衣紫腰黃|賜紫|迎紫姑|鄒纓齊紫|醬紫|金紫|青牛紫氣|青紫|魏紫姚黃|黃旗紫蓋|黃閣紫樞|龍膽紫|紫金|紫花|紫陽|紫菘|紫水|紫石英|一紫|丹紫|乾道紫|以紫亂朱|以紫為朱|佩紫|借紫|傳龜襲紫|兼朱重紫|兼紫|北紫|吹紫|垂紫|嫣紅奼紫|宮紫|展紫|左紫|慘紫|懷銀紆紫|拖紫|拖金委紫|拖青紆紫|拾紫|拾青紫|斗紫|映山紫|朱紫交競|朱紫相奪|杜紫微|油紫|清都紫府|清都紫微|潑墨紫|爛紫|玉紫|玫瑰紫|甲紫|福嚴紫|端紫|紅紫|紅紫奪朱|紆佩金紫|紆朱拖紫|紆朱曳紫|紆紫|紆金曳紫|紆青佩紫|紫光閣|紫冥|紫叱撥|紫垣|紫墀|紫壇|紫外綫|紫宙|紫巖|紫庭|紫微令|紫微垣|紫微宮|紫微省|紫微舍人|紫微郎|紫徼|紫房|紫摽|紫方館|紫明供奉|紫曆|紫服|紫朱|紫栗|紫極|紫樞|紫機|紫殿|紫水精|紫泉|紫泥書|紫泥海|紫泥詔|紫海|紫淵|紫清|紫渙|紫漢|紫煙|紫狐|紫玉|紫玉函|紫琳腴|紫的|紫皇|紫石|紫石瑛|紫磨|紫穹|紫笑|紫筍|紫紱|紫紺|紫綬|紫縣|紫纓|紫羅囊|紫羅襴|紫羔|紫脫|紫膽|紫舌|紫艾|紫艾綬|紫芝叟|紫芝客|紫芝心|紫芝曲|紫芝書|紫芝歌|紫芝翁|紫芝謠|紫芳|紫芳心|紫芳志|紫英|紫茸|紫荆|紫荊山|紫荷|紫荷囊|紫荷橐|紫菂|紫萱|紫蓋|紫蓋黃旗|紫薇省|紫薇郎|紫蘀|紫衫|紫袍|紫袍金帶|紫褾|紫詔|紫誥|紫貝|紫軑|紫辣子|紫述香|紫都|紫金丹|紫錢|紫閣|紫闈|紫闥|紫降|紫陽書法|紫陽書院|紫陽真人|紫陽花|紫陽觀|紫雪丹|紫雲<t:[[Ziyun]]>|紫霄|紫霞|紫青|紫韁|紫風流|紫餅|紫駝尼|紫駝峰|紫騂|紫鱉|紫鳳|紫鷰|紫鷰騮|紫鸞|紫鹿|紫龜|緋紫|練紫|緹紫|翔麟紫|荷紫|蟬紫|血紫|被朱佩紫|被朱紫|豔紫妖紅|賜紫櫻桃|赤紫|酣紫|釅紫|重金兼紫|金印紫綬|金章紫綬|阿紫|陳家紫|陳紫|露紅煙紫|順聖紫|魏紫|鮮紫|麗紫|黃紫|黃麻紫書|黃麻紫泥|黑紫|鼻青眼紫|齊紫|龜紫|紫堇|紫鷺}}
==={{ĐM|ref}}===
* {{R:yue:Hanzi}}
* {{thcwd|16114}}
* {{R:cpx:PHDB|entry=紫|pp=158}}
{{C|zh|Màu sắc}}
mzxb5v604m5yvoqvy1xnib5v01nhayd
値
0
234981
2353389
2347167
2026-05-15T01:41:58Z
Hiyuune
50834
2353389
wikitext
text/x-wiki
{{also|值|𰁲}}
{{character info}}
=={{langname|mul}}==
{{CJKV-forms|值|值|値|値}}
==={{section|han}}===
{{Han char|rn=9|rad=人|as=08|sn=10|four=|canj=OJBV,XOJBV|ids=⿰亻直}}
===={{section|drv}}====
* {{l|mul|[[𠎟]]}}
===={{section|ref}}====
{{Han ref|kx=0108.150|dkj=00786|dj=0231.050|hdz=10171.081|uh=5024}}
=={{langname|zh}}==
{{zh-see|值|v}}
f8s1zgo3ayrr2yg9c8i5pb1svkz7dko
2353390
2353389
2026-05-15T01:42:18Z
Hiyuune
50834
/* {{section|drv}} */
2353390
wikitext
text/x-wiki
{{also|值|𰁲}}
{{character info}}
=={{langname|mul}}==
{{CJKV-forms|值|值|値|値}}
==={{section|han}}===
{{Han char|rn=9|rad=人|as=08|sn=10|four=|canj=OJBV,XOJBV|ids=⿰亻直}}
===={{section|derived characters}}====
* {{l|mul|[[𠎟]]}}
===={{section|ref}}====
{{Han ref|kx=0108.150|dkj=00786|dj=0231.050|hdz=10171.081|uh=5024}}
=={{langname|zh}}==
{{zh-see|值|v}}
976nncuaaknf3qd6yirrfqnmmsfzi98
Bản mẫu:Chờ xóa
10
238123
2353324
2272280
2026-05-14T18:23:00Z
Kateru Zakuro
34522
2353324
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Unsubst||$B={{#ifexist:Template:db-{{lc:{{{1}}}}}|{{db-{{lc:{{{1}}}}}|1={{{2|}}}|bot={{{bot|}}}|raw={{{raw|}}}|help={{{help|}}}|nocat={{{nocat|}}}|category={{{category|¬}}}}}|
{{db-meta
|bot={{{bot|}}}
|criterion=NA
|1={{#if:{{{1|}}}
| because: {{{1}}}
|, nhưng {{red|không giải thích lý do tại sao}}
}}
|2={{#if:{{{1|}}}
| For valid criteria, see [[Wikipedia:Criteria for speedy deletion|CSD]]| Please ensure that your reason is based on one of the [[Wikipedia:Criteria for speedy deletion|speedy deletion criteria]]. Replace this tag with <code><nowiki>{{db|</nowiki>1=''some reason''<nowiki>}}</nowiki></code>
}}
|note=If no reason for ''speedy'' deletion exists, consider nominating this material through one of the [[Wikipedia:Deletion policy|other deletion processes]].
|temp=db-reason-notice
|temp2={{!}}{{{1|không giải thích lý do tại sao}}}
|summary={{#if:{{{1|}}}|{{{1}}}|}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa|{{PAGENAME}}]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}}}<noinclude>
{{Tài liệu}}
</noinclude>
hwpcdcbi65uk155uq4404r62twpp8ct
2353325
2353324
2026-05-14T18:25:33Z
Kateru Zakuro
34522
2353325
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexist:Bản mẫu:db-{{lc:{{{1}}}}}|{{db-{{lc:{{{1}}}}}|1={{{2|}}}|bot={{{bot|}}}|raw={{{raw|}}}|help={{{help|}}}|nocat={{{nocat|}}}|category={{{category|¬}}}}}|
{{db-meta
|bot={{{bot|}}}
|criterion=NA
|1={{#if:{{{1|}}}
| với lý do: {{{1}}}
|, nhưng {{red|không giải thích lý do tại sao}}
}}
|2={{#if:{{{1|}}}
| Đối với các tiêu chí hợp lệ, hãy xem [[Wiktionary:Quy định xóa trang]]| Vui lòng đảm bảo lý do của bạn dựa trên một trong những [[Wiktionary:Quy định xóa trang|tiêu chí xóa nhanh]]. Thay thế bản mẫu này bằng <code><nowiki>{{Chờ xóa|</nowiki>1=''lý do''<nowiki>}}</nowiki></code>
}}
|note=Nếu không có lý do nào để "xóa nhanh" trang này, hãy cân nhắc đề nghị trang này lên [[Wiktionary:Yêu cầu xóa trang|Yêu cầu xóa trang]].
|temp=db-reason-notice
|temp2={{!}}{{{1|không giải thích lý do tại sao}}}
|summary={{#if:{{{1|}}}|{{{1}}}|}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa|{{PAGENAME}}]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}}}<noinclude>
{{Tài liệu}}
</noinclude>
mp7ygp84wq87zhipepm4grjtdzgnik2
Bản mẫu:@đường sắt
10
240245
2353555
2292420
2026-05-15T09:54:55Z
Kateru Zakuro
34522
2353555
wikitext
text/x-wiki
đường sắt[[Thể loại:Vận tải đường sắt|{{PAGENAME}}]]<noinclude>
[[Thể loại:Bản mẫu @ chuyên ngành|đường sắt]]
[[en:Template:rail transport]]
{{Bản mẫu lỗi thời}}</noinclude>
5zzqd4rli668lyb3a43vjj75n5cviy0
Bản mẫu:Chờ xóa/doc
10
260598
2353327
2272246
2026-05-14T18:28:18Z
Kateru Zakuro
34522
2353327
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 -->
{{shortcut|xóa|db}}
{{Twinkle standard installation}}
Khi gặp một trang mà bạn cho là [[:Wiktionary:Quy định xóa trang#Xóa nhanh|cần xóa nhanh]], bạn có thể đặt bản mẫu này vào trang đó để những [[:Wiktionary:Bảo quản viên|bảo quản viên]] khi kiểm tra [[:Thể loại:Chờ xóa]] có thể biết và xóa giúp bạn.
=== Cách sử dụng ===
<pre>{{Chờ xóa
| 1 = Lý do
}}</pre>
=== Xem thêm ===
* [[:Wiktionary:Quy định xóa trang]]
=== TemplateData ===
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"1": {
"required": true,
"label": "Lý do",
"type": "string",
"description": "Lý do cho rằng trang cần xóa nhanh."
}
},
"description": "Bản mẫu đề nghị trang cần xóa nhanh."
}
</templatedata>
<includeonly>
<!-- THỂ LOẠI VÀ INTERWIKI TẠI ĐÂY, CẢM ƠN -->
[[Thể loại:Bản mẫu xóa trang]]
</includeonly>
bbqzobogq2hpdowhd318d2yiryaq0dz
2353328
2353327
2026-05-14T18:28:37Z
Kateru Zakuro
34522
2353328
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 -->
{{Twinkle standard installation}}
{{shortcut|xóa|db}}
Khi gặp một trang mà bạn cho là [[:Wiktionary:Quy định xóa trang#Xóa nhanh|cần xóa nhanh]], bạn có thể đặt bản mẫu này vào trang đó để những [[:Wiktionary:Bảo quản viên|bảo quản viên]] khi kiểm tra [[:Thể loại:Chờ xóa]] có thể biết và xóa giúp bạn.
=== Cách sử dụng ===
<pre>{{Chờ xóa
| 1 = Lý do
}}</pre>
=== Xem thêm ===
* [[:Wiktionary:Quy định xóa trang]]
=== TemplateData ===
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"1": {
"required": true,
"label": "Lý do",
"type": "string",
"description": "Lý do cho rằng trang cần xóa nhanh."
}
},
"description": "Bản mẫu đề nghị trang cần xóa nhanh."
}
</templatedata>
<includeonly>
<!-- THỂ LOẠI VÀ INTERWIKI TẠI ĐÂY, CẢM ƠN -->
[[Thể loại:Bản mẫu xóa trang]]
</includeonly>
h08lv8v8d2d53qta7sonioqxlneobru
ma'ay
0
265957
2353439
2057035
2026-05-15T03:37:28Z
WhoAlone
40420
2353439
wikitext
text/x-wiki
{{-irk-}}
{{-noun-}}
{{pn}}
# [[nước]].
[[Thể loại:Danh từ tiếng Iraqw]]
{{c|irk|Nước}}
p4r25yf4i1kxox46k03kdr8fyacu48j
Bagʻdod
0
270090
2353516
2071341
2026-05-15T06:58:07Z
Kelly zhrm
58416
2353516
wikitext
text/x-wiki
=={{langname|uz}}==
==={{ĐM|pr-noun}}===
{{head|uz|Danh từ riêng}}
# {{place|uz|thành phố thủ đô|c/Iraq|t1=Baghdad}}
p5nery8rvlyhwn2022uxotyrnwp3mqj
Mô đun:languages/data/3/a
828
270567
2353527
2350455
2026-05-15T07:20:02Z
Hiyuune
50834
2353527
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["aaa"] = {
"tiếng Ghotuo",
35463,
"alv-yek",
"Latn",
"Tiếng Ghotuo",
"Ghotuo",
}
m["aab"] = {
"tiếng Alumu-Tesu",
35034,
"nic-alu",
"Latn",
"Tiếng Alumu-Tesu",
"Alumu-Tesu",
}
m["aac"] = {
"tiếng Ari",
1811224,
"paa-pag",
"Latn",
"Tiếng Ari",
"Ari",
}
m["aad"] = {
"tiếng Amal",
56708,
"paa-iwm",
"Latn",
"Tiếng Amal",
"Amal",
}
-- "aae" IS TREATED AS "sq", SEE WT:LT
m["aaf"] = {
"tiếng Aranadan",
3507928,
"dra-mal",
"Mlym",
"Tiếng Aranadan",
"Aranadan",
translit = {Mlym = "ml-translit"},
}
m["aag"] = {
"tiếng Ambrak",
4741706,
"qfa-tor",
"Latn",
"Tiếng Ambrak",
"Ambrak",
}
m["aah"] = {
"Abu' Arapesh",
4670715,
"qfa-tor",
"Latn",
}
m["aai"] = {
"Arifama-Miniafia",
4790560,
"poz-ocw",
"Latn",
}
m["aak"] = {
"tiếng Ankave",
3446690,
"ngf",
"Latn",
"Tiếng Ankave",
"Ankave",
}
m["aal"] = {
"tiếng Afade",
56434,
"cdc-cbm",
"Latn",
"Tiếng Afade",
"Afade",
}
m["aan"] = {
"Anambé",
3507873,
"tup-gua",
"Latn",
}
m["aap"] = {
"Pará Arára",
56807,
"sai-pek",
"Latn",
}
m["aaq"] = {
"tiếng Đông Abenaki",
3515185,
"alg-abp",
"Latn",
"Tiếng Đông Abenaki",
"Đông Abenaki",
}
m["aas"] = {
"tiếng Aasax",
56620,
"cus-sou",
"Latn",
"Tiếng Aasax",
"Aasax",
}
-- "aat" IS TREATED AS "sq", SEE WT:LT
m["aau"] = {
"tiếng Abau",
3073568,
"paa-spk",
"Latn",
"Tiếng Abau",
"Abau",
}
m["aaw"] = {
"tiếng Solong",
7558834,
"poz-ocw",
"Latn",
"Tiếng Solong",
"Solong",
}
m["aax"] = {
"Mandobo Atas",
12636156,
"ngf",
"Latn",
}
m["aaz"] = {
"tiếng Amarasi",
4740192,
"poz-tim",
"Latn",
"Tiếng Amarasi",
"Amarasi",
}
m["aba"] = {
"Abé",
34833,
"alv-lag",
"Latn",
}
m["abb"] = {
"tiếng Bankon",
34860,
"bnt-bsa",
"Latn",
"Tiếng Bankon",
"Bankon",
}
m["abc"] = {
"Ambala Ayta",
3448896,
"phi",
"Latn",
}
m["abd"] = {
"Camarines Norte Agta",
3399682,
"phi",
"Latn",
}
m["abe"] = {
"tiếng Tây Abenaki",
17502788,
"alg-abp",
"Latn",
"Tiếng Tây Abenaki",
"Tây Abenaki",
}
m["abf"] = {
"Abai Sungai",
4663287,
"poz-san",
"Latn",
}
m["abg"] = {
"tiếng Abaga",
3507954,
"paa-kag",
"Latn",
"Tiếng Abaga",
"Abaga",
}
m["abh"] = {
"tiếng Ả Rập Tajikistan",
56833,
"sem-arb",
"Arab",
"Tiếng Ả Rập Tajikistan",
"Ả Rập Tajikistan",
entry_name = "ar-entryname",
}
m["abi"] = {
"tiếng Abidji",
34781,
"alv-lag",
"Latn",
"Tiếng Abidji",
"Abidji",
}
m["abj"] = {
"Aka-Bea",
2356391,
"qfa-ads",
"Latn",
}
m["abl"] = {
"Abung",
49215,
"poz-lgx",
"Latn",
}
m["abm"] = {
"tiếng Abanyom",
7502,
"nic-eko",
"Latn",
"Tiếng Abanyom",
"Abanyom",
}
m["abn"] = {
"Abua",
34835,
"nic-cde",
"Latn",
}
m["abo"] = {
"tiếng Abon",
35121,
"nic-tvn",
"Latn",
"Tiếng Abon",
"Abon",
}
m["abp"] = {
"Abenlen Ayta",
3436621,
"phi",
"Latn",
}
m["abq"] = {
"tiếng Abaza",
27567,
"cau-abz",
"Cyrl, Latn",
"Tiếng Abaza",
"Abaza",
translit = {Cyrl = "abq-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 = {
Cyrl = {
from = {
"гъв", "гъь", "гӏв", "джв", "джь", "къв", "къь", "кӏв", "кӏь", "хъв", "хӏв", "чӏв", -- 3 chars
"гв", "гъ", "гь", "гӏ", "дж", "дз", "ё", "жв", "жь", "кв", "къ", "кь", "кӏ", "ль", "лӏ", "пӏ", "тл", "тш", "тӏ", "фӏ", "хв", "хъ", "хь", "хӏ", "цӏ", "чв", "чӏ", "шв", "шӏ" -- 2 chars
},
to = {
"г" .. p[3], "г" .. p[4], "г" .. p[7], "д" .. p[2], "д" .. p[3], "к" .. p[3], "к" .. p[4], "к" .. p[7], "к" .. p[8], "х" .. p[3], "х" .. p[6], "ч" .. p[3],
"г" .. p[1], "г" .. p[2], "г" .. p[5], "г" .. p[6], "д" .. p[1], "д" .. p[4], "е" .. p[1], "ж" .. p[1], "ж" .. p[2], "к" .. p[1], "к" .. p[2], "к" .. p[5], "к" .. p[6], "л" .. p[1], "л" .. p[2], "п" .. p[1], "т" .. p[1], "т" .. p[2], "т" .. p[3], "ф" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[4], "х" .. p[5], "ц" .. p[1], "ч" .. p[1], "ч" .. p[2], "ш" .. p[1], "ш" .. p[2]
}
},
},
}
m["abr"] = {
"tiếng Abron",
34831,
"alv-ctn",
"Latn",
"Tiếng Abron",
"Abron",
ancestors = "ak",
}
m["abs"] = {
"tiếng Mã Lai Ambon",
3124354,
"crp",
"Latn",
"Tiếng Mã Lai Ambon",
"Mã Lai Ambon",
ancestors = "ms",
}
m["abt"] = {
"tiếng Ambulas",
3508015,
"paa-spk",
"Latn",
"Tiếng Ambulas",
"Ambulas",
}
m["abu"] = {
"tiếng Abure",
34767,
"alv-ptn",
"Latn",
"Tiếng Abure",
"Abure",
}
m["abv"] = {
"Baharna Arabic",
56576,
"sem-arb",
"Arab",
entry_name = "ar-entryname",
}
m["abw"] = {
"Pal",
7126121,
"ngf-mad",
"Latn",
}
m["abx"] = {
"Inabaknon",
2820163,
"poz-sbj",
"Latn",
}
m["aby"] = {
"Aneme Wake",
3508107,
"ngf",
"Latn",
}
m["abz"] = {
"tiếng Abui",
2822110,
"qfa-tap",
"Latn",
"Tiếng Abui",
"Abui",
}
m["aca"] = {
"tiếng Achawa",
2822982,
"awd",
"Latn",
"Tiếng Achawa",
"Achawa",
}
m["acb"] = {
"Áncá",
11130787,
"nic-mom",
"Latn",
}
m["acd"] = {
"Gikyode",
35256,
"alv-gng",
"Latn",
}
m["ace"] = {
"tiếng Aceh",
27683,
"cmc",
"Latn, ms-Arab",
"Tiếng Aceh",
"Aceh",
standardChars = {
Latn = "AaBbCcDdEeÉéÈèËëFfGgHhIiJjKkLlMmNnOoÔôÖöPpQqRrSsTtUuVvWwXxYyZz", -- current orthography (not yet add Arab)
c.punc
},
}
m["ach"] = {
"tiếng Acholi",
34926,
"sdv-los",
"Latn",
"Tiếng Acholi",
"Acholi",
}
m["aci"] = {
"Aka-Cari",
2670418,
"qfa-adn",
"Latn",
}
m["ack"] = {
"Aka-Kora",
3433680,
"qfa-adn",
"Latn",
}
m["acl"] = {
"Akar-Bale",
3436825,
"qfa-ads",
"Latn",
}
m["acm"] = {
"tiếng Ả Rập Iraq",
56232,
"sem-arb",
"Arab",
"Tiếng Ả Rập Iraq",
"Ả Rập Iraq",
entry_name = "ar-entryname",
}
m["acn"] = {
"tiếng A Xương",
56582,
"tbq-brm",
"Latn",
"Tiếng A Xương",
"A Xương",
}
m["acp"] = {
"tiếng Đông Acipa",
5329945,
"nic-kmk",
"Latn",
"Tiếng Đông Acipa",
"Đông Acipa",
}
m["acr"] = {
"tiếng Achi",
34774,
"myn",
"Latn",
"Tiếng Achi",
"Achi",
}
m["acs"] = {
"Acroá",
2829146,
"sai-cje",
"Latn",
}
m["acu"] = {
"tiếng Achuar",
2823170,
"sai-jiv",
"Latn",
"Tiếng Achuar",
"Achuar",
}
m["acv"] = {
"tiếng Achumawi",
56661,
"nai-pal",
"Latn",
"Tiếng Achumawi",
"Achumawi",
}
m["acw"] = {
"tiếng Ả Rập Hijazi",
56608,
"sem-arb",
"Arab",
"Tiếng Ả Rập Hijazi",
"Ả Rập Hijazi",
entry_name = "ar-entryname",
}
m["acx"] = {
"tiếng Ả Rập Oman",
56630,
"sem-arb",
"Arab",
"Tiếng Ả Rập Oman",
"Ả Rập Oman",
entry_name = "ar-entryname",
}
m["acy"] = {
"tiếng Ả Rập Síp",
56416,
"sem-arb",
"Latn, Grek",
"Tiếng Ả Rập Síp",
"Ả Rập Síp",
ancestors = "acm",
standardChars = {
Latn = "AaBbCcDdΔδEeFfGgĠġĊċIiJjKkLlMmNnOoPpΘθRrSsTtUuVvWwXxYyZzŞş",
c.punc
},
entry_name = {remove_diacritics = c.grave .. c.acute .. c.breve},
}
m["acz"] = {
"tiếng Acheron",
34769,
"alv-tal",
"Latn",
"Tiếng Acheron",
"Acheron",
}
m["ada"] = {
"tiếng Adangme",
35141,
"alv-gda",
"Latn",
"Tiếng Adangme",
"Adangme",
}
m["adb"] = { -- rename or remove, see RFM
"Adabe",
36872,
nil,
"Latn",
}
m["add"] = {
"Dzodinka",
35266,
"nic-nka",
"Latn",
}
m["ade"] = {
"Adele",
27740,
"alv-ntg",
"Latn",
}
m["adf"] = {
"Dhofari Arabic",
56565,
"sem-arb",
"Arab",
entry_name = "ar-entryname",
}
m["adg"] = {
"Andegerebinha",
3508123,
"aus-pam",
"Latn",
}
m["adh"] = {
"Adhola",
1971400,
"sdv-los",
"Latn",
}
m["adi"] = {
"tiếng Adi",
56440,
"sit-tan",
"Latn",
"Tiếng Adi",
"Adi",
}
m["adj"] = {
"Adioukrou",
34738,
"alv-lag",
"Latn",
}
m["adl"] = {
"tiếng Galo",
2857892,
"sit-tan",
"Latn",
"Tiếng Galo",
"Galo",
}
m["adn"] = {
"Adang",
3398276,
"qfa-tap",
"Latn",
}
m["ado"] = {
"Abu",
56659,
"paa-ram",
"Latn",
}
m["adp"] = {
"Adap",
3512402,
"sit-tib",
"Tibt",
ancestors = "dz",
translit = "Tibt-translit",
override_translit = true,
display_text = s["Tibt-displaytext"],
entry_name = s["Tibt-entryname"],
sort_key = "Tibt-sortkey",
wikipedia_article = "Dzongkha", -- Considered a dialect of Dzongkha
}
m["adq"] = {
"Adangbe",
34730,
"alv-gda",
"Latn",
ancestors = "ada",
}
m["adr"] = {
"Adonara",
4684505,
"poz-cet",
"Latn",
}
m["ads"] = {
"Adamorobe Sign Language",
27709,
"sgn",
"Latn", -- when documented
}
m["adt"] = {
"tiếng Adnyamathanha",
2225391,
"aus-psw",
"Latn",
"Tiếng Adnyamathanha",
"Adnyamathanha",
}
m["adu"] = {
"Aduge",
34734,
"alv-nwd",
"Latn",
ancestors = "opa",
wikipedia_article = "Okpamheri language",
}
m["adw"] = {
"Amondawa",
12626847,
"tup-gua",
"Latn",
}
m["ady"] = {
"tiếng Adygea",
27776,
"cau-cir",
"Cyrl, Latn, Arab",
"Tiếng Adygea",
"Adygea",
translit = {
Cyrl = "cau-cir-translit",
Arab = "ar-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 = {
Cyrl = {
from = {
"кхъу", "къӏу", -- 4 chars
"гъу", "джу", "дзу", "жъу", "къу", "кхъ", "къӏ", "кӏу", "кӏь", "лъу", "лӏу", "пӏу", "сӏу", "тӏу", "фӏу", "хъу", "цӏу", "чъу", "чӏу", "шъу", "шӏу", "щӏу", -- 3 chars
"гу", "гъ", "гь", "дж", "дз", "ё", "жъ", "жь", "ку", "къ", "кь", "кӏ", "лъ", "ль", "лӏ", "пӏ", "сӏ", "тӏ", "фӏ", "ху", "хъ", "хь", "цу", "цӏ", "чу", "чъ", "чӏ", "шъ", "шӏ", "щӏ", "ӏу", "ӏь" -- 2 chars
},
to = {
"к" .. p[5], "к" .. p[7],
"г" .. p[3], "д" .. p[2], "д" .. p[4], "ж" .. p[2], "к" .. p[3], "к" .. p[4], "к" .. p[6], "к" .. p[10], "к" .. p[11], "л" .. p[2], "л" .. p[5], "п" .. p[2], "с" .. p[2], "т" .. p[2], "ф" .. p[2], "х" .. p[3], "ц" .. p[3], "ч" .. p[3], "ч" .. p[5], "ш" .. p[2], "ш" .. p[4], "щ" .. p[2],
"г" .. p[1], "г" .. p[2], "г" .. p[4], "д" .. p[1], "д" .. p[3], "е" .. p[1], "ж" .. p[1], "ж" .. p[3], "к" .. p[1], "к" .. p[2], "к" .. p[8], "к" .. p[9], "л" .. p[1], "л" .. p[3], "л" .. p[4], "п" .. p[1], "с" .. p[1], "т" .. p[1], "ф" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[4], "ц" .. p[1], "ц" .. p[2], "ч" .. p[1], "ч" .. p[2], "ч" .. p[4], "ш" .. p[1], "ш" .. p[3], "щ" .. p[1], "ӏ" .. p[1], "ӏ" .. p[2]
}
},
},
}
m["adz"] = {
"tiếng Adzera",
nil,
"poz-ocw",
"Latn",
"Tiếng Adzera",
"Adzera",
}
m["aea"] = {
"Areba",
3509129,
"aus-pam",
"Latn",
}
m["aeb"] = {
"Tunisian Arabic",
56240,
"sem-arb",
"Arab",
entry_name = "ar-entryname",
}
m["aed"] = {
"Argentine Sign Language",
3322073,
"sgn",
"Latn", -- when documented
}
m["aee"] = {
"Northeast Pashayi",
12642198,
"inc-pas",
"fa-Arab, Latn",
}
m["aek"] = {
"Haeke",
5638166,
"poz-cln",
"Latn",
}
m["ael"] = {
"Ambele",
34818,
"nic-grf",
"Latn",
}
m["aem"] = {
"tiếng Arem",
3507920,
"mkh-vie",
"Latn",
"Tiếng Arem",
"Arem",
}
m["aen"] = {
"Armenian Sign Language",
3446604,
"sgn",
}
m["aeq"] = {
"tiếng Aer",
3246741,
"inc-wes",
"Arab",
"Tiếng Aer",
"Aer",
}
m["aer"] = {
"tiếng Arrernte Đông",
10728232,
"aus-pam",
"Latn",
"Tiếng Arrernte Đông",
"Arrernte Đông",
}
m["aes"] = {
"tiếng Alsea",
2395641,
nil,
"Latn",
"Tiếng Alsea",
"Alsea",
}
m["aeu"] = {
"Akeu",
4700657,
"tbq-sil",
"Latn",
}
m["aew"] = {
"Ambakich",
56642,
"paa-ram",
"Latn",
}
m["aey"] = {
"Amele",
3508025,
"ngf-mad",
"Latn",
}
m["aez"] = {
"Aeka",
16110528,
"ngf",
"Latn",
wikipedia_article = "Orokaiva language", -- subvariety?
}
m["afb"] = {
"tiếng Ả Rập vùng Vịnh",
56385,
"sem-arb",
"Arab",
"Tiếng Ả Rập vùng Vịnh",
"Ả Rập vùng Vịnh",
entry_name = "ar-entryname",
}
m["afd"] = {
"Andai",
4753480,
"paa-arf",
"Latn",
}
m["afe"] = {
"Putukwam",
3914930,
"nic-ben",
"Latn",
}
m["afg"] = {
"Afghan Sign Language",
4689093,
"sgn",
}
m["afh"] = {
"Afrihili",
384707,
"art",
"Latn",
type = "appendix-constructed",
}
m["afi"] = {
"Akrukay",
57003,
"paa-ram",
"Latn",
}
m["afk"] = {
"Nanubae",
6964416,
"paa-arf",
"Latn",
}
m["afn"] = {
"Defaka",
35174,
"nic",
"Latn",
}
m["afo"] = {
"Eloyi",
3914066,
"nic-plt",
"Latn",
}
m["afp"] = {
"Tapei",
16887371,
"paa-arf",
"Latn",
}
m["afs"] = {
"Afro-Seminole Creole",
27867,
"crp",
"Latn",
ancestors = "en",
}
m["aft"] = {
"Afitti",
3400829,
"sdv-nyi",
"Latn",
}
m["afu"] = {
"Awutu",
34847,
"alv-gng",
"Latn",
}
m["afz"] = {
"Obokuitai",
7075258,
"paa-lkp",
"Latn",
}
m["aga"] = {
"Aguano",
3331203,
nil,
"Latn",
}
m["agb"] = {
"Legbo",
35584,
"nic-uce",
"Latn",
}
m["agc"] = {
"tiếng Agatu",
34732,
"alv-ido",
"Latn",
"Tiếng Agatu",
"Agatu",
}
m["agd"] = {
"Agarabi",
3399642,
"paa-kag",
"Latn",
}
m["age"] = {
"Angal",
10951553,
"paa-eng",
"Latn",
}
m["agf"] = {
"Arguni",
12473346,
"poz-cet",
"Latn",
}
m["agg"] = {
"Angor",
3508100,
"paa",
"Latn",
}
m["agh"] = {
"Ngelima",
7022266,
"bnt-bta",
"Latn",
}
m["agi"] = {
"Agariya",
663586,
"mun",
"Deva",
}
m["agj"] = {
"tiếng Argobba",
29292,
"sem-eth",
"Ethi",
"Tiếng Argobba",
"Argobba",
}
m["agk"] = {
"Isarog Agta",
6078982,
"phi",
"Latn",
}
m["agl"] = {
"Fembe",
372927,
"ngf",
"Latn",
}
m["agm"] = {
"Angaataha",
3508001,
"ngf",
"Latn",
}
m["agn"] = {
"Agutaynen",
3399717,
"phi-kal",
"Latn",
}
m["ago"] = {
"Tainae",
7676186,
"ngf",
"Latn",
}
m["agq"] = {
"tiếng Aghem",
34737,
"nic-rnw",
"Latn",
"Tiếng Aghem",
"Aghem",
}
m["agr"] = {
"Aguaruna",
1526530,
"sai-jiv",
"Latn",
"Tiếng Aguaruna",
"Aguaruna",
}
m["ags"] = {
"tiếng Esimbi",
35260,
"nic-bds",
"Latn",
"Tiếng Esimbi",
"Esimbi",
}
m["agt"] = {
"Central Cagayan Agta",
5017296,
"phi",
"Latn",
}
m["agu"] = {
"tiếng Aguacateca",
35091,
"myn",
"Latn",
"Tiếng Aguacateca",
"Aguacateca",
}
m["agv"] = {
"Remontado Agta",
3508085,
"phi",
"Latn",
}
m["agw"] = {
"Kahua",
3191906,
"poz-sls",
"Latn",
}
m["agx"] = {
"tiếng Aghul",
36498,
"cau-esm",
"Cyrl",
"Tiếng Aghul",
"Aghul",
translit = "cau-nec-translit",
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {Cyrl = s["cau-Cyrl-entryname"]},
sort_key = {
from = {"аь", "гъ", "гь", "гӏ", "дж", "ё", "къ", "кь", "кӏ", "оь", "пӏ", "тӏ", "уь", "хъ", "хь", "хӏ", "цӏ", "чӏ"},
to = {"а" .. p[1], "г" .. p[1], "г" .. p[2], "г" .. p[3], "д" .. p[1], "е" .. p[1], "к" .. p[1], "к" .. p[2], "к" .. p[3], "о" .. p[1], "п" .. p[1], "т" .. p[1], "у" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[3], "ц" .. p[1], "ч" .. p[1]}
},
}
m["agy"] = {
"Southern Alta",
7569611,
"phi",
"Latn",
}
m["agz"] = {
"Mount Iriga Agta",
6921432,
"phi",
"Latn",
}
m["aha"] = {
"Ahanta",
34729,
"alv-ctn",
"Latn",
}
m["ahb"] = {
"Axamb",
2874710,
"poz-vnc",
"Latn",
}
m["ahg"] = {
"tiếng Qimant",
35663,
"cus-cen",
"Latn",
"Tiếng Qimant",
"Qimant",
}
m["ahh"] = {
"Aghu",
3436645,
"ngf",
"Latn",
}
m["ahi"] = {
"Tiagbamrin Aizi",
3400073,
"kro-aiz",
"Latn",
}
m["ahk"] = {
"tiếng Akha",
56643,
"tbq-han",
"Latn, Mymr, Thai",
"Tiếng Akha",
"Akha",
sort_key = {
Thai = {
from = {"[%pๆ]", "[็-๎]", "([เแโใไ])([ก-ฮ])"},
to = {"", "", "%2%1"}
},
},
}
m["ahl"] = {
"Igo",
35412,
"alv-ktg",
"Latn",
}
m["ahm"] = {
"Mobumrin Aizi",
35967,
"kro-aiz",
"Latn",
}
m["ahn"] = {
"Àhàn",
34723,
"alv-aah",
"Latn",
}
m["aho"] = {
"tiếng Ahom",
34778,
"tai-swe",
"Ahom",
"Tiếng Ahom",
"Ahom",
translit = "Ahom-translit",
}
m["ahp"] = {
"Aproumu Aizi",
34810,
"alv-kwa",
"Latn",
}
m["ahr"] = {
"Ahirani",
15549890,
"inc-wes",
"Deva",
translit = "mr-translit",
}
m["ahs"] = {
"Ashe",
34823,
"nic-plc",
"Latn",
}
m["aht"] = {
"tiếng Ahtna",
21058,
"ath-nor",
"Latn",
"Tiếng Ahtna",
"Ahtna",
}
m["aia"] = {
"Arosi",
2863483,
"poz-sls",
"Latn",
}
m["aib"] = {
"tiếng Äynu",
27927,
"qfa-mix",
"Arab, Latn",
"Tiếng Äynu",
"Äynu",
ancestors = "ug, fa"
}
m["aic"] = {
"Ainbai",
3332149,
"paa-brd",
"Latn",
}
m["aid"] = {
"Alngith",
3279409,
"aus-pmn",
"Latn",
}
m["aie"] = {
"Amara",
2841180,
"poz-ocw",
"Latn",
}
m["aif"] = {
"Agi",
3331491,
"qfa-tor",
"Latn",
}
m["aig"] = {
"Antigua and Barbuda Creole English",
3244184,
"crp",
"Latn",
ancestors = "en",
}
m["aih"] = {
"Ai-Cham",
2827749,
"qfa-kms",
"Latn, Hani",
sort_key = {Hani = "Hani-sortkey"},
}
m["aii"] = {
"tiếng Tân Aram Assyria",
29440,
"sem-nna",
"Syrc, Cyrl",
"Tiếng Tân Aram Assyria",
"Tân Aram Assyria",
translit = {Syrc = "aii-translit"},
entry_name = "Syrc-entryname",
}
m["aij"] = {
"tiếng Lishanid Noshan",
3436467,
"sem-nna",
"Hebr",
"Tiếng Lishanid Noshan",
"Lishanid Noshan",
}
m["aik"] = {
"Ake",
34808,
"nic-pls",
"Latn",
}
m["ail"] = {
"Aimele",
3327418,
"ngf",
"Latn",
}
m["aim"] = {
"tiếng Aimol",
4697175,
"tbq-kuk",
"Latn, Beng",
"Tiếng Aimol",
"Aimol",
}
m["ain"] = {
"tiếng Ainu",
27969,
"qfa-ain",
"Kana, Latn, Cyrl",
"Tiếng Ainu",
"Ainu",
sort_key = {Kana = "Kana-sortkey"},
}
m["aio"] = {
"tiếng Aiton",
3399725,
"tai-swe",
"Mymr",
"Tiếng Aiton",
"Aiton",
translit = "aio-phk-translit",
entry_name = {remove_diacritics = c.VS01},
}
m["aip"] = {
"Burumakok",
5000984,
"ngf-okk",
"Latn",
}
m["air"] = {
"Airoran",
3321131,
"paa-tkw",
"Latn",
}
m["ait"] = {
"Arikem",
3446679,
"tup",
"Latn",
}
m["aiw"] = {
"tiếng Aari",
7495,
"omv-aro",
"Latn, Ethi",
"Tiếng Aari",
"Aari",
}
m["aix"] = {
"Aighon",
3504287,
"poz-ocw",
"Latn",
}
m["aiy"] = {
"Ali",
34814,
"alv-gbf",
"Latn",
}
m["aja"] = {
"Aja",
3237491,
"csu-bkr",
"Latn",
}
m["ajg"] = {
"tiếng Adja",
35035,
"alv-gbe",
"Latn",
"Tiếng Adja",
"Adja",
}
m["aji"] = {
"tiếng Ajië",
2828867,
"poz-cln",
"Latn",
"Tiếng Ajië",
"Ajië",
}
m["ajn"] = {
"Andajin",
16111302,
"aus-wor",
"Latn",
}
m["ajp"] = {
"tiếng Ả Rập Nam Levant",
nil,
"sem-arb",
"Arab",
"Tiếng Ả Rập Nam Levant",
"Ả Rập Nam Levant",
entry_name = "ar-entryname",
}
m["ajw"] = {
"Ajawa",
56645,
"cdc-wst",
"Latn",
}
m["ajz"] = {
"Amri Karbi",
3508092,
"tbq-kuk",
"Latn",
ancestors = "mjw",
}
m["akb"] = {
"Angkola Batak",
2640686,
"btk",
"Latn, Batk",
}
m["akc"] = {
"Mpur",
3327139,
"paa-wpa",
"Latn",
}
m["akd"] = {
"Ukpet-Ehom",
36618,
"nic-ucr",
"Latn",
}
m["ake"] = {
"tiếng Akawaio",
28059,
"sai-pem",
"Latn",
"Tiếng Akawaio",
"Akawaio",
}
m["akf"] = {
"Akpa",
34801,
"alv-ido",
"Latn",
}
m["akg"] = {
"Anakalangu",
4750964,
"poz-cet",
"Latn",
}
m["akh"] = {
"Angal Heneng",
10950354,
"paa-eng",
"Latn",
}
m["aki"] = {
"Aiome",
56735,
"paa",
"Latn",
}
m["akj"] = {
"tiếng Aka-Jeru",
2919121,
"qfa-adn",
"Latn, Deva",
"Tiếng Aka-Jeru",
"Aka-Jeru",
}
m["akk"] = {
"tiếng Akkad",
35518,
"sem-eas",
"Xsux, Latn",
"Tiếng Akkad",
"Akkad",
}
m["akl"] = {
"tiếng Aklanon",
8773,
"phi",
"Latn",
"Tiếng Aklanon",
"Aklanon",
ancestors = "poz-pro,phi-pro",
}
m["akm"] = {
"tiếng Aka-Bo",
35361,
"qfa-adn",
"Latn",
"Tiếng Aka-Bo",
"Aka-Bo",
}
m["ako"] = {
"Akurio",
56650,
"sai-tar",
"Latn",
}
m["akp"] = {
"tiếng Siwu",
36470,
"alv-ntg",
"Latn",
"Tiếng Siwu",
"Siwu",
}
m["akq"] = {
"Ak",
56654,
"paa",
"Latn",
}
m["akr"] = {
"tiếng Araki",
2699882,
"poz-vnc",
"Latn",
"Tiếng Araki",
"Araki",
}
m["aks"] = {
"tiếng Akaselem",
34817,
"nic-grm",
"Latn",
"Tiếng Akaselem",
"Akaselem",
}
m["akt"] = {
"Akolet",
3330162,
"poz-ocw",
"Latn",
}
m["aku"] = {
"Akum",
34799,
"nic-ykb",
"Latn",
}
m["akv"] = {
"tiếng Akhvakh",
56423,
"cau-and",
"Cyrl",
"Tiếng Akhvakh",
"Akhvakh",
translit = "cau-nec-translit",
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {Cyrl = s["cau-Cyrl-entryname"]},
}
m["akw"] = {
"Akwa",
34802,
"bnt-mbo",
"Latn",
}
m["akx"] = {
"tiếng Aka-Kede",
3436816,
"qfa-adc",
"Latn",
"Tiếng Aka-Kede",
"Aka-Kede",
}
m["aky"] = {
"Aka-Kol",
3436784,
"qfa-adc",
"Latn",
}
m["akz"] = {
"tiếng Alabama",
1815020,
"nai-mus",
"Latn",
"Tiếng Alabama",
"Alabama",
}
m["ala"] = {
"Alago",
34813,
"alv-ido",
"Latn",
}
m["alc"] = {
"tiếng Kawésqar",
56544,
"aqa",
"Latn",
"Tiếng Kawésqar",
"Kawésqar",
}
m["ald"] = {
"Alladian",
34837,
"alv-lag",
"Latn",
}
m["ale"] = {
"tiếng Aleut",
27210,
"esx",
"Latn, Cyrl",
"Tiếng Aleut",
"Aleut",
}
m["alf"] = {
"Alege",
34815,
"nic-ben",
"Latn",
}
m["alh"] = {
"tiếng Alawa",
2147917,
"aus-gun",
"Latn",
"Tiếng Alawa",
"Alawa",
}
m["ali"] = {
"tiếng Amaimon",
3327427,
"ngf-mad",
"Latn",
"Tiếng Amaimon",
"Amaimon",
}
m["alj"] = {
"tiếng Alangan",
3327423,
"phi",
"Latn",
"Tiếng Alangan",
"Alangan",
}
m["alk"] = {
"tiếng Alak",
2714690,
"mkh",
"Latn",
"Tiếng Alak",
"Alak"
}
m["all"] = {
"tiếng Allar",
3393634,
"dra-mal",
"Mlym",
"Tiếng Allar",
"Allar",
translit = "ml-translit"
}
-- "aln" IS TREATED AS "sq", SEE WT:LT
m["alm"] = {
"Amblong",
11022615,
"poz-vnc",
"Latn",
}
m["alo"] = {
"Larike-Wakasihu",
3217929,
"poz-cma",
"Latn",
}
m["alp"] = {
"Alune",
3327367,
"poz-cet",
"Latn",
}
m["alq"] = {
"tiếng Algonquin",
28092,
"alg",
"Latn",
"Tiếng Algonquin",
"Algonquin",
ancestors = "oj",
}
m["alr"] = {
"tiếng Alutor",
28213,
"qfa-ckn",
"Cyrl",
"Tiếng Alutor",
"Alutor",
entry_name = {
from = {"['’]"},
to = {"ʼ"}
},
sort_key = {
from = {"вʼ", "гʼ", "ғ", "ә", "ё", "ӄ", "ӈ"},
to = {"в" .. p[1], "г" .. p[1], "г" .. p[2], "е" .. p[1], "е" .. p[2], "к" .. p[1], "н" .. p[1]}
},
}
m["alt"] = {
"tiếng Nam Altai",
1991779,
"trk-kkp",
"Cyrl",
"Tiếng Nam Altai",
"Nam Altai",
translit = "Altai-translit",
sort_key = {
from = {"ј", "ё", "ҥ", "ӧ", "ӱ"},
to = {"д" .. p[1], "е" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1]}
},
}
m["alu"] = {
"tiếng 'Are'are",
5160,
"poz-sls",
"Latn",
"Tiếng 'Are'are",
"'Are'are",
}
m["alw"] = {
"tiếng Alaba-K’abeena",
56652,
"cus-hec",
"Latn, Ethi",
"Tiếng Alaba-K’abeena",
"Alaba-K’abeena",
}
m["alx"] = {
"Amol",
3504260,
"qfa-tor",
"Latn",
}
m["aly"] = {
"Alyawarr",
3327389,
"aus-pam",
"Latn",
}
m["alz"] = {
"Alur",
56507,
"sdv-los",
"Latn",
}
m["ama"] = {
"Amanayé",
3508053,
"tup-gua",
"Latn",
}
m["amb"] = {
"Ambo",
3450142,
"nic-tvn",
"Latn",
}
m["amc"] = {
"tiếng Amahuaca",
2669150,
"sai-pan",
"Latn",
"Tiếng Amahuaca",
"Amahuaca",
}
m["ame"] = {
"Yanesha'",
3088540,
"awd",
"Latn",
}
m["amf"] = {
"tiếng Hamer-Banna",
35764,
"omv-aro",
"Latn, Ethi",
"Tiếng Hamer-Banna",
"Hamer-Banna",
}
m["amg"] = {
"tiếng Amurdag",
3360016,
"aus-wdj",
"Latn",
"Tiếng Amurdag",
"Amurdag",
}
m["ami"] = {
"tiếng Amis",
35132,
"map",
"Latn",
"Tiếng Amis",
"Amis",
}
m["amj"] = {
"tiếng Amdang",
28335,
"ssa-fur",
"Latn",
"Tiếng Amdang",
"Amdang",
}
m["amk"] = {
"tiếng Ambai",
1875885,
"poz-hce",
"Latn",
"Tiếng Ambai",
"Ambai",
}
m["aml"] = {
"tiếng War-Jaintia",
56321,
"aav-khs",
"Latn",
"Tiếng War-Jaintia",
"War-Jaintia",
}
m["amm"] = {
"tiếng Ama",
3446626,
"qfa-mal",
"Latn",
"Tiếng Ama",
"Ama",
}
m["amn"] = {
"tiếng Amanab",
3327399,
"paa-brd",
"Latn",
"Tiếng Amanab",
"Amanab",
}
m["amo"] = {
"Amo",
34826,
"nic-kne",
"Latn",
}
m["amp"] = {
"tiếng Alamblak",
56688,
"paa",
"Latn",
"Tiếng Alamblak",
"Alamblak",
}
m["amq"] = {
"Amahai",
3327384,
"poz-cma",
"Latn",
}
m["amr"] = {
"Amarakaeri",
35128,
"sai-har",
"Latn",
}
m["ams"] = {
"tiếng Nam Amami Ōshima",
2840986,
"jpx-nry",
"Jpan",
"Tiếng Nam Amami Ōshima",
"Nam Amami Ōshima",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
entry_name = s["jpx-entryname"],
sort_key = s["jpx-sortkey"],
}
m["amt"] = {
"Amto",
56517,
"paa-asa",
"Latn",
}
m["amu"] = {
"tiếng Amuzgo",
3501942,
"omq",
"Latn",
"Tiếng Amuzgo",
"Amuzgo",
}
m["amv"] = {
"Ambelau",
2669214,
"poz-cma",
"Latn",
}
m["amw"] = {
"tiếng Tân Aram Tây",
34226,
"sem-arw",
"Armi, Syrc, Latn",
"Tiếng Tân Aram Tây",
"Tân Aram Tây",
entry_name = {Syrc = "Syrc-entryname"},
}
m["amx"] = {
"Anmatyerre",
10412317,
"aus-pam",
"Latn",
}
m["amy"] = {
"Ami",
12626835,
"aus-dal",
"Latn",
}
m["amz"] = {
"Atampaya",
3446651,
"aus-pam",
"Latn",
}
m["ana"] = {
"Andaqui",
2846078,
nil,
"Latn",
}
m["anb"] = {
"Andoa",
2846171,
"sai-zap",
"Latn",
}
m["anc"] = {
"tiếng Ngas",
35999,
"cdc-wst",
"Latn",
"Tiếng Ngas",
"Ngas",
}
m["and"] = {
"Ansus",
3513300,
"poz-hce",
"Latn",
}
m["ane"] = {
"tiếng Xârâcùù",
3571097,
"poz-cln",
"Latn",
"Tiếng Xârâcùù",
"Xârâcùù",
}
m["anf"] = {
"Animere",
34783,
"alv-ktg",
"Latn",
}
m["ang"] = {
"tiếng Anh cổ",
42365,
"gmw-ang",
"Latn, Runr",
"Tiếng Anh cổ",
"Anh cổ",
translit = {Runr = "Runr-translit"},
entry_name = {
Latn = {
remove_diacritics = c.acute .. c.macron .. c.dotabove,
from = {"Ƿ", "ƿ"},
to = {"W", "w"}
},
},
sort_key = {
Latn = {
from = {"æ", "ð", "þ", "ƿ"},
to = {"ae", "t" .. p[1], "t" .. p[2], "w" .. p[1]}
},
},
}
m["anh"] = {
"Nend",
6991554,
"ngf-mad",
"Latn",
}
m["ani"] = {
"tiếng Andi",
34849,
"cau-and",
"Cyrl",
"Tiếng Andi",
"Andi",
translit = "cau-nec-translit",
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {Cyrl = s["cau-Cyrl-entryname"]},
}
m["anj"] = {
"Anor",
56458,
"paa",
"Latn",
}
m["ank"] = {
"Goemai",
35272,
"cdc-wst",
"Latn",
}
m["anl"] = {
"Anu",
4777679,
"sit-mru",
"Latn",
}
m["anm"] = {
"tiếng Anal",
56235,
"tbq-kuk",
"Latn",
"Tiếng Anal",
"Anal",
}
m["ann"] = {
"Obolo",
36614,
"nic-lcr",
"Latn",
}
m["ano"] = {
"Andoque",
2669225,
"qfa-iso",
"Latn",
}
m["anp"] = {
"tiếng Angika",
28378,
"inc-eas",
"Deva",
"Tiếng Angika",
"Angika",
ancestors = "bh",
}
m["anq"] = {
"tiếng Jarawa",
2475526,
"qfa-ong",
"Latn, Deva",
"Tiếng Jarawa",
"Jarawa",
}
m["anr"] = {
"Andh",
4754314,
"inc-sou",
"Deva",
}
m["ans"] = {
"Anserma",
3446613,
"sai-chc",
"Latn",
}
m["ant"] = {
"Antakarinya",
921304,
"aus-psw",
"Latn",
}
m["anu"] = {
"tiếng Anuak",
56677,
"sdv-lon",
"Latn, Ethi",
"Tiếng Anuak",
"Anuak",
}
m["anv"] = {
"Denya",
35187,
"nic-mam",
"Latn",
}
m["anw"] = {
"tiếng Anaang",
2845320,
"nic-ief",
"Latn",
"Tiếng Anaang",
"Anaang",
}
m["anx"] = {
"Andra-Hus",
2846195,
"poz-aay",
"Latn",
}
m["any"] = {
"tiếng Anyi",
28395,
"alv-ctn",
"Latn",
"Tiếng Anyi",
"Anyi",
}
m["anz"] = {
"Anem",
56512,
"paa",
"Latn",
}
m["aoa"] = {
"tiếng Angola",
34994,
"crp",
"Latn",
"Tiếng Angola",
"Angola",
ancestors = "pt",
}
m["aob"] = {
"Abom",
3446647,
"ngf",
"Latn",
}
m["aoc"] = {
"tiếng Pemon",
10729616,
"sai-pem",
"Latn",
"Tiếng Pemon",
"Pemon",
}
m["aod"] = {
"Andarum",
3507888,
"paa",
"Latn",
}
m["aoe"] = {
"Angal Enen",
10951638,
"paa-eng",
"Latn",
}
m["aof"] = {
"Bragat",
3507977,
"qfa-tor",
"Latn",
}
m["aog"] = {
"Angoram",
56366, -- cf 6754745 for merged dialect
"paa-lsp",
"Latn",
}
m["aoi"] = {
"Anindilyakwa",
2714654,
"aus-arn",
"Latn",
}
m["aoj"] = {
"Mufian",
3507881,
"qfa-tor",
"Latn",
}
m["aok"] = {
"Arhö",
4790086,
"poz-cln",
"Latn",
}
m["aol"] = {
"Alor",
3332062,
"poz",
"Latn",
}
m["aom"] = {
"Ömie",
8078975,
"ngf",
"Latn",
}
m["aon"] = {
"Bumbita Arapesh",
3508044,
"qfa-tor",
"Latn",
}
m["aor"] = {
"Aore",
12627129,
"poz-vnc",
"Latn",
}
m["aos"] = {
"Taikat",
7676018,
"paa-brd",
"Latn",
}
m["aot"] = {
"tiếng Atong (Ấn Độ)",
5646,
"tbq-bdg",
"Latn, Beng",
"Tiếng Atong (Ấn Độ)",
"Atong (Ấn Độ)",
}
m["aou"] = {
"tiếng A'ou",
16109994,
"qfa-gel",
"Latn", -- also Hani?
"Tiếng A'ou",
"A'ou",
}
m["aox"] = {
"Atorada",
3507932,
"awd",
"Latn",
}
m["aoz"] = {
"Uab Meto",
3441962,
"poz-tim",
"Latn",
}
m["apb"] = {
"Sa'a",
36294,
"poz-sls",
"Latn",
}
m["apc"] = {
"tiếng Ả Rập Bắc Levant",
22809485,
"sem-arb",
"Arab",
"Tiếng Ả Rập Bắc Levant",
"Ả Rập Bắc Levant",
entry_name = "ar-entryname",
}
m["apd"] = {
"tiếng Ả Rập Sudan",
56573,
"sem-arb",
"Arab",
"Tiếng Ả Rập Sudan",
"Ả Rập Sudan",
entry_name = "ar-entryname",
}
m["ape"] = {
"Bukiyip",
3507895,
"qfa-tor",
"Latn",
}
m["apf"] = {
"Pahanan Agta",
7135432,
"phi",
"Latn",
}
m["apg"] = {
"Ampanang",
4748035,
"poz",
"Latn",
}
m["aph"] = {
"tiếng Athpariya",
3449126,
"sit-kie",
"Deva, Latn",
"Tiếng Athpariya",
"Athpariya",
}
m["api"] = {
"Apiaká",
3507941,
"tup-gua",
"Latn",
}
m["apj"] = {
"tiếng Jicarilla",
28277,
"apa",
"Latn",
"Tiếng Jicarilla",
"Jicarilla",
}
m["apk"] = {
"tiếng Apache đồng bằng",
27861,
"apa",
"Latn",
"Tiếng Apache đồng bằng",
"Apache đồng bằng"
}
m["apl"] = {
"tiếng Lipan",
28269,
"apa",
"Latn",
"Tiếng Lipan",
"Lipan",
}
m["apm"] = {
"tiếng Chiricahua",
13368,
"apa",
"Latn",
"Tiếng Chiricahua",
"Chiricahua",
}
m["apn"] = {
"tiếng Apinayé",
2858311,
"sai-nje",
"Latn",
"Tiếng Apinayé",
"Apinayé",
}
m["apo"] = {
"Ambul",
12627135,
"poz-ocw",
"Latn",
}
m["app"] = {
"Apma",
2669188,
"poz-vnc",
"Latn",
}
m["apq"] = {
"tiếng Pucikwar",
28466,
"qfa-adc",
"Latn",
"Tiếng Pucikwar",
"Pucikwar",
}
m["apr"] = {
"Arop-Lokep",
2863482,
"poz-ocw",
"Latn",
}
m["aps"] = {
"Arop-Sissano",
12627242,
"poz-ocw",
"Latn",
}
m["apt"] = {
"tiếng Apatani",
56306,
"sit-tan",
"Latn",
"Tiếng Apatani",
"Apatani",
}
m["apu"] = {
"Apurinã",
2859081,
"awd",
"Latn",
}
m["apv"] = {
"Alapmunte",
16110782,
"sai-nmk",
"Latn",
}
m["apw"] = {
"tiếng Apache Tây",
28060,
"apa",
"Latn",
"Tiếng Apache Tây",
"Apache Tây",
}
m["apx"] = {
"tiếng Aputai",
12473343,
"poz-tim",
"Latn",
"Tiếng Aputai",
"Aputai",
}
m["apy"] = {
"tiếng Aparaí",
2736980,
"sai-gui",
"Latn",
"Tiếng Aparaí",
"Aparaí",
}
m["apz"] = {
"Safeyoka",
7398693,
"ngf",
"Latn",
}
m["aqc"] = {
"tiếng Archi",
34915,
"cau-lzg",
"Cyrl",
"Tiếng Archi",
"Archi",
translit = "cau-nec-translit",
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {Cyrl = s["cau-Cyrl-entryname"]},
sort_key = {
from = {
"ккъӏв", "ххьӏв", -- 5 chars
"гъӏв", "ёоӏ", "ккъӏ", "ккъв", "къӏв", "ллъв", "ххьӏ", "хъӏв", "хьӏв", "ццӏв", "ччӏв", -- 4 chars
"ааӏ", "гӏв", "гъӏ", "гъв", "гьв", "ееӏ", "ёӏ", "ёо", "ииӏ", "кӏв", "ккв", "ккъ", "къӏ", "къв", "кьв", "лӏв", "ллъ", "лъв", "льв", "ооӏ", "пӏв", "ппв", "ссв", "тӏв", "ттв", "ууӏ", "хӏв", "ххв", "хъӏ", "хъв", "хьӏ", "цӏв", "ццӏ", "ццв", "чӏв", "ччӏ", "ээӏ", "юуӏ", "яаӏ", -- 3 chars
"аӏ", "аа", "гӏ", "гв", "гъ", "гь", "дв", "еӏ", "ее", "ё", "жв", "зв", "иӏ", "ии", "кӏ", "кв", "кк", "къ", "кь", "лӏ", "лв", "лъ", "ль", "оӏ", "оо", "пӏ", "пв", "пп", "св", "сс", "тӏ", "тв", "тт", "уӏ", "уу", "фв", "хӏ", "хв", "хх", "хъ", "цӏ", "цв", "цц", "чӏ", "чв", "шв", "щв", "эӏ", "ээ", "юӏ", "юу", "яӏ", "яа" -- 2 chars
},
to = {
"к" .. p[8], "х" .. p[7],
"г" .. p[6], "е" .. p[7], "к" .. p[7], "к" .. p[9], "к" .. p[12], "л" .. p[5], "х" .. p[6], "х" .. p[10], "х" .. p[13], "ц" .. p[6], "ч" .. p[5],
"а" .. p[3], "г" .. p[2], "г" .. p[5], "г" .. p[7], "г" .. p[9], "е" .. p[3], "е" .. p[5], "е" .. p[6], "и" .. p[3], "к" .. p[2], "к" .. p[5], "к" .. p[6], "к" .. p[11], "к" .. p[13], "к" .. p[15], "л" .. p[2], "л" .. p[4], "л" .. p[7], "л" .. p[9], "о" .. p[3], "п" .. p[2], "п" .. p[5], "с" .. p[3], "т" .. p[2], "т" .. p[5], "у" .. p[3], "х" .. p[2], "х" .. p[5], "х" .. p[9], "х" .. p[11], "х" .. p[12], "ц" .. p[2], "ц" .. p[5], "ц" .. p[7], "ч" .. p[2], "ч" .. p[4], "э" .. p[3], "ю" .. p[3], "я" .. p[3],
"а" .. p[1], "а" .. p[2], "г" .. p[1], "г" .. p[3], "г" .. p[4], "г" .. p[8], "д" .. p[1], "е" .. p[1], "е" .. p[2], "е" .. p[4], "ж" .. p[1], "з" .. p[1], "и" .. p[1], "и" .. p[2], "к" .. p[1], "к" .. p[3], "к" .. p[4], "к" .. p[10], "к" .. p[14], "л" .. p[1], "л" .. p[3], "л" .. p[6], "л" .. p[8], "о" .. p[1], "о" .. p[2], "п" .. p[1], "п" .. p[3], "п" .. p[4], "с" .. p[1], "с" .. p[2], "т" .. p[1], "т" .. p[3], "т" .. p[4], "у" .. p[1], "у" .. p[2], "ф" .. p[1], "х" .. p[1], "х" .. p[3], "х" .. p[4], "х" .. p[8], "ц" .. p[1], "ц" .. p[3], "ц" .. p[4], "ч" .. p[1], "ч" .. p[3], "ш" .. p[1], "щ" .. p[1], "э" .. p[1], "э" .. p[2], "ю" .. p[1], "ю" .. p[2], "я" .. p[1], "я" .. p[2]
}
},
}
m["aqd"] = {
"Ampari Dogon",
4748057,
"nic-dgw",
"Latn",
}
m["aqg"] = {
"Arigidi",
34829,
"alv-von",
"Latn",
}
m["aqm"] = {
"Atohwaim",
11732297,
"ngf",
"Latn",
}
m["aqn"] = {
"Northern Alta",
7058116,
"phi",
"Latn",
}
m["aqp"] = {
"Atakapa",
10975683,
"qfa-iso",
"Latn",
}
m["aqr"] = {
"Arhâ",
4790085,
"poz-cln",
"Latn",
}
m["aqt"] = {
"Angaité",
15736037,
"sai-mas",
"Latn",
}
m["aqz"] = {
"tiếng Akuntsu",
4701960,
"tup",
"Latn",
"Tiếng Akuntsu",
"Akuntsu",
}
m["arc"] = {
"tiếng Aram",
28602,
"sem-ara",
"Hebr, Armi, Syrc, Palm, Nbat, Phnx, Mand, Samr, Hatr, Elym",
"Tiếng Aram",
"Aram",
translit = {
Armi = "Armi-translit",
Palm = "Palm-translit",
},
entry_name = {
Hebr = {remove_diacritics = u(0x0591) .. "-" .. u(0x05BD) .. u(0x05BF) .. "-" .. u(0x05C5) .. u(0x05C7)},
Syrc = {remove_diacritics = u(0x0730) .. "-" .. u(0x0748)},
remove_diacritics = c.macron .. c.diaer .. c.macronbelow}, -- Which script(s)?
}
m["ard"] = {
"Arabana",
3507959,
"aus-kar",
"Latn",
}
m["are"] = {
"Western Arrernte",
12645549,
"aus-pam",
"Latn",
}
m["arh"] = {
"tiếng Arhuaco",
2640621,
"cba",
"Latn",
"Tiếng Arhuaco",
"Arhuaco",
}
m["ari"] = {
"Arikara",
56539,
"cdd",
"Latn",
}
m["arj"] = {
"Arapaso",
12627166,
"sai-tuc",
"Latn",
}
m["ark"] = {
"Arikapú",
3446640,
"sai-mje",
"Latn",
}
m["arl"] = {
"Arabela",
2591221,
"sai-zap",
"Latn",
}
m["arn"] = {
"tiếng Mapuche",
33730,
"sai-ara",
"Latn",
"Tiếng Mapuche",
"Mapuche",
}
m["aro"] = {
"Araona",
958414,
"sai-tac",
"Latn",
}
m["arp"] = {
"tiếng Arapaho",
56417,
"alg-ara",
"Latn",
"Tiếng Arapaho",
"Arapaho",
}
m["arq"] = {
"tiếng Ả Rập Algérie",
56499,
"sem-arb",
"Arab",
"Tiếng Ả Rập Algérie",
"Ả Rập Algérie",
entry_name = "ar-entryname",
}
m["arr"] = {
"Arara-Karo",
35539,
"tup",
"Latn",
}
m["ars"] = {
"Najdi Arabic",
56574,
"sem-arb",
"Arab",
entry_name = "ar-entryname",
}
m["aru"] = {
"Arua",
2746221,
"auf",
"Latn",
}
m["arv"] = {
"Arbore",
56883,
"cus-eas",
"Latn",
}
m["arw"] = {
"tiếng Lokono",
2655664,
"awd-taa",
"Latn",
"Tiếng Lokono",
"Lokono",
}
m["arx"] = {
"Aruá",
3507907,
"tup",
"Latn",
}
m["ary"] = {
"tiếng Ả Rập Maroc",
56426,
"sem-arb",
"Arab",
"Tiếng Ả Rập Maroc",
"Ả Rập Maroc",
entry_name = "ar-entryname",
sort_key = {
from = {"^%f[" .. u(0x5D0) .. "-" .. u(0x5EA) .. "]"},
to = {u(0xFB21)},
},
}
m["arz"] = {
"tiếng Ả Rập Ai Cập",
29919,
"sem-arb",
"Arab",
"Tiếng Ả Rập Ai Cập",
"Ả Rập Ai Cập",
entry_name = "ar-entryname",
}
m["asa"] = {
"Pare",
36403,
"bnt-par",
"Latn",
}
m["asb"] = {
"tiếng Assiniboine",
2591288,
"sio-dkt",
"Latn",
"Tiếng Assiniboine",
"Assiniboine",
}
m["asc"] = {
"Casuarina Coast Asmat",
11732046,
"ngf",
"Latn",
}
m["ase"] = {
"ngôn ngữ ký hiệu Mỹ",
14759,
"sgn",
"Sgnw",
"Ngôn ngữ ký hiệu Mỹ",
"ngôn ngữ ký hiệu Mỹ",
}
m["asf"] = {
"Auslan",
29525,
"sgn",
"Latn", -- when documented
}
m["asg"] = {
"Cishingini",
35199,
"nic-kam",
"Latn",
}
m["ash"] = {
"Abishira",
2871740,
"qfa-iso",
"Latn",
}
m["asi"] = {
"Buruwai",
5001031,
"ngf",
"Latn",
}
m["asj"] = {
"Nsari",
36418,
"nic-bbe",
"Latn",
}
m["ask"] = {
"tiếng Ashkun",
29379,
"nur-sou",
"Arab, Latn",
"Tiếng Ashkun",
"Ashkun",
}
m["asl"] = {
"Asilulu",
12473347,
"poz-cma",
"Latn",
}
m["asn"] = {
"Xingú Asuriní",
8044571,
"tup-gua",
"Latn",
}
m["aso"] = {
"Dano",
5220979,
"paa-kag",
"Latn",
}
m["asp"] = {
"Algerian Sign Language",
3135421,
"sgn",
}
m["asq"] = {
"Austrian Sign Language",
36668,
"sgn",
"Latn", -- when documented
}
m["asr"] = {
"tiếng Asur",
3504321,
"mun",
"Deva, Latn",
"Tiếng Asur",
"Asur"
}
m["ass"] = {
"Ipulo",
35408,
"nic-tvc",
"Latn",
}
m["ast"] = {
"tiếng Asturias",
29507,
"roa-ibe",
"Latn",
"Tiếng Asturias",
"Asturias",
ancestors = "roa-ole",
}
m["asu"] = {
"Tocantins Asurini",
32041490,
"tup-gua",
"Latn",
}
m["asv"] = {
"Asoa",
56296,
"csu-maa",
"Latn",
}
m["asw"] = {
"Australian Aboriginal Sign Language",
955216,
"sgn",
"Latn", -- when documented
}
m["asx"] = {
"Muratayak",
11732766,
"ngf-fin",
"Latn",
}
m["asy"] = {
"Yaosakor Asmat",
16113158,
"ngf",
"Latn",
}
m["asz"] = {
"As",
2866218,
"poz-hce",
"Latn",
}
m["ata"] = {
"Pele-Ata",
56511,
"paa",
"Latn",
}
m["atb"] = {
"tiếng Zaiwa",
56594,
"tbq-brm",
"Latn, Lisu", -- also Hani?
"Tiếng Zaiwa",
"Zaiwa",
translit = {Lisu = "Lisu-translit"},
sort_key = {Lisu = s["Lisu-sortkey"]},
}
m["atc"] = {
"tiếng Atsahuaca",
4817730,
"sai-pan",
"Latn",
"Tiếng Atsahuaca",
"Atsahuaca",
}
m["atd"] = {
"Ata Manobo",
12627315,
"mno",
"Latn",
}
m["ate"] = {
"tiếng Atemble",
4813055,
"ngf-mad",
"Latn",
"Tiếng Atemble",
"Atemble",
}
m["atg"] = {
"Okpela",
7082551,
"alv-yek",
"Latn",
}
m["ati"] = {
"Attié",
34844,
"alv-lag",
"Latn",
}
m["atj"] = {
"tiếng Atikamekw",
56590,
"alg",
"Latn",
ancestors = "cr",
"Tiếng Atikamekw",
"Atikamekw",
}
m["atk"] = {
"Ati",
4815751,
"phi",
"Latn",
}
m["atl"] = {
"Mount Iraya Agta",
6921430,
"phi",
"Latn",
}
m["atm"] = {
"Ata",
4812603,
"phi",
"Latn",
}
m["ato"] = {
"Atong (Cameroon)",
34824,
"nic-grs",
"Latn",
}
m["atp"] = {
"Pudtol Atta",
12640726,
"phi",
"Latn",
}
m["atq"] = {
"Aralle-Tabulahan",
4783889,
"poz-ssw",
"Latn",
}
m["atr"] = {
"Waimiri-Atroari",
56865,
"sai-car",
"Latn",
}
m["ats"] = {
"Gros Ventre",
56628,
"alg-ara",
"Latn",
}
m["att"] = {
"Pamplona Atta",
12639245,
"phi",
"Latn",
}
m["atu"] = {
"Reel",
7306882,
"sdv-dnu",
"Latn",
}
m["atv"] = {
"tiếng Bắc Altai",
2640863,
"trk-ssb",
"Cyrl",
"Tiếng Bắc Altai",
"Bắc Altai",
translit = "Altai-translit",
}
m["atw"] = {
"Atsugewi",
56718,
"nai-pal",
"Latn",
}
m["atx"] = {
"Arutani",
56609,
nil,
"Latn",
}
m["aty"] = {
"Aneityum",
2379113,
"poz-oce",
"Latn",
}
m["atz"] = {
"Arta",
3508067,
"phi",
"Latn",
}
m["aua"] = {
"tiếng Asumboa",
4811870,
"poz-oce",
"Latn",
"Tiếng Asumboa",
"Asumboa",
}
m["aub"] = {
"Alugu",
12626798,
"tbq-urp",
"Latn", -- also Hani?
}
m["auc"] = {
"Huaorani",
758570,
"qfa-iso",
"Latn",
}
m["aud"] = {
"Anuta",
35326,
"poz-pnp",
"Latn",
}
m["aug"] = {
"Aguna",
34733,
"alv-gbe",
"Latn",
}
m["auh"] = {
"Aushi",
2872082,
"bnt-sbi",
"Latn",
}
m["aui"] = {
"tiếng Anuki",
3508132,
"poz-ocw",
"Latn",
"Tiếng Anuki",
"Anuki",
}
m["auj"] = {
"tiếng Awjila",
56398,
"ber",
"Latn, Arab, Tfng",
"Tiếng Awjila",
"Awjila",
}
m["auk"] = {
"Heyo",
3504295,
"qfa-tor",
"Latn",
}
m["aul"] = {
"Aulua",
427300,
"poz-vnc",
"Latn",
}
m["aum"] = {
"Asu",
34798,
"alv-ngb",
"Latn",
}
m["aun"] = {
"Molmo One",
12637224,
"qfa-tor",
"Latn",
}
m["auo"] = {
"Auyokawa",
56247,
"cdc-wst",
"Latn",
}
m["aup"] = {
"Makayam",
6738863,
"ngf",
"Latn",
}
m["auq"] = {
"Anus",
23855,
"poz-ocw",
"Latn",
}
m["aur"] = {
"Aruek",
3504279,
"qfa-tor",
"Latn",
}
m["aut"] = {
"Austral",
2669261,
"poz-pep",
"Latn",
}
m["auu"] = {
"Auye",
4827334,
"ngf",
"Latn",
}
m["auw"] = {
"Awyi",
3513326,
"paa-brd",
"Latn",
}
m["aux"] = {
"Aurá",
3507995,
"tup-gua",
"Latn",
}
m["auy"] = {
"Auyana",
2873211,
"paa-kag",
"Latn",
}
m["auz"] = {
"tiếng Ả Rập Uzbekistan",
3399507,
"sem-arb",
"Arab",
"Tiếng Ả Rập Uzbekistan",
"Ả Rập Uzbekistan",
entry_name = "ar-entryname",
}
m["avb"] = {
"Avau",
12627412,
"poz-ocw",
"Latn",
}
m["avd"] = {
"Alviri-Vidari",
3327357,
"xme",
"fa-Arab",
ancestors = "xme-mid",
}
m["avi"] = {
"Avikam",
34840,
"alv-lag",
"Latn",
}
m["avk"] = {
"tiếng Kotava",
1377116,
"art",
"Latn",
"Tiếng Kotava",
"Kotava",
type = "appendix-constructed",
}
m["avm"] = {
"Angkamuthi",
nil,
"aus-pmn",
"Latn",
}
m["avn"] = {
"tiếng Avatime",
34796,
"alv-ktg",
"Latn",
"Tiếng Avatime",
"Avatime",
}
m["avo"] = {
"Agavotaguerra",
3508007,
"awd",
"Latn",
}
m["avs"] = {
"Aushiri",
3409318,
"sai-zap",
"Latn",
}
m["avt"] = {
"Au",
3446608,
"qfa-tor",
"Latn",
}
m["avu"] = {
"tiếng Avokaya",
56685,
"csu-mma",
"Latn",
"Tiếng Avokaya",
"Avokaya",
}
m["avv"] = {
"Avá-Canoeiro",
4829584,
"tup-gua",
"Latn",
}
m["awa"] = {
"tiếng Awadh",
29579,
"inc-hie",
"Deva, Kthi, fa-Arab",
"Tiếng Awadh",
"Awadh",
translit = {Deva = "hi-translit"},
}
m["awb"] = {
"Awa (New Guinea)",
2874650,
"paa-kag",
"Latn",
}
m["awc"] = {
"Cicipu",
35193,
"nic-kam",
"Latn",
}
m["awe"] = {
"Awetí",
4830038,
"tup",
"Latn",
}
m["awg"] = {
"Anguthimri",
4764288,
"aus-pam",
"Latn",
}
m["awh"] = {
"Awbono",
3446684,
"ngf",
"Latn",
}
m["awi"] = {
"Aekyom",
3399691,
"ngf",
"Latn",
}
m["awk"] = {
"Awabakal",
3449138,
"aus-pam",
"Latn",
}
m["awm"] = {
"Arawum",
4784537,
"ngf-mad",
"Latn",
}
m["awn"] = {
"tiếng Awngi",
34934,
"cus-cen",
"Ethi",
"Tiếng Awngi",
"Awngi",
}
m["awo"] = {
"Awak",
3446643,
"alv-wjk",
"Latn",
}
m["awr"] = {
"Awera",
56379,
"paa-lkp",
"Latn",
}
m["aws"] = {
"South Awyu",
12633986,
"ngf",
"Latn",
}
m["awt"] = {
"tiếng Araweté",
4784535,
"tup-gua",
"Latn",
"Tiếng Araweté",
"Araweté",
}
m["awu"] = {
"Central Awyu",
12628801,
"ngf",
"Latn",
}
m["awv"] = {
"Jair Awyu",
16110177,
"ngf",
"Latn",
}
m["aww"] = {
"Awun",
56369,
"paa-spk",
"Latn",
}
m["awx"] = {
"Awara",
2874670,
"ngf-fin",
"Latn",
}
m["awy"] = {
"Edera Awyu",
12630425,
"ngf",
"Latn",
}
m["axb"] = {
"Abipon",
11252539,
"sai-guc",
"Latn",
}
m["axe"] = {
"Ayerrerenge",
16112737,
"aus-pam",
"Latn",
}
m["axg"] = {
"Mato Grosso Arára",
3446660,
nil,
"Latn",
}
m["axk"] = {
"Aka (Central Africa)",
11010149,
"bnt-ngn",
"Latn",
}
m["axl"] = {
"Lower Southern Aranda",
6693295,
"aus-pam",
"Latn",
}
m["axm"] = {
"tiếng Armenia trung đại",
4438498,
"hyx",
"Armn",
"Tiếng Armenia trung đại",
"Armenia trung đại",
ancestors = "xcl",
translit = "Armn-translit",
override_translit = true,
entry_name = {
remove_diacritics = "՞՜՛՟",
from = {"եւ"},
to = {"և"}
}
}
m["axx"] = {
"Xaragure",
8045635,
"poz-cln",
"Latn",
}
m["aya"] = {
"Awar",
56876,
"paa",
"Latn",
}
m["ayb"] = {
"Ayizo",
34841,
"alv-pph",
"Latn",
}
m["ayd"] = {
"Ayabadhu",
3509164,
"aus-pmn",
"Latn",
}
m["aye"] = {
"tiếng Ayere",
34788,
"alv-aah",
"Latn",
"Tiếng Ayere",
"Ayere",
}
m["ayg"] = {
"Nyanga (Togo)",
35446,
"alv-gng",
"Latn",
}
m["ayi"] = {
"Leyigha",
3914492,
"nic-uce",
"Latn",
}
m["ayk"] = {
"Akuku",
3450179,
"alv-nwd",
"Latn",
}
m["ayl"] = {
"tiếng Ả Rập Libya",
56503,
"sem-arb",
"Arab",
entry_name = "ar-entryname",
"Tiếng Ả Rập Libya",
"Ả Rập Libya",
}
m["ayn"] = {
"Yemeni Arabic",
1686766,
"sem-arb",
"Arab",
entry_name = "ar-entryname",
}
m["ayo"] = {
"Ayoreo",
56634,
"sai-zam",
"Latn",
}
m["ayp"] = {
"North Mesopotamian Arabic",
56577,
"sem-arb",
"Arab",
ancestors = "acm",
entry_name = "ar-entryname",
}
m["ayq"] = {
"Ayi",
56449,
"paa-spk",
"Latn",
}
m["ays"] = {
"Sorsogon Ayta",
7563752,
"phi",
"Latn",
}
m["ayt"] = {
"Bataan Ayta",
4921648,
"phi",
"Latn",
}
m["ayu"] = {
"Ayu",
34786,
"alv",
"Latn",
}
m["ayy"] = {
"Tayabas Ayta",
7689745,
"phi",
"Latn",
}
m["ayz"] = {
"Maybrat",
4830892,
"paa-wpa",
"Latn",
}
m["aza"] = {
"Azha",
4832486,
"tbq-axi",
"Latn",
}
m["azd"] = {
"Eastern Durango Nahuatl",
16115449,
"azc-nah",
"Latn",
}
m["azg"] = {
"San Pedro Amuzgos Amuzgo",
35092,
"omq",
"Latn",
}
m["azm"] = {
"Ipalapa Amuzgo",
12633013,
"omq",
"Latn",
}
m["azn"] = {
"Western Durango Nahuatl",
12645553,
"azc-nah",
"Latn",
}
m["azo"] = {
"tiếng Awing",
34856,
"nic-nge",
"Latn",
"Tiếng Awing",
"Awing",
}
m["azt"] = {
"Faire Atta",
12630884,
"phi",
"Latn",
}
m["azz"] = {
"Highland Puebla Nahuatl",
12953754,
"azc-nah",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
g5abvubbe3ktzz4iywlnzyx6j6xrp0s
Mô đun:pi-Latn-translit
828
271312
2353229
2079978
2026-05-14T16:12:46Z
咽頭べさ
43598
2353229
Scribunto
text/plain
-- For Lao script, see https://www.unicode.org/charts/PDF/U0E80.pdf (Unicode 12.0+)
local export = {}
local m_str_utils = require("Module:string utilities")
local gmatch = m_str_utils.gmatch
local gsub = m_str_utils.gsub
local lower = m_str_utils.lower
local match = m_str_utils.match
local sub = m_str_utils.sub
local u = m_str_utils.char
local c = {
["Deva"] = {
["k"] = "क", ["kh"] = "ख", ["g"] = "ग", ["gh"] = "घ", ["ṅ"] = "ङ",
["c"] = "च", ["ch"] = "छ", ["j"] = "ज", ["jh"] = "झ", ["ñ"] = "ञ",
["ṭ"] = "ट", ["ṭh"] = "ठ", ["ḍ"] = "ड", ["ḍh"] = "ढ", ["ṇ"] = "ण",
["t"] = "त", ["th"] = "थ", ["d"] = "द", ["dh"] = "ध", ["n"] = "न",
["p"] = "प", ["ph"] = "फ", ["b"] = "ब", ["bh"] = "भ", ["m"] = "म",
["y"] = "य", ["r"] = "र", ["l"] = "ल", ["v"] = "व", ["s"] = "स",
["h"] = "ह", ["ḷ"] = "ळ",
["a"] = "अ", ["ā"] = "आ",
["i"] = "इ", ["ī"] = "ई",
["u"] = "उ", ["ū"] = "ऊ",
["e"] = "ए",
["o"] = "ओ",
["ṃ"] = "ं",
[""] = "",
},
["Beng"] = {
["k"] = "ক", ["kh"] = "খ", ["g"] = "গ", ["gh"] = "ঘ", ["ṅ"] = "ঙ",
["c"] = "চ", ["ch"] = "ছ", ["j"] = "জ", ["jh"] = "ঝ", ["ñ"] = "ঞ",
["ṭ"] = "ট", ["ṭh"] = "ঠ", ["ḍ"] = "ড", ["ḍh"] = "ঢ", ["ṇ"] = "ণ",
["t"] = "ত", ["th"] = "থ", ["d"] = "দ", ["dh"] = "ধ", ["n"] = "ন",
["p"] = "প", ["ph"] = "ফ", ["b"] = "ব", ["bh"] = "ভ", ["m"] = "ম",
["y"] = "য", ["r"] = "র", ["l"] = "ল", ["v"] = "ৰ", ["s"] = "স",
["h"] = "হ", ["ḷ"] = "ল়",
["a"] = "অ", ["ā"] = "আ",
["i"] = "ই", ["ī"] = "ঈ",
["u"] = "উ", ["ū"] = "ঊ",
["e"] = "এ",
["o"] = "ও",
["ṃ"] = "ং",
[""] = "",
},
["Brah"] = {
["k"] = "𑀓", ["kh"] = "𑀔", ["g"] = "𑀕", ["gh"] = "𑀖", ["ṅ"] = "𑀗",
["c"] = "𑀘", ["ch"] = "𑀙", ["j"] = "𑀚", ["jh"] = "𑀛", ["ñ"] = "𑀜",
["ṭ"] = "𑀝", ["ṭh"] = "𑀞", ["ḍ"] = "𑀟", ["ḍh"] = "𑀠", ["ṇ"] = "𑀡",
["t"] = "𑀢", ["th"] = "𑀣", ["d"] = "𑀤", ["dh"] = "𑀥", ["n"] = "𑀦",
["p"] = "𑀧", ["ph"] = "𑀨", ["b"] = "𑀩", ["bh"] = "𑀪", ["m"] = "𑀫",
["y"] = "𑀬", ["r"] = "𑀭", ["l"] = "𑀮", ["v"] = "𑀯", ["s"] = "𑀲",
["h"] = "𑀳", ["ḷ"] = "𑀴",
["a"] = "𑀅", ["ā"] = "𑀆",
["i"] = "𑀇", ["ī"] = "𑀈",
["u"] = "𑀉", ["ū"] = "𑀊",
["e"] = "𑀏",
["o"] = "𑀑",
["ṃ"] = "𑀁",
[""] = "",
},
["Khmr"] = {
["k"] = "ក", ["kh"] = "ខ", ["g"] = "គ", ["gh"] = "ឃ", ["ṅ"] = "ង",
["c"] = "ច", ["ch"] = "ឆ", ["j"] = "ជ", ["jh"] = "ឈ", ["ñ"] = "ញ",
["ṭ"] = "ដ", ["ṭh"] = "ឋ", ["ḍ"] = "ឌ", ["ḍh"] = "ឍ", ["ṇ"] = "ណ",
["t"] = "ត", ["th"] = "ថ", ["d"] = "ទ", ["dh"] = "ធ", ["n"] = "ន",
["p"] = "ប", ["ph"] = "ផ", ["b"] = "ព", ["bh"] = "ភ", ["m"] = "ម",
["y"] = "យ", ["r"] = "រ", ["l"] = "ល", ["v"] = "វ", ["s"] = "ស",
["h"] = "ហ", ["ḷ"] = "ឡ",
["a"] = "អ", ["ā"] = "អា",
["i"] = "ឥ", ["ī"] = "ឦ",
["u"] = "ឧ", ["ū"] = "ឨ",
["e"] = "ឯ",
["o"] = "ឲ",
["ṃ"] = "ំ",
[""] = "",
},
["Mymr"] = {
["k"] = "က", ["kh"] = "ခ", ["g"] = "ဂ", ["gh"] = "ဃ", ["ṅ"] = "င",
["c"] = "စ", ["ch"] = "ဆ", ["j"] = "ဇ", ["jh"] = "ဈ", ["ñ"] = "ဉ",
["ṭ"] = "ဋ", ["ṭh"] = "ဌ", ["ḍ"] = "ဍ", ["ḍh"] = "ဎ", ["ṇ"] = "ဏ",
["t"] = "တ", ["th"] = "ထ", ["d"] = "ဒ", ["dh"] = "ဓ", ["n"] = "န",
["p"] = "ပ", ["ph"] = "ဖ", ["b"] = "ဗ", ["bh"] = "ဘ", ["m"] = "မ",
["y"] = "ယ", ["r"] = "ရ", ["l"] = "လ", ["v"] = "ဝ", ["s"] = "သ",
["h"] = "ဟ", ["ḷ"] = "ဠ",
["a"] = "အ", ["ā"] = "အာ",
["i"] = "ဣ", ["ī"] = "ဤ",
["u"] = "ဥ", ["ū"] = "ဦ",
["e"] = "ဧ",
["o"] = "ဩ",
["ṃ"] = "ံ",
[""] = "",
},
["Sinh"] = {
["k"] = "ක", ["kh"] = "ඛ", ["g"] = "ග", ["gh"] = "ඝ", ["ṅ"] = "ඞ",
["c"] = "ච", ["ch"] = "ඡ", ["j"] = "ජ", ["jh"] = "ඣ", ["ñ"] = "ඤ",
["ṭ"] = "ට", ["ṭh"] = "ඨ", ["ḍ"] = "ඩ", ["ḍh"] = "ඪ", ["ṇ"] = "ණ",
["t"] = "ත", ["th"] = "ථ", ["d"] = "ද", ["dh"] = "ධ", ["n"] = "න",
["p"] = "ප", ["ph"] = "ඵ", ["b"] = "බ", ["bh"] = "භ", ["m"] = "ම",
["y"] = "ය", ["r"] = "ර", ["l"] = "ල", ["v"] = "ව", ["s"] = "ස",
["h"] = "හ", ["ḷ"] = "ළ",
["a"] = "අ", ["ā"] = "ආ",
["i"] = "ඉ", ["ī"] = "ඊ",
["u"] = "උ", ["ū"] = "ඌ",
["e"] = "එ",
["o"] = "ඔ",
["ṃ"] = "ං",
[""] = "",
},
["Thai"] = {
["k"] = "ก", ["kh"] = "ข", ["g"] = "ค", ["gh"] = "ฆ", ["ṅ"] = "ง",
["c"] = "จ", ["ch"] = "ฉ", ["j"] = "ช", ["jh"] = "ฌ", ["ñ"] = "ญ",
["ṭ"] = "ฏ", ["ṭh"] = "ฐ", ["ḍ"] = "ฑ", ["ḍh"] = "ฒ", ["ṇ"] = "ณ",
["t"] = "ต", ["th"] = "ถ", ["d"] = "ท", ["dh"] = "ธ", ["n"] = "น",
["p"] = "ป", ["ph"] = "ผ", ["b"] = "พ", ["bh"] = "ภ", ["m"] = "ม",
["y"] = "ย", ["r"] = "ร", ["l"] = "ล", ["v"] = "ว", ["s"] = "ส",
["h"] = "ห", ["ḷ"] = "ฬ",
["a"] = "อ", ["ā"] = "อา",
["i"] = "อิ", ["ī"] = "อี",
["u"] = "อุ", ["ū"] = "อู",
["e"] = "อเ", --to be swapped later
["o"] = "อโ", --to be swapped later
["ṃ"] = "ํ",
[""] = "",
},
["Lana"] = {
["k"] = "ᨠ", ["kh"] = "ᨡ", ["g"] = "ᨣ", ["gh"] = "ᨥ", ["ṅ"] = "ᨦ",
["c"] = "ᨧ", ["ch"] = "ᨨ", ["j"] = "ᨩ", ["jh"] = "ᨫ", ["ñ"] = "ᨬ",
["ṭ"] = "ᨭ", ["ṭh"] = "ᨮ", ["ḍ"] = "ᨯ", ["ḍh"] = "ᨰ", ["ṇ"] = "ᨱ",
["t"] = "ᨲ", ["th"] = "ᨳ", ["d"] = "ᨴ", ["dh"] = "ᨵ", ["n"] = "ᨶ",
["p"] = "ᨷ", ["ph"] = "ᨹ", ["b"] = "ᨻ", ["bh"] = "ᨽ", ["m"] = "ᨾ",
["y"] = "ᨿ", ["r"] = "ᩁ", ["l"] = "ᩃ", ["v"] = "ᩅ", ["s"] = "ᩈ",
["h"] = "ᩉ", ["ḷ"] = "ᩊ",
["a"] = "ᩋ", ["ā"] = "ᩋᩣ",
["i"] = "ᩍ", ["ī"] = "ᩎ",
["u"] = "ᩏ", ["ū"] = "ᩐ",
["e"] = "ᩑ",
["o"] = "ᩋᩰ",
["ṃ"] = "ᩴ",
[""] = "",
},
["Laoo"] = {
["k"] = "ກ", ["kh"] = "ຂ", ["g"] = "ຄ", ["gh"] = "ຆ", ["ṅ"] = "ງ",
["c"] = "ຈ", ["ch"] = "ຉ", ["j"] = "ຊ", ["jh"] = "ຌ", ["ñ"] = "ຎ",
["ṭ"] = "ຏ", ["ṭh"] = "ຐ", ["ḍ"] = "ຑ", ["ḍh"] = "ຒ", ["ṇ"] = "ຓ",
["t"] = "ຕ", ["th"] = "ຖ", ["d"] = "ທ", ["dh"] = "ຘ", ["n"] = "ນ",
["p"] = "ປ", ["ph"] = "ຜ", ["b"] = "ພ", ["bh"] = "ຠ", ["m"] = "ມ",
["y"] = "ຍ", ["r"] = "ຣ", ["l"] = "ລ", ["v"] = "ວ", ["s"] = "ສ",
["h"] = "ຫ", ["ḷ"] = "ຬ",
["a"] = "ອ", ["ā"] = "ອາ",
["i"] = "ອິ", ["ī"] = "ອີ",
["u"] = "ອຸ", ["ū"] = "ອູ",
["e"] = "ອເ", --to be swapped later
["o"] = "ອໂ", --to be swapped later
["ṃ"] = "ໍ",
[""] = "",
},
["Cakm"] = {
["k"] = "𑄇", ["kh"] = "𑄈", ["g"] = "𑄉", ["gh"] = "𑄊", ["ṅ"] = "𑄋",
["c"] = "𑄌", ["ch"] = "𑄍", ["j"] = "𑄎", ["jh"] = "𑄏", ["ñ"] = "𑄐",
["ṭ"] = "𑄑", ["ṭh"] = "𑄒", ["ḍ"] = "𑄓", ["ḍh"] = "𑄔", ["ṇ"] = "𑄕",
["t"] = "𑄖", ["th"] = "𑄗", ["d"] = "𑄘", ["dh"] = "𑄙", ["n"] = "𑄚",
["p"] = "𑄛", ["ph"] = "𑄜", ["b"] = "𑄝", ["bh"] = "𑄞", ["m"] = "𑄟",
["y"] = "𑄠", ["r"] = "𑄢", ["l"] = "𑄣", ["v"] = "𑅇", ["s"] = "𑄥",
["h"] = "𑄦", ["ḷ"] = "𑅄",
["a"] = "𑄃", ["ā"] = "𑄃𑄂",
["i"] = "𑄃𑄨", ["ī"] = "𑄃𑄩",
["u"] = "𑄃𑄪", ["ū"] = "𑄃𑄫",
["e"] = "𑄃𑄬",
["o"] = "𑄃𑄮",
["ṃ"] = "𑄁",
[""] = "",
},
}
local v = {
["Deva"] = {
["a"] = "", ["ā"] = "ा",
["i"] = "ि", ["ī"] = "ी",
["u"] = "ु", ["ū"] = "ू",
["e"] = "े",
["o"] = "ो",
[""] = "",
},
["Beng"] = {
["a"] = "", ["ā"] = "া",
["i"] = "ি", ["ī"] = "ী",
["u"] = "ু", ["ū"] = "ূ",
["e"] = "ে",
["o"] = "ো",
[""] = "",
},
["Brah"] = {
["a"] = "", ["ā"] = "𑀸",
["i"] = "𑀺", ["ī"] = "𑀻",
["u"] = "𑀼", ["ū"] = "𑀽",
["e"] = "𑁂",
["o"] = "𑁄",
[""] = "",
},
["Khmr"] = {
["a"] = "", ["ā"] = "ា",
["i"] = "ិ", ["ī"] = "ី",
["u"] = "ុ", ["ū"] = "ូ",
["e"] = "េ",
["o"] = "ោ",
[""] = "",
},
["Mymr"] = {
["a"] = "", ["ā"] = "ာ",
["i"] = "ိ", ["ī"] = "ီ",
["u"] = "ု", ["ū"] = "ူ",
["e"] = "ေ",
["o"] = "ော",
[""] = "",
},
["Sinh"] = {
["a"] = "", ["ā"] = "ා",
["i"] = "ි", ["ī"] = "ී",
["u"] = "ු", ["ū"] = "ූ",
["e"] = "ෙ",
["o"] = "ො",
[""] = "",
},
["Thai"] = {
["a"] = "", ["ā"] = "า",
["i"] = "ิ", ["ī"] = "ี",
["u"] = "ุ", ["ū"] = "ู",
["e"] = "เ",
["o"] = "โ",
[""] = "",
},
["Lana"] = {
["a"] = "", ["ā"] = "ᩣ",
["i"] = "ᩥ", ["ī"] = "ᩦ",
["u"] = "ᩩ", ["ū"] = "ᩪ",
["e"] = "ᩮ",
["o"] = "ᩮᩣ",
[""] = "",
},
["Laoo"] = {
["a"] = "", ["ā"] = "າ",
["i"] = "ິ", ["ī"] = "ີ",
["u"] = "ຸ", ["ū"] = "ູ",
["e"] = "ເ",
["o"] = "ໂ",
[""] = "",
},
["Cakm"] = {
["a"] = "", ["ā"] = "𑄂",
["i"] = "𑄨", ["ī"] = "𑄩",
["u"] = "𑄪", ["ū"] = "𑄫",
["e"] = "𑄬",
["o"] = "𑄮",
[""] = "",
},
}
local s = {
["Deva"] = {
["0"] = "०", ["1"] = "१", ["2"] = "२", ["3"] = "३", ["4"] = "४",
["5"] = "५", ["6"] = "६", ["7"] = "७", ["8"] = "८", ["9"] = "९",
["."] = "॥", [","] = "।", ["-"] = "-",
},
["Beng"] = {
["0"] = "০", ["1"] = "১", ["2"] = "২", ["3"] = "৩", ["4"] = "৪",
["5"] = "৫", ["6"] = "৬", ["7"] = "৭", ["8"] = "৮", ["9"] = "৯",
["."] = ".", [","] = ",", ["-"] = "-",
},
["Brah"] = {
["0"] = "𑁦", ["1"] = "𑁧", ["2"] = "𑁨", ["3"] = "𑁩", ["4"] = "𑁪",
["5"] = "𑁫", ["6"] = "𑁬", ["7"] = "𑁭", ["8"] = "𑁮", ["9"] = "𑁯",
["."] = "𑁈", [","] = "𑁇", ["-"] = "-",
},
["Khmr"] = {
["0"] = "០", ["1"] = "១", ["2"] = "២", ["3"] = "៣", ["4"] = "៤",
["5"] = "៥", ["6"] = "៦", ["7"] = "៧", ["8"] = "៨", ["9"] = "៩",
["."] = "៕", [","] = "។", ["-"] = "-",
},
["Mymr"] = {
["0"] = "၀", ["1"] = "၁", ["2"] = "၂", ["3"] = "၃", ["4"] = "၄",
["5"] = "၅", ["6"] = "၆", ["7"] = "၇", ["8"] = "၈", ["9"] = "၉",
["."] = "။", [","] = "၊", ["-"] = "-",
},
["Sinh"] = {
["0"] = "0", ["1"] = "1", ["2"] = "2", ["3"] = "3", ["4"] = "4",
["5"] = "5", ["6"] = "6", ["7"] = "7", ["8"] = "8", ["9"] = "9",
["."] = ".", [","] = ",", ["-"] = "-",
},
["Thai"] = {
["0"] = "๐", ["1"] = "๑", ["2"] = "๒", ["3"] = "๓", ["4"] = "๔",
["5"] = "๕", ["6"] = "๖", ["7"] = "๗", ["8"] = "๘", ["9"] = "๙",
["."] = "๚", [","] = "ฯ", ["-"] = "-",
},
["Lana"] = {
["0"] = "᪐", ["1"] = "᪑", ["2"] = "᪒", ["3"] = "᪓", ["4"] = "᪔",
["5"] = "᪕", ["6"] = "᪖", ["7"] = "᪗", ["8"] = "᪘", ["9"] = "᪙",
["."] = "᪩", [","] = "᪨", ["-"] = "-",
},
["Laoo"] = {
["0"] = "໐", ["1"] = "໑", ["2"] = "໒", ["3"] = "໓", ["4"] = "໔",
["5"] = "໕", ["6"] = "໖", ["7"] = "໗", ["8"] = "໘", ["9"] = "໙",
["."] = "ຯຯ", [","] = "ຯ", ["-"] = "-",
},
["Cakm"] = {
["0"] = "𑄶", ["1"] = "𑄷", ["2"] = "𑄸", ["3"] = "𑄹", ["4"] = "𑄺",
["5"] = "𑄻", ["6"] = "𑄼", ["7"] = "𑄽", ["8"] = "𑄾", ["𑄿"] = "๙",
["."] = "𑅁", [","] = ",", ["-"] = "-",
},
}
local join = {
["Deva"] = "्",
["Beng"] = "্",
["Brah"] = "𑁆",
["Khmr"] = "្",
["Mymr"] = "္",
["Sinh"] = u(0x200d, 0x0dca),
["Thai"] = "ฺ",
["Lana"] = "᩠",
["Laoo"] = "຺",
["Cakm"] = "𑄴",
}
local kill = {
["Deva"] = "्",
["Beng"] = "্",
["Brah"] = "𑁆",
["Khmr"] = "៑",
["Mymr"] = "်",
["Sinh"] = "්",
["Thai"] = "ฺ",
["Lana"] = "᩺",
["Laoo"] = "຺",
["Cakm"] = "𑄴",
}
local sinh_cjct = {
["ක්ව"] = "ක්ව", ["ත්ථ"] = "ත්ථ", ["ත්ව"] = "ත්ව",
["න්ථ"] = "න්ථ", ["න්ද"] = "න්ද", ["න්ධ"] = "න්ධ", ["න්ව"] = "න්ව"
}
local nukta = u(0x09bc) -- Just list all those used here.
local variations = {
["Mon"] = {
["ဈ"] = "ၛ", ["ဤ"] = "ဣဳ", ["ဦ"] = "ဥု", ["ဧ"] = "ဨ", ["ီ"] = "ဳ", ["င"] = "ၚ", -- for IM fix below, if at all.
--Unicode doesn't have "great nya" so just leave ည္ည as is. (It looks like ည with one extra curve.)
},
["OldShan"] = {
["က"] = "ၵ", ["ခ"] = "ၶ", ["ဂ"] = "ၷ", ["ဃ"] = "ꧠ", ["စ"] = "ၸ",
["ဆ"] = "ꧡ", ["ဇ"] = "ၹ", ["ဈ"] = "ꧢ", ["ဉ"] = "ၺ", ["ည"] = "ၺ္ၺ", ["ဋ"] = "ꩦ",
["ဌ"] = "ꩧ", ["ဍ"] = "ꩨ", ["ဎ"] = "ꩩ", ["ဏ"] = "ꧣ", ["ဒ"] = "ၻ",
["ဓ"] = "ꩪ", ["န"] = "ၼ", ["ဖ"] = "ၽ", ["ဗ"] = "ၿ", ["ဘ"] = "ꧤ",
["ဟ"] = "ႁ", ["ဠ"] = "ꩮ", ["အ"] = "ဢ", ["ဣ"] = "ဢိ", ["ဤ"] = "ဢီ",
["ဥ"] = "ဢု", ["ဦ"] = "ဢူ", ["ဧ"] = "ဢေ", ["ဩ"] = "ဢေႃ", ["ါ"] = "ႃ", ["ာ"] = "ႃ",
--Unicode doesn't have "Shan great sa" so just leave ဿ as is.
},
["NewShan"] = {
--includes all Old Shan and the followings
["ဿ"] = "သ်သ", ["္"] = "်",
},
}
-- Unnatural sequences of combining marks are frequently unreadable. Therefore, they are displayed on
-- bearers so that the code can be understood and, if necessary, corrected.
local dc = function(text) return gsub(text, "[อອ]", "") end -- Discard bearer
local transform
function export.mono_form(text, script)
local result = text
if script == "Thai" then
result = gsub(result, "ํ", "งฺ")
result = gsub(result, "([ก-ฮ])ฺ", "ั%1ฺ")
result = gsub(result, "([ก-ฮ])([^ะัาิีฺุู])", "%1ะ%2")
result = gsub(result, "([ก-ฮ])([^ะัาิีฺุู])", "%1ะ%2") --twice
result = gsub(result, "([ก-ฮ])$", "%1ะ")
-- result = gsub(result, "([ก-ฮ])([าิีุู])ั", "%1%2")
result = gsub(result, dc("([ก-ฮ])([าอิอีอฺอุอู])อั"), "%1%2")
result = gsub(result, "([เโ])([ก-ฮ])([ะั])", "%1%2")
result = gsub(result, "^ั", "")
result = gsub(result, "([%s%p])ั", "%1")
result = gsub(result, "ฺ", "")
elseif script == "Laoo" then
-- Calculating transform in argument list of gsub() fails!
if not transform then
transform = {
{dc("ອໍ"), dc("ງອ຺")},
{dc("([ກ-ຮ])ອ຺"), dc("ອັ%1ອ຺")},
{dc("([ກ-ຮ])([^ະອັາອິອີອ຺ອຸອູ])"), "%1ະ%2"},
{dc("([ກ-ຮ])([^ະອັາອິອີອ຺ອຸອູ])"), "%1ະ%2"}, -- twice!
{"([ກ-ຮ])$", "%1ະ"},
{dc("([ກ-ຮ])([າອິອີອ຺ອຸອູ])ອັ"), "%1%2"},
{dc("([ເໂ])([ກ-ຮ])([ະອັ])"), "%1%2"},
{dc("^ອັ"), ""},
{dc("([%s%p])ອັ"), "%1"},
{dc("ອ຺"), ""}
}
end
for _, v in ipairs(transform) do
result = gsub(result, v[1], v[2])
end
end
return result
end
local function return_error(text)
return error(("Unrecognised part: \"%s\""):format(text))
end
function export.tr(text, script, options)
if type(text) == "table" then
options = {}
options.impl = text.args["impl"]
options.variation = text.args["variation"] --ID of variation: [Mymr: 1=Mon, 2=Old Shan, 3=New Shan]
text, script = text.args[1], text.args[2]
end
if script == "Latn" then
return text
end
if not s[script] then
return nil
end
local easy_syllable_pattern =
"^([khgṅcjñṭḍṇtdnpbmyrlḷvs]*)([aāiīuūeo])(ṃ?)("..kill[script].."?)$"
text = lower(text)
text = gsub(text, "[0-9%.,%-]", s[script])
-- Compose patterns for processing onsets.
local letter = "[^"..join[script]..nukta.."]["..nukta.."]?"
local letter_pair = "("..letter..")("..letter..")"
for word in gmatch(text, "[aāiīuūeoṃkhgṅcjñṭḍṇtdnpbmyrlḷvs]+") do
local word_conv, orig_word = {}, word
word = gsub(word, "([aāiīuūeo]ṃ?)", "%1 ")
word = gsub(word, " $", "")
for syllable in mw.text.gsplit(word, " ") do
if not match(syllable, "[aāiīuūeoṃ]$") then
syllable = syllable .. "a" .. kill[script]
end
syllable = gsub(syllable, easy_syllable_pattern,
function(onset, vowel, coda, optJoin)
if onset == "" then
onset = vowel
vowel = ""
end
if not c[script][onset] then
onset = gsub(onset, ".h", c[script])
onset = gsub(onset, ".", c[script])
-- Join pairs of consonants
onset = gsub(onset, letter_pair, "%1"..join[script].."%2")
-- Join adjacent consonants that were in different pairs.
onset = gsub(onset, letter_pair, "%1"..join[script].."%2")
else
onset = c[script][onset]
end
return onset .. (v[script][vowel] or return_error(vowel)) .. c[script][coda] .. optJoin
end)
table.insert(word_conv, syllable)
end
word = table.concat(word_conv, "")
if script == "Thai" then
word = gsub(word, "(.)([เโ])", "%2%1")
elseif script == "Mymr" then
word = gsub(word, "င္", "င်္") -- Pali doesn't have -Vr mid-word like Sanskrit, so no need to include repha.
word = gsub(word, "(င်္)([ခဂငဒပဝ])(ေ?)ာ", "%1%2%3ါ")
word = gsub(word, "္[ယရ]", { ["္ယ"] = "ျ", ["္ရ"] = "ြ" }) --these not need tall aa
word = gsub(word, "^([ခဂငဒပဝ])(ေ?)ာ", "%1%2ါ")
word = gsub(word, "([^္])([ခဂငဒပဝ])(ေ?)ာ", "%1%2%3ါ")
word = gsub(word, "([ခဂငဒပဝ])(္[က-အဿ])(ေ?)ာ", "%1%2%3ါ")
word = gsub(word, "္[ဝဟ]", { ["္ဝ"] = "ွ", ["္ဟ"] = "ှ" })
word = gsub(word, "ဉ္ဉ", "ည")
word = gsub(word, "သ္သ", "ဿ")
if not (options and options.variation) then
-- Arg options should be optional, so nothing to do.
elseif options.variation == "1" then
word = gsub(word, ".", variations.Mon)
-- word = gsub(word, "ိံ", "ီ") --fix IM, if evidence meeting CFI is added.
elseif options.variation == "2" then
if match(word, "ဿ") then
-- Character is missing. Do nothing.
else
word = gsub(word, ".", variations.OldShan)
end
elseif options.variation == "3" then
word = gsub(word, ".", variations.OldShan)
word = gsub(word, ".", variations.NewShan)
word = gsub(word, "်".."်", "်") --fix nga
end
elseif script == "Lana" then
word = gsub(word, "ᨦ᩠", "ᩘ")
word = gsub(word, "^([ᨣᨴᨵᨷᩅ])(ᩮ?)ᩣ", "%1%2ᩤ")
word = gsub(word, "([^᩠])([ᨣᨴᨵᨷᩅ])(ᩮ?)ᩣ", "%1%2%3ᩤ")
word = gsub(word, "([ᨣᨴᨵᨷᩅ])(᩠[ᨠ-ᩌᩔ])(ᩮ?)ᩣ", "%1%2%3ᩤ")
word = gsub(word, "᩠[ᩁᩃ]", { ["᩠ᩁ"] = "ᩕ", ["᩠ᩃ"] = "ᩖ" })
word = gsub(word, "([ᨭ-ᨱ])᩠ᨮ", "%1ᩛ")
word = gsub(word, "([ᨷ-ᨾ])᩠ᨻ", "%1ᩛ")
word = gsub(word, "ᩈ᩠ᩈ", "ᩔ")
elseif script == "Beng" then
word = gsub(word, "ৰ্", "ৰ"..u(0x200d).."্") -- ৰ্(v-) needs ZWJ to display correctly
elseif script == "Sinh" then
local js = join["Sinh"]
word = gsub(word, "("..js..")([යර])", u(0xdca, 0x200d).."%2")
word = gsub(word,"[කතන]"..js.."[ථදධව]", sinh_cjct)
elseif script == "Laoo" then
word = gsub(word, "(.)([ເໂ])", "%2%1")
elseif script == "Cakm" then
word = gsub(word, "𑄴[𑄠𑄢𑄣𑅇]", -- 𑄠𑄣 are TBC: 𑄢𑅇 confirmed. 𑄚𑄴𑄚 seen.
{ ["𑄴𑄠"]="𑄳𑄠", ["𑄴𑄢"]="𑄳𑄢", ["𑄴𑄣"]="𑄳𑄣", ["𑄴𑅇"]="𑄳𑄤", })
end
text = gsub(text, orig_word, word, 1)
end
local impl = options and options.impl or 'yes'
if impl == 'no' then text = export.mono_form(text, script) end
return text
end
return export
eroawczec0zekvtbsz4fwbqiabr3sss
Mô đun:languages/data/3/i
828
272289
2353531
2344285
2026-05-15T07:25:07Z
Hiyuune
50834
2353531
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["iai"] = {
"tiếng Iaai",
282888,
"poz-occ",
"Latn",
"Tiếng Iaai",
"Iaai",
}
m["ian"] = {
"Iatmul",
5983460,
"paa-spk",
}
m["iar"] = {
"Purari",
3499934,
"paa",
}
m["iba"] = {
"tiếng Iban",
33424,
"poz-mly",
"Latn",
"Tiếng Iban",
"Iban",
}
m["ibb"] = {
"tiếng Ibibio",
33792,
"nic-ief",
"Latn",
"Tiếng Ibibio",
"Ibibio",
}
m["ibd"] = {
"tiếng Iwaidja",
1977429,
"aus-wdj",
"Latn",
"Tiếng Iwaidja",
"Iwaidja",
}
m["ibe"] = {
"Akpes",
35457,
"alv-von",
"Latn",
}
m["ibg"] = {
"tiếng Ibanag",
1775596,
"phi",
"Latn",
"Tiếng Ibanag",
"Ibanag",
}
m["ibh"] = {
"tiếng Bih",
nil,
"cmc",
"Latn",
"Tiếng Bih",
"Bih",
}
m["ibl"] = {
"tiếng Ibaloi",
3147383,
"phi",
"Latn",
"Tiếng Ibaloi",
"Ibaloi",
}
m["ibm"] = {
"Agoi",
34727,
"nic-ucr",
"Latn",
}
m["ibn"] = {
"tiếng Ibino",
3813281,
"nic-lcr",
"Latn",
"Tiếng Ibino",
"Ibino",
}
m["ibr"] = {
"tiếng Ibuoro",
3813306,
"nic-ief",
"Latn",
"Tiếng Ibuoro",
"Ibuoro",
}
m["ibu"] = {
"Ibu",
11732235,
"paa-nha",
}
m["iby"] = {
"Ibani",
11280479,
"ijo",
}
m["ica"] = {
"tiếng Ede Ica",
12952405,
"alv-ede",
"Latn",
"Tiếng Ede Ica",
"Ede Ica",
}
m["ich"] = {
"Etkywan",
3914462,
"nic-jkn",
"Latn",
}
m["icl"] = {
"Icelandic Sign Language",
3436654,
"sgn",
"Latn", -- when documented
}
m["icr"] = {
"Islander Creole English",
2044587,
"crp",
"Latn",
ancestors = "en",
}
m["ida"] = {
"Idakho-Isukha-Tiriki",
12952512,
"bnt-lok",
}
m["idb"] = {
"tiếng Indo-Bồ Đào Nha",
6025550,
"crp",
"Latn",
"Tiếng Indo-Bồ Đào Nha",
"Indo-Bồ Đào Nha",
ancestors = "pt",
}
m["idc"] = {
"Idon",
3913366,
"nic-plc",
}
m["idd"] = {
"tiếng Ede Idaca",
13123376,
"alv-ede",
"Latn",
"Tiếng Ede Idaca",
"Ede Idaca",
}
m["ide"] = {
"Idere",
3813288,
"nic-ief",
}
m["idi"] = {
"Idi",
5988630,
"paa",
}
m["idr"] = {
"Indri",
35662,
"nic-ser",
}
m["ids"] = {
"Idesa",
3913979,
"alv-swd",
"Latn",
ancestors = "oke",
}
m["idt"] = {
"Idaté",
12952511,
"poz-tim",
"Latn",
}
m["idu"] = {
"Idoma",
35478,
"alv-ido",
"Latn",
}
m["ifa"] = {
"Amganad Ifugao",
18748222,
"phi",
}
m["ifb"] = {
"tiếng Ifugao Batad",
12953578,
"phi",
"Latn",
"Tiếng Ifugao Batad",
"Ifugao Batad",
}
m["ife"] = {
"tiếng Ifè",
33606,
"alv-ede",
"Latn",
"Tiếng Ifè",
"Ifè",
entry_name = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
sort_key = {
remove_diacritics = c.tilde,
from = {"ɖ", "dz", "ɛ", "gb", "kp", "ny", "ŋ", "ɔ", "ts"},
to = {"d" .. p[1], "d" .. p[2], "e" .. p[1], "g" .. p[1], "k" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "t" .. p[1]}
},
}
m["iff"] = {
"Ifo",
7902545,
"poz-oce",
"Latn",
}
m["ifk"] = {
"Tuwali Ifugao",
7857158,
"phi",
}
m["ifm"] = {
"Teke-Fuumu",
36603,
"bnt-tek",
}
m["ifu"] = {
"Mayoyao Ifugao",
12953579,
"phi",
"Latn",
}
m["ify"] = {
"Keley-I Kallahan",
3192221,
"phi",
}
m["igb"] = {
"Ebira",
35363,
"alv-nup",
"Latn",
}
m["ige"] = {
"Igede",
35420,
"alv-ido",
"Latn",
}
m["igg"] = {
"Igana",
5991454,
"paa",
"Latn",
}
m["igl"] = {
"tiếng Igala",
35513,
"alv-yrd",
"Latn",
"Tiếng Igala",
"Igala",
entry_name = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.dotabove .. c.caron .. c.lineabove},
sort_key = {
from = {
"ñm", "ñw", -- 3 chars
"ch", "ẹ", "gb", "gw", "kp", "kw", "ny", "ñ", "ọ" -- 2 chars
},
to = {
"n" .. p[3], "n" .. p[4],
"c" .. p[1], "e" .. p[1], "g" .. p[1], "g" .. p[2], "k" .. p[1], "k" .. p[2], "n" .. p[1], "n" .. p[2], "o" .. p[1]
}
},
}
m["igm"] = {
"Kanggape",
6362743,
"paa",
"Latn",
}
m["ign"] = {
"Ignaciano",
3148190,
"awd",
}
m["igo"] = {
"Isebe",
11732248,
"ngf-mad",
}
m["igs"] = {
"tiếng Glosa",
1138529,
"art",
"tiếng Glosa",
"Glosa",
type = "appendix-constructed",
}
m["igw"] = {
"Igwe",
3913985,
"alv-yek",
"Latn",
}
m["ihb"] = {
"Pidgin Iha",
12639686,
"crp",
ancestors = "ihp",
}
m["ihi"] = {
"Ihievbe",
3441193,
"alv-eeo",
"Latn",
ancestors = "ema",
}
m["ihp"] = {
"Iha",
5994495,
"ngf",
}
m["ijc"] = {
"tiếng Izon",
35483,
"ijo",
"Latn",
"Tiếng Izon",
"Izon",
}
m["ije"] = {
"Biseni",
35010,
"ijo",
}
m["ijj"] = {
"Ede Ije",
12952406,
"alv-ede",
"Latn",
}
m["ijn"] = {
"Kalabari",
35697,
"ijo",
}
m["ijs"] = {
"Southeast Ijo",
3915854,
"ijo",
"Latn",
}
m["ike"] = {
"tiếng Inuktitut Đông Canada",
4126517,
"esx-inu",
"Cans, Latn",
"Tiếng Inuktitut Đông Canada",
"Inuktitut Đông Canada",
translit = {Cans = "cr-translit"},
override_translit = true,
}
m["iki"] = {
"Iko",
3813290,
"nic-lcr",
"Latn",
}
m["ikk"] = {
"Ika",
35406,
"alv-igb",
}
m["ikl"] = {
"Ikulu",
425973,
"nic-plc",
"Latn",
}
m["iko"] = {
"Olulumo-Ikom",
3914402,
"nic-uce",
"Latn",
}
m["ikp"] = {
"Ikpeshi",
3912777,
"alv-yek",
"Latn",
}
m["ikr"] = {
"Ikaranggal",
5995402,
"aus-pam",
}
m["iks"] = {
"Inuit Sign Language",
13360244,
"sgn",
"Latn", -- when documented
}
m["ikt"] = {
"tiếng Inuvialuktun",
27990,
"esx-inu",
"Cans, Latn",
"Tiếng Inuvialuktun",
"Inuvialuktun",
translit = {Cans = "cr-translit"},
override_translit = true,
}
m["ikv"] = {
"Iku-Gora-Ankwa",
3913940,
"nic-plc",
}
m["ikw"] = {
"tiếng Ikwere",
35399,
"alv-igb",
"Latn",
"Tiếng Ikwere",
"Ikwere",
}
m["ikx"] = {
"Ik",
35472,
"ssa-klk",
"Latn",
}
m["ikz"] = {
"Ikizu",
10977626,
"bnt-lok",
"Latn",
}
m["ila"] = {
"Ile Ape",
12473380,
"poz-cet",
}
m["ilb"] = {
"Ila",
10962725,
"bnt-bot",
"Latn",
}
m["ilg"] = {
"Ilgar",
5997810,
"aus-wdj",
"Latn",
}
m["ili"] = {
"tiếng Ili Turki",
33627,
"trk-kar",
nil,
"Tiếng Ili Turki",
"Ili Turki",
}
m["ilk"] = {
"Ilongot",
3148787,
"phi",
"Latn",
}
m["ill"] = {
"Iranun",
12953581,
"phi",
"Latn, Arab",
}
m["ilo"] = {
"tiếng Ilokano",
35936,
"phi",
"Latn, Tglg",
"Tiếng Ilokano",
"Ilokano",
translit = {
Tglg = "ilo-translit",
},
override_translit = true,
entry_name = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer,
}
},
sort_key = {
Latn = "tl-sortkey",
},
standardChars = {
Latn = "AaBbKkDdEeGgHhIiLlMmNnOoPpRrSsTtUuWwYy" .. c.punc,
},
}
m["ils"] = {
"International Sign",
35754,
"sgn",
}
m["ilu"] = {
"Ili'uun",
12632888,
"poz-tim",
}
m["ilv"] = {
"Ilue",
3813301,
"nic-lcr",
"Latn",
}
m["ima"] = {
"Mala Malasar",
6740693,
"dra-tam",
}
m["imi"] = {
"Anamgura",
3501881,
"ngf-mad",
}
m["iml"] = {
"Miluk",
3314550,
"nai-coo",
"Latn",
}
m["imn"] = {
"Imonda",
6005721,
"paa-brd",
}
m["imo"] = {
"Imbongu",
12632895,
"ngf-mad",
}
m["imr"] = {
"Imroing",
6008394,
"poz-tim",
}
m["ims"] = {
"tiếng Marsi",
1265446,
"itc-sbl",
"Latn, Ital",
"Tiếng Marsi",
"Marsi",
translit = {Ital = "Ital-translit"},
}
m["imy"] = {
"Milyan",
3832946,
"ine-luw",
"Lyci",
}
m["inb"] = {
"Inga",
35491,
"qwe",
ancestors = "qwe-kch",
}
m["ing"] = {
"tiếng Deg Xinag",
27782,
"ath-nor",
nil,
"Tiếng Deg Xinag",
"Deg Xinag",
}
m["inh"] = {
"tiếng Ingush",
33509,
"cau-vay",
"Cyrl, Latn, Arab",
"Tiếng Ingush",
"Ingush",
translit = {
Cyrl = "cau-nec-translit",
Arab = "ar-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 = {
Cyrl = {
from = {"аь", "гӏ", "ё", "кх", "къ", "кӏ", "пӏ", "тӏ", "хь", "хӏ", "цӏ", "чӏ", "яь"},
to = {"а" .. p[1], "г" .. p[1], "е" .. p[1], "к" .. p[1], "к" .. p[2], "к" .. p[3], "п" .. p[1], "т" .. p[1], "х" .. p[1], "х" .. p[2], "ц" .. p[1], "ч" .. p[1], "я" .. p[1]}
},
},
}
m["inj"] = {
"Jungle Inga",
16115012,
"qwe",
ancestors = "qwe-kch",
}
m["inl"] = {
"Indonesian Sign Language",
3915477,
"sgn",
"Latn", -- when documented
}
m["inm"] = {
"Minaean",
737784,
"sem-osa",
"Sarb",
translit = "Sarb-translit",
}
m["inn"] = {
"Isinai",
6081098,
"phi",
}
m["ino"] = {
"Inoke-Yate",
6036531,
"paa-kag",
}
m["inp"] = {
"Iñapari",
15338035,
"awd",
"Latn",
}
m["ins"] = {
"Indian Sign Language",
12953486,
"sgn",
}
m["int"] = {
"tiếng Intha",
6057507,
"tbq-brm",
"Mymr",
"Tiếng Intha",
"Intha",
ancestors = "obr",
}
m["inz"] = {
"Ineseño",
35443,
"nai-chu",
"Latn",
}
m["ior"] = {
"tiếng Inor",
35763,
"sem-eth",
"Ethi",
"Tiếng Inor",
"Inor",
}
m["iou"] = {
"Tuma-Irumu",
7852460,
"ngf-fin",
"Latn",
}
m["iow"] = {
"tiếng Chiwere",
56737,
"sio-msv",
"Latn",
"Tiếng Chiwere",
"Chiwere",
}
m["ipi"] = {
"Ipili",
6065141,
"paa-eng",
}
m["ipo"] = {
"Ipiko",
10566515,
"ngf",
}
m["iqu"] = {
"Iquito",
2669184,
"sai-zap",
"Latn",
}
m["iqw"] = {
"Ikwo",
11926474,
"alv-igb",
"Latn",
ancestors = "izi",
}
m["ire"] = {
"Iresim",
6069398,
"poz-hce",
"Latn",
}
m["irh"] = {
"Irarutu",
3027928,
"poz-cet",
"Latn",
}
m["iri"] = {
"Rigwe",
3912756,
"nic-plc",
"Latn",
}
m["irk"] = {
"tiếng Iraqw",
33595,
"cus-sou",
"Latn",
"Tiếng Iraqw",
"Iraqw",
}
m["irn"] = {
"Irantxe",
3409301,
nil,
"Latn",
}
m["irr"] = {
"Ir",
3071880,
"mkh-kat",
}
m["iru"] = {
"tiếng Irula",
33363,
"dra-imd",
"Taml",
"Tiếng Irula",
"Irula",
translit = "ta-translit"
}
m["irx"] = {
"Kamberau",
6356317,
"ngf",
}
m["iry"] = {
"Iraya",
6068356,
"phi",
}
m["isa"] = {
"Isabi",
11732247,
"paa-kag",
}
m["isc"] = {
"Isconahua",
3052971,
"sai-pan",
"Latn",
}
m["isd"] = {
"tiếng Isnag",
6085162,
"phi",
"Latn",
"Tiếng Isnag",
"Isnag",
}
m["ise"] = {
"Italian Sign Language",
375619,
"sgn",
"Latn", -- when documented
}
m["isg"] = {
"Irish Sign Language",
14183,
"sgn",
"Latn", -- when documented
}
m["ish"] = {
"tiếng Esan",
35268,
"alv-eeo",
"Latn",
"Tiếng Esan",
"Esan",
}
m["isi"] = {
"Nkem-Nkum",
36261,
"nic-eko",
"Latn",
}
m["isk"] = {
"tiếng Ishkashim",
33419,
"ira-sgi",
"Cyrl, Latn",
"Tiếng Ishkashim",
"Ishkashim",
}
m["ism"] = {
"Masimasi",
6783273,
"poz-ocw",
"Latn",
}
m["isn"] = {
"Isanzu",
6078891,
"bnt-tkm",
"Latn",
}
m["iso"] = {
"tiếng Isoko",
35414,
"alv-swd",
"Latn",
"Tiếng Isoko",
"Isoko",
}
m["isr"] = {
"Israeli Sign Language",
2911863,
"sgn",
"Sgnw",
}
m["ist"] = {
"tiếng Istria",
35845,
"roa-itd",
"Latn",
"Tiếng Istria",
"Istria",
}
m["isu"] = {
"Isu",
6089423,
"nic-rnw",
"Latn",
}
m["itb"] = {
"Binongan Itneg",
12953584,
"phi",
}
m["itd"] = {
"Southern Tidong",
7049643,
"poz-san",
}
m["ite"] = {
"tiếng Itene",
3038640,
"sai-cpc",
"Latn",
"Tiếng Itene",
"Itene",
}
m["iti"] = {
"Inlaod Itneg",
12953585,
"phi",
}
m["itk"] = {
"tiếng Ý-Do Thái",
1145414,
"roa-itd",
"Hebr, Latn",
"Tiếng Ý-Do Thái",
"Ý-Do Thái",
}
m["itl"] = {
"tiếng Itelmen",
33624,
"qfa-cka",
"Cyrl, Latn",
"Tiếng Itelmen",
"Itelmen",
entry_name = {
Cyrl = {
from = {"['’]", "[ӅԮ]", "[ӆԯ]", "Ҳ", "ҳ"},
to = {"ʼ", "Ԓ", "ԓ", "Ӽ", "ӽ"}
},
},
sort_key = {
Cyrl = {
from = {
"ӑ", "ё", "кʼ", "ӄʼ", "о̆", "пʼ", "тʼ", "ў", "чʼ", -- 2 chars
"ӄ", "љ", "ԓ", "њ", "ӈ", "ӽ", "ә" -- 1 char
},
to = {
"а" .. p[1], "е" .. p[1], "к" .. p[1], "к" .. p[3], "о" .. p[1], "п" .. p[1], "т" .. p[1], "у" .. p[1], "ч" .. p[1],
"к" .. p[2], "л" .. p[1], "л" .. p[2], "н" .. p[1], "н" .. p[2], "х" .. p[1], "ь" .. p[1]
}
},
},
}
m["itm"] = {
"tiếng Itu Mbon Uzo",
10977737,
"nic-ief",
"Latn",
ancestors = "ibr",
"Tiếng Itu Mbon Uzo",
"Itu Mbon Uzo",
}
m["ito"] = {
"tiếng Itonama",
950585,
"qfa-iso",
"Latn",
"Tiếng Itonama",
"Itonama",
}
m["itr"] = {
"Iteri",
2083185,
"paa-asa",
}
m["its"] = {
"tiếng Itsekiri",
36045,
"alv-edk",
"Latn",
"Tiếng Itsekiri",
"Itsekiri",
entry_name = {Latn = {remove_diacritics = c.grave .. c.acute .. c.macron}},
sort_key = {
remove_diacritics = c.tilde,
from = {"ẹ", "gb", "gh", "kp", "ọ", "ts", "ṣ"},
to = {"e" .. p[1], "g" .. p[1], "g" .. p[2], "k" .. p[1], "o" .. p[1], "t" .. p[1], "t" .. p[1]}
},
}
m["itt"] = {
"Maeng Itneg",
18748761,
"phi",
}
m["itv"] = {
"Itawit",
3915527,
"phi",
"Latn",
}
m["itw"] = {
"Ito",
11128810,
"nic-ief",
ancestors = "ibr",
}
m["itx"] = {
"Itik",
6094713,
"paa-tkw",
}
m["ity"] = {
"Moyadan Itneg",
12953583,
"phi",
}
m["itz"] = {
"Itzá",
35537,
"myn",
}
m["ium"] = {
"tiếng Ưu Miền",
2498808,
"hmx-mie",
nil,
"Tiếng Ưu Miền",
"Ưu Miền",
}
m["ivb"] = {
"tiếng Ibatan",
18748212,
"phi",
"Latn",
"Tiếng Ibatan",
"Ibatan",
ancestors = "phi-pro,poz-pro",
}
m["ivv"] = {
"tiếng Ivatan",
3547080,
"phi",
"Latn",
"Tiếng Ivatan",
"Ivatan",
}
m["iwk"] = {
"I-Wak",
12632789,
"phi",
}
m["iwm"] = {
"Iwam",
3915215,
"paa-spk",
}
m["iwo"] = {
"Iwur",
6101006,
"ngf-okk",
}
m["iws"] = {
"Sepik Iwam",
16893603,
"paa-spk",
}
m["ixc"] = {
"Ixcatec",
56706,
"omq",
}
m["ixl"] = {
"tiếng Ixil",
35528,
"myn",
"Latn",
"Tiếng Ixil",
"Ixil",
}
m["iya"] = {
"Iyayu",
3913390,
"alv-nwd",
"Latn",
}
m["iyo"] = {
"tiếng Mesaka",
36080,
"nic-tiv",
"Latn",
"Tiếng Mesaka",
"Mesaka",
}
m["iyx"] = {
"Yaa",
36909,
"bnt-nze",
"Latn",
}
m["izh"] = {
"tiếng Ingria",
33559,
"urj-fin",
"Latn",
"Tiếng Ingria",
"Ingria",
sort_key = {
from = {
"š", "ž",
},
to = {
"s" .. p[1], "z" .. p[1],
}
},
}
m["izi"] = {
"Izi-Ezaa-Ikwo-Mgbo",
nil,
"alv-igb",
}
m["izr"] = {
"Izere",
6101921,
"nic-plc",
"Latn",
}
m["izz"] = {
"Izi",
3914387,
"alv-igb",
"Latn",
ancestors = "izi",
}
return require("Module:languages").finalizeData(m, "language")
684vl2427zu52bf81whtdufbl2zeoh5
Mô đun:languages/canonical names
828
273923
2353529
2352944
2026-05-15T07:20:24Z
Hiyuune
50834
2353529
Scribunto
text/plain
return {
["Tiếng A'ou"] = "aou",
["Aba"] = "utp",
["Abai Sungai"] = "abf",
["Tiếng Abanyom"] = "abm",
["Abenlen Ayta"] = "abp",
["Abipon"] = "axb",
["Abishira"] = "ash",
["Abom"] = "aob",
["Tiếng Abon"] = "abo",
["Tiếng Abron"] = "abr",
["Abu"] = "ado",
["Abu' Arapesh"] = "aah",
["Abua"] = "abn",
["Tiếng Abui"] = "abz",
["Abun"] = "kgr",
["Abung"] = "abl",
["Tiếng Abure"] = "abu",
["Abureni"] = "mgj",
["Abé"] = "aba",
["Tiếng Me'phaa Acatepec"] = "tpx",
["Ache"] = "yif",
["Tiếng Achi"] = "acr",
["Tiếng Achuar"] = "acu",
["Achumawi"] = "acv",
["Aché"] = "guq",
["Acroá"] = "acs",
["Adabe"] = "adb",
["Adai"] = "xad",
["Adamorobe Sign Language"] = "ads",
["Adang"] = "adn",
["Adangbe"] = "adq",
["Adap"] = "adp",
["Adasen"] = "tiu",
["Adele"] = "ade",
["Adhola"] = "adh",
["Tiếng Adi"] = "adi",
["Adioukrou"] = "adj",
["Adithinngithigh"] = "dth",
["Tiếng Adnyamathanha"] = "adt",
["Adonara"] = "adr",
["Aduge"] = "adu",
["Aeka"] = "aez",
["Aekyom"] = "awi",
["Aequian"] = "xae",
["Aer"] = "aeq",
["Afade"] = "aal",
["Afghan Sign Language"] = "afg",
["Afitti"] = "aft",
["Afra"] = "ulf",
["Afrihili"] = "afh",
["Afro-Seminole Creole"] = "afs",
["Agarabi"] = "agd",
["Agariya"] = "agi",
["Tiếng Agatu"] = "agc",
["Agavotaguerra"] = "avo",
["Aghu"] = "ahh",
["Aghu Tharrnggala"] = "gtu",
["Agi"] = "aif",
["Agob"] = "kit",
["Agoi"] = "ibm",
["Tiếng Aguacateca"] = "agu",
["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",
["Tiếng Aka-Kede"] = "akx",
["Aka-Kol"] = "aky",
["Aka-Kora"] = "ack",
["Akar-Bale"] = "acl",
["Akaselem"] = "aks",
["Akatek"] = "knj",
["Ake"] = "aik",
["Akebu"] = "keu",
["Akei"] = "tsr",
["Akeu"] = "aeu",
["Akolet"] = "akt",
["Akoose"] = "bss",
["Akoye"] = "miw",
["Akpa"] = "akf",
["Akpes"] = "ibe",
["Akrukay"] = "afi",
["Akuku"] = "ayk",
["Akum"] = "aku",
["Tiếng Akuntsu"] = "aqz",
["Akurio"] = "ako",
["Akuwagel"] = "bey",
["Akwa"] = "akw",
["Akyaung Ari"] = "nqy",
["Al-Sayyid Bedouin Sign Language"] = "syy",
["Alabat Island Agta"] = "dul",
["Alacatlatzala Mixtec"] = "mim",
["Alago"] = "ala",
["Tiếng Alamblak"] = "amp",
["Tiếng Alangan"] = "alj",
["Alapmunte"] = "apv",
["Alas-Kluet Batak"] = "btz",
["Alazapa"] = "nai-ala",
["Albanian Sign Language"] = "sqk",
["Tiếng Mixtec Alcozauca"] = "xta",
["Alege"] = "alf",
["Algerian Sign Language"] = "asp",
["Ali"] = "aiy",
["Alladian"] = "ald",
["Allar"] = "all",
["Tiếng Alyentiyak"] = "sai-all",
["Alngith"] = "aid",
["Alo Phola"] = "ypo",
["Alor"] = "aol",
["Aloápam Zapotec"] = "zaq",
["Alu"] = "mte",
["Tiếng Kurumba Alu"] = "xua",
["Alugu"] = "aub",
["Tiếng Alumu-Tesu"] = "aab",
["Alune"] = "alp",
["Alungul"] = "aus-alu",
["Aluo"] = "yna",
["Alur"] = "alz",
["Alutiiq"] = "ems",
["Alviri-Vidari"] = "avd",
["Alyawarr"] = "aly",
["Amahai"] = "amq",
["Tiếng Amal"] = "aad",
["Tiếng Amanab"] = "amn",
["Amanayé"] = "ama",
["Amara"] = "aie",
["Amarakaeri"] = "amr",
["Amarizana"] = "awd-ama",
["Amasi"] = "alv-ama",
["Amatlán Zapotec"] = "zpo",
["Amba"] = "rwm",
["Tiếng Ambai"] = "amk",
["Ambakich"] = "aew",
["Ambala Ayta"] = "abc",
["Ambelau"] = "amv",
["Ambele"] = "ael",
["Amblong"] = "alm",
["Ambo"] = "amb",
["Ambul"] = "apo",
["Tiếng Ambulas"] = "abt",
["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",
["Tiếng Anaang"] = "anw",
["Anakalangu"] = "akg",
["Anam"] = "pda",
["Anambé"] = "aan",
["Anamgura"] = "imi",
["Anasi"] = "bpo",
["Tiếng Anauyá"] = "awd-ana",
["Ancient Ligurian"] = "xlg",
["Ancient North Arabian"] = "xna",
["Ancient Zapotec"] = "xzp",
["Andai"] = "afd",
["Andajin"] = "ajn",
["Tiếng Ả Rập Andalusia"] = "xaa",
["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",
["Angaataha"] = "agm",
["Angaité"] = "aqt",
["Angal"] = "age",
["Angal Enen"] = "aoe",
["Angal Heneng"] = "akh",
["Tiếng Angami"] = "njm",
["Angevin"] = "roa-ang",
["Tiếng Yali Angguruk"] = "yli",
["Angkamuthi"] = "avm",
["Angkola Batak"] = "akb",
["Tiếng Angkula"] = "aus-ang",
["Angloromani"] = "rme",
["Angor"] = "agg",
["Angoram"] = "aog",
["Angosturas Tunebo"] = "tnd",
["Anguthimri"] = "awg",
["Ani Phowa"] = "ypn",
["Animere"] = "anf",
["Anindilyakwa"] = "aoi",
["Anjam"] = "boj",
["Anmatyerre"] = "amx",
["Tiếng Annobón"] = "fab",
["Anong"] = "nun",
["Anor"] = "anj",
["Anserma"] = "ans",
["Ansus"] = "and",
["Antakarinya"] = "ant",
["Antigua and Barbuda Creole English"] = "aig",
["Tiếng Creole Antilles"] = "gcf",
["Anu"] = "anl",
["Anuak"] = "anu",
["Anufo"] = "cko",
["Anus"] = "auq",
["Anuta"] = "aud",
["Anyin Morofo"] = "mtb",
["Tiếng Ao"] = "njo",
["Aoheng"] = "pni",
["Aore"] = "aor",
["Ap Ma"] = "kbx",
["Apalachee"] = "xap",
["Apali"] = "ena",
["Apasco-Apoala Mixtec"] = "mip",
["Tiếng Apatani"] = "apt",
["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",
["Tiếng Arapaho"] = "arp",
["Arapaso"] = "arj",
["Arara-Karo"] = "arr",
["Ararandewára"] = "xaj",
["Arawum"] = "awm",
["Arbore"] = "arv",
["Are"] = "mwc",
["Areba"] = "aea",
["Argentine Sign Language"] = "aed",
["Arguni"] = "agf",
["Arhuaco"] = "arh",
["Arhâ"] = "aqr",
["Arhö"] = "aok",
["Tiếng Ari"] = "aac",
["Aribwatsa"] = "laz",
["Aribwaung"] = "ylu",
["Arifama-Miniafia"] = "aai",
["Arigidi"] = "aqg",
["Arikapú"] = "ark",
["Arikara"] = "ari",
["Arikem"] = "ait",
["Tiếng Arin"] = "xrn",
["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",
["Tiếng Ashkun"] = "ask",
["Asho Chin"] = "csh",
["Asháninka"] = "cni",
["Tiếng Ashéninka Pajonal"] = "cjo",
["Ashéninka Perené"] = "prq",
["Tiếng Asi"] = "bno",
["Asilulu"] = "asl",
["Asoa"] = "asv",
["Assangori"] = "sjg",
["Tiếng Assiniboine"] = "asb",
["Asu"] = "aum",
["Asue Awyu"] = "psa",
["Tiếng Asumboa"] = "aua",
["Asunción Mixtepec Zapotec"] = "zoo",
["Ata"] = "atm",
["Ata Manobo"] = "atd",
["Atakapa"] = "aqp",
["Atampaya"] = "amz",
["Atanques"] = "cba-ata",
["Atatláhuca Mixtec"] = "mib",
["Tiếng Atemble"] = "ate",
["Ateso"] = "teo",
["Ati"] = "atk",
["Atohwaim"] = "aqm",
["Atong (Cameroon)"] = "ato",
["Atorada"] = "aox",
["Tiếng Atsahuaca"] = "atc",
["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",
["Avatime"] = "avn",
["Avau"] = "avb",
["Avava"] = "tmb",
["Avikam"] = "avi",
["Avá-Canoeiro"] = "avv",
["Awa (China)"] = "vwa",
["Awa (New Guinea)"] = "awb",
["Awa-Cuaiquer"] = "kwi",
["Awabakal"] = "awk",
["Awak"] = "awo",
["Awar"] = "aya",
["Awara"] = "awx",
["Awbono"] = "awh",
["Aweer"] = "bob",
["Awera"] = "awr",
["Awetí"] = "awe",
["Tiếng Awjila"] = "auj",
["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",
["Tiếng Me'phaa Azoyú"] = "tpc",
["Baa"] = "kwb",
["Tiếng Baagandji"] = "drl",
["Baan"] = "bvj",
["Baangi"] = "bqx",
["Baatonum"] = "bba",
["Baba"] = "bbw",
["Babango"] = "bbm",
["Babanki"] = "bbk",
["Babine-Witsuwit'en"] = "bcr",
["Babole"] = "bvx",
["Tiếng Bacama"] = "bcy",
["Tiếng Mã Lai Bacan"] = "btj",
["Bada"] = "bhz",
["Bade"] = "bde",
["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",
["Tiếng Bagua"] = "sai-bag",
["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",
["Bajjika"] = "vjk",
["Baka"] = "bkc",
["Bakairí"] = "bkq",
["Bakaka"] = "bqz",
["Baki"] = "bki",
["Bakoko"] = "bkh",
["Bakole"] = "kme",
["Bakpinka"] = "bbs",
["Bakulung"] = "bbu",
["Bakumpai"] = "bkr",
["Tiếng Bakung"] = "xkl",
["Bakwé"] = "bjw",
["Balaesang"] = "bls",
["Balangao"] = "blw",
["Balangingi"] = "sse",
["Tiếng Balantak"] = "blz",
["Balau"] = "blg",
["Baldemu"] = "bdn",
["Bali"] = "bcp",
["Baliledo"] = "poz-bal",
["Balinese Malay"] = "mhp",
["Balkan Romani"] = "rmn",
["Balo"] = "bqo",
["Baloi"] = "biz",
["Balong"] = "bnt-bal",
["Baltic Romani"] = "rml",
["Baluan-Pam"] = "blq",
["Bamako Sign Language"] = "bog",
["Bamali"] = "bbq",
["Bambalang"] = "bmo",
["Bambam"] = "ptu",
["Bambili-Bambui"] = "baw",
["Bamenyam"] = "bce",
["Bamu"] = "bcf",
["Bamukumbit"] = "bqt",
["Bamum"] = "bax",
["Bamunka"] = "bvm",
["Bamwe"] = "bmg",
["Ban Khor Sign Language"] = "bfk",
["Bana"] = "bcw",
["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",
["Tiếng Bandjalang"] = "bdy",
["Bangala"] = "bxg",
["Bangandu"] = "bgf",
["Bangba"] = "bbe",
["Tiếng Banggai"] = "bgz",
["Tiếng Bangi"] = "bni",
["Bangime"] = "dba",
["Bangka"] = "mfb",
["Bangolan"] = "bgj",
["Bangubangu"] = "bnx",
["Bangwinji"] = "bsj",
["Baniva"] = "bvv",
["Baniwa"] = "bwi",
["Banka"] = "bxw",
["Bankan Tey Dogon"] = "dbw",
["Tiếng Bankon"] = "abb",
["Banoni"] = "bcm",
["Bantayanon"] = "bfx",
["Bantik"] = "bnq",
["Banyumasan"] = "map-bms",
["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",
["Tiếng Barikewa"] = "jbk",
["Barngarla"] = "bjb",
["Barok"] = "bjk",
["Tiếng Barombi"] = "bbi",
["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",
["Bassari"] = "bsc",
["Bassossi"] = "bsi",
["Bata"] = "bta",
["Bataan Ayta"] = "ayt",
["Batad Ifugao"] = "ifb",
["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",
["Beaver"] = "bea",
["Beba"] = "bfp",
["Bebe"] = "bzv",
["Bebele"] = "beb",
["Bebeli"] = "bek",
["Bebil"] = "bxp",
["Bedik"] = "tnr",
["Bedjond"] = "bjv",
["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",
["Betta Kurumba"] = "xub",
["Bhadrawahi"] = "bhd",
["Bhalay"] = "bhx",
["Bharia"] = "bha",
["Bhatri"] = "bgw",
["Bhattiyali"] = "bht",
["Bhaya"] = "bhe",
["Bhele"] = "bhy",
["Bhilali"] = "bhi",
["Bhoti Kinnauri"] = "nes",
["Bhunjia"] = "bhu",
["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",
["Tiếng Bilua"] = "blb",
["Bilur"] = "bxf",
["Tiếng Bima"] = "bhp",
["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",
["Tiếng Binukid"] = "bkd",
["Binumarien"] = "bjr",
["Bipi"] = "biq",
["Birgid"] = "brk",
["Birgit"] = "btf",
["Biri"] = "bzr",
["Biritai"] = "bqq",
["Birri"] = "bvq",
["Birrpayi"] = "xbj",
["Birwa"] = "brl",
["Biseni"] = "ije",
["Bishuo"] = "bwh",
["Bisis"] = "bnw",
["Bisorio"] = "bir",
["Tiếng Bissa"] = "bib",
["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",
["Tiếng Gadaba Bodo"] = "gbj",
["Bodo Parja"] = "bdv",
["Bofi"] = "bff",
["Boga"] = "bvw",
["Bogaya"] = "boq",
["Boguru"] = "bqu",
["Tiếng Tân Aram Bohtan"] = "bhn",
["Boikin"] = "bzf",
["Bokha"] = "ybk",
["Boko"] = "bqc",
["Bokoto"] = "bdt",
["Bokyi"] = "bky",
["Tiếng Bola"] = "bnp",
["Bolak"] = "art-blk",
["Bolango"] = "bld",
["Bole"] = "bol",
["Bolgo"] = "bvo",
["Bolia"] = "bli",
["Bolinao"] = "smk",
["Bolivian Sign Language"] = "bvl",
["Tiếng Boloki"] = "bkt",
["Bolon"] = "bof",
["Bolondo"] = "bzm",
["Bolongan"] = "blj",
["Bom"] = "bmf",
["Boma Nkuu"] = "bnt-bon",
["Boma Yumu"] = "bnt-boy",
["Bomboli"] = "bml",
["Bomboma"] = "bws",
["Bomitaba"] = "zmx",
["Bomu"] = "bmq",
["Bomwali"] = "bmw",
["Bon Gula"] = "glc",
["Bondei"] = "bou",
["Bondoukou Kulango"] = "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",
["Botolan Sambal"] = "sbl",
["Bouna Kulango"] = "nku",
["Bourbonnais-Berrichon"] = "roa-bbn",
["Tiếng Bourguignon"] = "roa-brg",
["Bozaba"] = "bzo",
["Bragat"] = "aof",
["Brazilian Sign Language"] = "bzs",
["Brek Karen"] = "kvl",
["Brem"] = "buq",
["Bribri"] = "bzd",
["British Sign Language"] = "bfi",
["Brokkat"] = "bro",
["Brokpake"] = "sgt",
["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",
["Tiếng Bube"] = "bvb",
["Bubi"] = "buw",
["Bubia"] = "bbx",
["Budibud"] = "btp",
["Budong-Budong"] = "bdx",
["Budu"] = "buu",
["Buduma"] = "bdm",
["Budza"] = "bja",
["Buena Vista Yokuts"] = "nai-bvy",
["Buglere"] = "sab",
["Bugun"] = "bgg",
["Buhi'non Bikol"] = "ubl",
["Tiếng Buhid"] = "bku",
["Buhutu"] = "bxh",
["Bujhyal"] = "byh",
["Bukar-Sadung Bidayuh"] = "sdo",
["Bukat"] = "bvk",
["Bukawa"] = "buk",
["Bukit Malay"] = "bvu",
["Bukitan"] = "bkn",
["Bukiyip"] = "ape",
["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",
["Bumthangkha"] = "kjz",
["Bun"] = "buv",
["Buna"] = "bvn",
["Bunaba"] = "bck",
["Bunak"] = "bfn",
["Bunama"] = "bdd",
["Bundeli"] = "bns",
["Bung"] = "bqd",
["Bungain"] = "but",
["Bunganditj"] = "xbg",
["Tiếng Bungku"] = "bkz",
["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",
["Bussa"] = "dox",
["Busuu"] = "bju",
["Butbut Kalinga"] = "kyb",
["Butchulla"] = "xby",
["Butmas-Tur"] = "bnr",
["Tiếng Butuanon"] = "btw",
["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",
["Cajonos Zapotec"] = "zad",
["Caka"] = "ckx",
["Cakchiquel-Quiché Mixed Language"] = "ckz",
["Cakfem-Mushere"] = "cky",
["Calabrian Greek"] = "grk-cal",
["Calamian Tagbanwa"] = "tbk",
["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",
["Camunic"] = "xcc",
["Candoshi-Shapra"] = "cbu",
["Canichana"] = "caz",
["Cao Miao"] = "cov",
["Tiếng Capanahua"] = "kaq",
["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",
["Tiếng Catawba"] = "chc",
["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",
["Tiếng Bạch Trung"] = "bca",
["Central Bontoc"] = "lbk",
["Central Cagayan Agta"] = "agt",
["Tiếng Trung Dusun"] = "dtp",
["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 Puebla Nahuatl"] = "ncx",
["Central Sama"] = "sml",
["Central Siberian Yupik"] = "ess",
["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",
["Chak"] = "ckh",
["Chakali"] = "cli",
["Chala"] = "cll",
["Chaldean Neo-Aramaic"] = "cld",
["Chali"] = "tgf",
["Chamacoco"] = "ceg",
["Chamba Daka"] = "ccg",
["Chamba Leko"] = "ndi",
["Chambri"] = "can",
["Champenois"] = "roa-cha",
["Chang"] = "nbc",
["Changriwa"] = "cga",
["Changthang"] = "cna",
["Chantyal"] = "chx",
["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",
["Chenchu"] = "cde",
["Chenoua"] = "cnu",
["Chepya"] = "ycp",
["Cherepon"] = "cpn",
["Chesu"] = "ych",
["Chetco-Tolowa"] = "ctc",
["Chhintange"] = "ctn",
["Chhulung"] = "cur",
["Chiangmai Sign Language"] = "csd",
["Chiapanec"] = "cip",
["Tiếng Triqui Chicahuaxtla"] = "trs",
["Chichicapan Zapotec"] = "zpv",
["Chichimeca-Jonaz"] = "pei",
["Chichonyi-Chidzihana-Chikauma"] = "coh",
["Chicomuceltec"] = "cob",
["Chiduruma"] = "dug",
["Chigmecatitlán Mixtec"] = "mii",
["Chilcotin"] = "clc",
["Chilean Sign Language"] = "csg",
["Chilisso"] = "clh",
["Chiltepec Chinantec"] = "csa",
["Chimalapa Zoque"] = "zoh",
["Chimariko"] = "cid",
["Chimila"] = "cbg",
["Chimwiini"] = "bnt-cmw",
["Chinali"] = "cih",
["Chinbon Chin"] = "cnb",
["Chinese Pidgin English"] = "cpi",
["Chinese Sign Language"] = "csl",
["Chipaya"] = "cap",
["Chiquihuitlán Mazatec"] = "maq",
["Chiquimulilla"] = "nai-chi",
["Chiquitano"] = "cax",
["Tiếng Chiricahua"] = "apm",
["Chirino"] = "sai-chi",
["Chiripá"] = "nhd",
["Chitimacha"] = "ctm",
["Chitkuli Kinnauri"] = "cik",
["Chitwania Tharu"] = "the",
["Choapan Zapotec"] = "zpc",
["Chochotec"] = "coz",
["Chokri Naga"] = "nri",
["Chokwe"] = "cjk",
["Tiếng Chol"] = "ctu",
["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",
["Tiếng Churah"] = "cdj",
["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",
["Classical Gaelic"] = "ghc",
["Classical Guaraní"] = "gn-cls",
["Classical Mandaic"] = "myz",
["Classical Newar"] = "nwc",
["Classical Quechua"] = "qwc",
["Coahuilteco"] = "xcw",
["Coast Miwok"] = "csi",
["Tiếng Kadazan bờ biển"] = "kzj",
["Coastal Konjo"] = "kjc",
["Coatecas Altas Zapotec"] = "zca",
["Coatepec Nahuatl"] = "naz",
["Coatlán Mixe"] = "mco",
["Coatlán Zapotec"] = "zps",
["Coatzospan Mixtec"] = "miz",
["Tiếng Cocama"] = "cod",
["Tiếng Cochimi"] = "coj",
["Cocopa"] = "coc",
["Cocos Islands Malay"] = "coa",
["Coeruna"] = "sai-coe",
["Coeur d'Alene"] = "crd",
["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",
["Copala Triqui"] = "trc",
["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",
["Tiếng Cowlitz"] = "cow",
["Coyaima"] = "coy",
["Coyotepec Popoloca"] = "pbf",
["Coyutla Totonac"] = "toc",
["Crimean Gothic"] = "gme-cgo",
["Croatian Sign Language"] = "csq",
["Cross River Mbembe"] = "mfn",
["Cruzeño"] = "crz",
["Cuban Sign Language"] = "csf",
["Cubeo"] = "cub",
["Cueva"] = "sai-cva",
["Cuiba"] = "cui",
["Cuitlatec"] = "cuy",
["Culina"] = "cul",
["Culli"] = "sai-cul",
["Cumanagoto"] = "cuo",
["Cumbric"] = "xcb",
["Cun"] = "cuq",
["Cung"] = "cug",
["Curonian"] = "xcu",
["Curripaco"] = "kpc",
["Cutchi-Swahili"] = "ccl",
["Cuvok"] = "cuv",
["Cuyamecalco Mixtec"] = "xtu",
["Tiếng Cuyunon"] = "cyo",
["Cwi Bwamu"] = "bwy",
["Czech Sign Language"] = "cse",
["Tiếng Cống"] = "cnc",
["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",
["Dagba"] = "dgk",
["Dagik"] = "dec",
["Dagoman"] = "dgn",
["Daho-Doo"] = "das",
["Dai"] = "dij",
["Dair"] = "drb",
["Dairi Batak"] = "btd",
["Dakaka"] = "bpa",
["Dakka"] = "dkk",
["Dakpa"] = "dka",
["Daloa Bété"] = "bev",
["Dama (Nigeria)"] = "dmm",
["Dama (Sierra Leone)"] = "dmn-dam",
["Damakawa"] = "dam",
["Damal"] = "uhn",
["Dameli"] = "dml",
["Dampelas"] = "dms",
["Danaru"] = "dnr",
["Dandami Maria"] = "daq",
["Dangaura Tharu"] = "thl",
["Danish Sign Language"] = "dsl",
["Dano"] = "aso",
["Dao"] = "daz",
["Daonda"] = "dnd",
["Dar Daju Daju"] = "djc",
["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",
["Tiếng Deg Xinag"] = "ing",
["Degenan"] = "dge",
["Dehwari"] = "deh",
["Dek"] = "dek",
["Dela-Oenale"] = "row",
["Delo"] = "ntr",
["Delta Yokuts"] = "nai-dly",
["Dem"] = "dem",
["Dema"] = "dmx",
["Demisa"] = "dei",
["Demta"] = "dmy",
["Dena'ina"] = "tfn",
["Dendi"] = "ddn",
["Dengese"] = "dez",
["Dengka"] = "dnk",
["Deno"] = "dbb",
["Denya"] = "anv",
["Dení"] = "dny",
["Deori"] = "der",
["Desano"] = "des",
["Dewas Rai"] = "dwz",
["Dewoin"] = "dee",
["Dezfuli"] = "def",
["Dghwede"] = "dgh",
["Dhaiso"] = "dhs",
["Dhalandji"] = "dhl",
["Dhangu"] = "dhg",
["Dhao"] = "nfa",
["Tiếng Dharug"] = "xdk",
["Dhatki"] = "mki",
["Dhimal"] = "dhi",
["Dhofari Arabic"] = "adf",
["Dhudhuroa"] = "ddr",
["Dhungaloo"] = "dhx",
["Dhurga"] = "dhu",
["Dhuwal"] = "dwu",
["Dhuwaya"] = "dwy",
["Dia"] = "dia",
["Dibiyaso"] = "dby",
["Dibo"] = "dio",
["Dicamay Agta"] = "duy",
["Didinga"] = "did",
["Tiếng Dieri"] = "dif",
["Digo"] = "dig",
["Dii"] = "dur",
["Dijim-Bwilim"] = "cfa",
["Dilling"] = "dil",
["Dima"] = "jma",
["Tiếng Dimasa"] = "dis",
["Dimbong"] = "dii",
["Dime"] = "dim",
["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",
["Djinang"] = "dji",
["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",
["Domaaki"] = "dmk",
["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",
["Tiếng Doteli"] = "dty",
["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",
["Dumi"] = "dus",
["Dumpas"] = "dmv",
["Dumun"] = "dui",
["Duna"] = "duc",
["Dungmali"] = "raa",
["Dungu"] = "dbv",
["Tiếng Agta Dupaningan"] = "duo",
["Dura"] = "drq",
["Duri"] = "mvp",
["Duriankere"] = "dbn",
["Tiếng Duruwa"] = "pci",
["Dusner"] = "dsn",
["Dusun Deyah"] = "dun",
["Dusun Malang"] = "duq",
["Tiếng Dusun Witu"] = "duw",
["Tiếng Hạ Saxon Hà Lan"] = "nds-nl",
["Dutch Sign Language"] = "dse",
["Duupa"] = "dae",
["Duvle"] = "duv",
["Duwai"] = "dbp",
["Duwet"] = "gve",
["Dwang"] = "nnu",
["Dyaabugay"] = "dyy",
["Dyaberdyaber"] = "dyb",
["Dyan"] = "dya",
["Dyangadi"] = "dyn",
["Dyugun"] = "dyd",
["Tiếng Dyula"] = "dyu",
["Dza"] = "jen",
["Dzala"] = "dzl",
["Dzando"] = "dzn",
["Dzao Min"] = "bpn",
["Dzodinka"] = "add",
["Dâw"] = "kwa",
["Tiếng Ai"] = "eee",
["E'ma Buyang"] = "yzg",
["Tiếng Assam cận đại"] = "inc-oas",
["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 Acipa"] = "acp",
["Tiếng Arrernte Đông"] = "aer",
["Eastern Bolivian Guaraní"] = "gui",
["Eastern Canadian Inuktitut"] = "ike",
["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 Kayah"] = "eky",
["Eastern Keres"] = "kee",
["Eastern Krahn"] = "kqo",
["Eastern Lalu"] = "yit",
["Eastern Maninkakan"] = "emk",
["Eastern Meohang"] = "emg",
["Eastern Muria"] = "emu",
["Eastern Ngad'a"] = "nea",
["Eastern Nisu"] = "nos",
["Eastern Ojibwa"] = "ojg",
["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 Ica"] = "ica",
["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",
["Eravallan"] = "era",
["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",
["Falam Chin"] = "cfm",
["Fali"] = "fli",
["Fam"] = "fam",
["Tiếng Fanagalo"] = "fng",
["Fanamaket"] = "bjp",
["Fang (Bantu)"] = "fan",
["Fang (Beboid)"] = "fak",
["Fania"] = "fni",
["Far Western Muria"] = "fmu",
["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",
["Tiếng Foi"] = "foi",
["Foia Foia"] = "ffi",
["Folopa"] = "ppo",
["Foma"] = "fom",
["Fongoro"] = "fgr",
["Foodo"] = "fod",
["Forak"] = "frq",
["Fordata"] = "frd",
["Fore"] = "for",
["Forest Nenets"] = "syd-fne",
["Fortsenal"] = "frt",
["Franc-Comtois"] = "roa-fcm",
["Francisco León Zoque"] = "zos",
["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",
["Gaddi"] = "gbk",
["Gade"] = "ged",
["Gadjerawang"] = "gdh",
["Gadsup"] = "gaj",
["Gafat"] = "gft",
["Gagadu"] = "gbu",
["Gagnoa Bété"] = "btg",
["Gahri"] = "bfu",
["Gaikundi"] = "gbf",
["Gaina"] = "gcn",
["Gal"] = "gap",
["Galambu"] = "glo",
["Galela"] = "gbi",
["Galeya"] = "gar",
["Galice"] = "gce",
["Galindian"] = "xgl",
["Gallaecian"] = "cel-gal",
["Tiếng Gallo"] = "roa-gal",
["Tiếng Gallura"] = "sdn",
["Tiếng Galo"] = "adl",
["Galoli"] = "gal",
["Gambera"] = "gma",
["Gamela"] = "sai-gam",
["Tiếng Gamilaraay"] = "kld",
["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",
["Garhwali"] = "gbm",
["Tiếng Garifuna"] = "cab",
["Garingbal"] = "xgi",
["Garus"] = "gyb",
["Garza"] = "xgr",
["Gashowu"] = "nai-gsy",
["Gaulish"] = "cel-gau",
["Gavak"] = "dmc",
["Gavar"] = "gou",
["Gavião do Jiparaná"] = "gvo",
["Tiếng Gawwada"] = "gwd",
["Tiếng Gayil"] = "gyl",
["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",
["Tiếng Gbiri-Niragu"] = "grh",
["Gboloo Grebo"] = "gec",
["Gciriku"] = "diu",
["Gcwi"] = "gwj",
["Ge"] = "hmj",
["Gebe"] = "gei",
["Gedaged"] = "gdd",
["Geji"] = "gji",
["Gela"] = "nlg",
["Gelao"] = "gio",
["Gele'"] = "sbc",
["Geme"] = "geq",
["Gen"] = "gej",
["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",
["Ghomara"] = "gho",
["Tiếng Ghotuo"] = "aaa",
["Ghulfan"] = "ghl",
["Giangan"] = "bgi",
["Gibanawa"] = "gib",
["Gidar"] = "gid",
["Gikyode"] = "acd",
["Gilima"] = "gix",
["Gimi (Austronesian)"] = "gip",
["Gimme"] = "kmp",
["Gimnime"] = "gmn",
["Ginuman"] = "gnm",
["Girawa"] = "bbr",
["Giryama"] = "nyf",
["Githabul"] = "gih",
["Gitua"] = "ggt",
["Gitxsan"] = "git",
["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",
["Gojri"] = "gju",
["Gokana"] = "gkn",
["Gokhy"] = "sit-gkh",
["Gola"] = "gol",
["Golin"] = "gvf",
["Golpa"] = "lja",
["Gondi"] = "gon",
["Gongduk"] = "goe",
["Gonja"] = "gjn",
["Goo"] = "gov",
["Tiếng Gooniyandi"] = "gni",
["Gor"] = "gqr",
["Gorakor"] = "goc",
["Gorap"] = "goq",
["Goreng"] = "xgg",
["Tiếng Gorontalo"] = "gor",
["Gorovu"] = "grq",
["Gottscheerish"] = "gmw-gts",
["Goundo"] = "goy",
["Gourmanchéma"] = "gux",
["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 Kpelle"] = "gkp",
["Guinea-Bissau Creole"] = "pov",
["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",
["Gur Lama"] = "las",
["Guragone"] = "gge",
["Guramalum"] = "grz",
["Tiếng Goran"] = "hac",
["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",
["Gutnish"] = "gmq-gut",
["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",
["Haisla"] = "has",
["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",
["Harijan Kinnauri"] = "kjo",
["Tiếng Harsusi"] = "hss",
["Haruai"] = "tmd",
["Haruku"] = "hrk",
["Haryanvi"] = "bgc",
["Harzani"] = "hrz",
["Hasaitic"] = "sem-has",
["Hasha"] = "ybj",
["Hassaniya Arabic"] = "mey",
["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",
["Heiban"] = "hbn",
["Helong"] = "heg",
["Helu"] = "elu-prk",
["Hema"] = "nix",
["Hemba"] = "hem",
["Herdé"] = "hed",
["Hermit"] = "llf",
["Tiếng Hernici"] = "xhr",
["Hewa"] = "ham",
["Heyo"] = "auk",
["Hibito"] = "hib",
["Hidatsa"] = "hid",
["Highland Konjo"] = "kjk",
["Highland Oaxaca Chontal"] = "chd",
["Highland Puebla Nahuatl"] = "azz",
["Tiếng Totonac cao nguyên"] = "tos",
["Hijuk"] = "hij",
["Hill Maria"] = "mrr",
["Himarimã"] = "hir",
["Himyaritic"] = "sem-him",
["Hindi Dogri"] = "dgo",
["Hinduri"] = "hii",
["Hinukh"] = "gin",
["Hismaic"] = "sem-his",
["Hitchiti"] = "nai-hit",
["Hitu"] = "htu",
["Hiw"] = "hiw",
["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",
["Holiya"] = "hoy",
["Holma"] = "hod",
["Holoholo"] = "hoo",
["Holu"] = "hol",
["Homa"] = "hom",
["Honduran Lenca"] = "len",
["Honduras Sign Language"] = "hds",
["Hone"] = "juh",
["Hong Kong Sign Language"] = "hks",
["Honi"] = "how",
["Tiếng Hopi"] = "hop",
["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",
["Humburi Senni"] = "hmb",
["Humene"] = "huf",
["Hun"] = "uth",
["Hunde"] = "hke",
["Hungana"] = "hum",
["Hungarian Sign Language"] = "hsh",
["Hungworo"] = "nat",
["Hunjara-Kaina Ke"] = "hkk",
["Hunnic"] = "xhc",
["Hupdë"] = "jup",
["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",
["Tiếng Ibanag"] = "ibg",
["Ibani"] = "iby",
["Iberian"] = "xib",
["Iboko"] = "bkp",
["Ibu"] = "ibu",
["Icelandic Sign Language"] = "icl",
["Iceve-Maci"] = "bec",
["Tiếng Ida'an"] = "dbj",
["Idakho-Isukha-Tiriki"] = "ida",
["Idaté"] = "idt",
["Idere"] = "ide",
["Idesa"] = "ids",
["Idi"] = "idi",
["Idoma"] = "idu",
["Idon"] = "idc",
["Tiếng Idu"] = "clk",
["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",
["Ikposo"] = "kpo",
["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",
["Inuvialuktun"] = "ikt",
["Ipai"] = "nai-ipa",
["Ipalapa Amuzgo"] = "azm",
["Ipiko"] = "ipo",
["Ipili"] = "ipi",
["Ipulo"] = "ass",
["Iquito"] = "iqu",
["Ir"] = "irr",
["Irantxe"] = "irn",
["Iranun"] = "ill",
["Tiếng Ả Rập Iraq"] = "acm",
["Irarutu"] = "irh",
["Iraya"] = "iry",
["Iresim"] = "ire",
["Iriga Bicolano"] = "bto",
["Irish Sign Language"] = "isg",
["Tiếng Irula"] = "iru",
["Isabi"] = "isa",
["Isanzu"] = "isn",
["Isarog Agta"] = "agk",
["Isaurian"] = "und-isa",
["Isconahua"] = "isc",
["Isebe"] = "igo",
["Ishkashimi"] = "isk",
["Isinai"] = "inn",
["Isirawa"] = "srl",
["Islander Creole English"] = "icr",
["Israeli Sign Language"] = "isr",
["Isthmus Mixe"] = "mir",
["Tiếng Zapotec Isthmus"] = "zai",
["Isu"] = "isu",
["Isubu"] = "szv",
["Italian Sign Language"] = "ise",
["Itawit"] = "itv",
["Itene"] = "ite",
["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",
["Tiếng Izon"] = "ijc",
["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",
["Jaunsari"] = "jns",
["Jawe"] = "jaz",
["Jaya"] = "jyy",
["Jebero"] = "jeb",
["Jeikó"] = "sai-jko",
["Tiếng Jemez"] = "tow",
["Jenaama Bozo"] = "bze",
["Jeng"] = "jeg",
["Jennu Kurumba"] = "xuj",
["Jere"] = "jer",
["Jeri Kuo"] = "jek",
["Jerung"] = "jee",
["Jhankot Sign Language"] = "jhs",
["Jiamao"] = "jio",
["Jiba"] = "juo",
["Jibu"] = "jib",
["Tiếng Jicarilla"] = "apj",
["Jilbe"] = "jie",
["Jili"] = "mgi",
["Jilim"] = "jil",
["Jimi"] = "jmi",
["Jimjimen"] = "jim",
["Tiếng Tấn"] = "cjy",
["Jina"] = "jia",
["Jingulu"] = "jig",
["Jiongnai Bunu"] = "pnu",
["Jirajara"] = "sai-jrj",
["Jirel"] = "jul",
["Jiru"] = "jrr",
["Jita"] = "jit",
["Jju"] = "kaj",
["Joba"] = "job",
["Jofotek-Bromnya"] = "jbr",
["Jola-Fonyi"] = "dyo",
["Jola-Kasa"] = "csk",
["Jonkor Bourmataguil"] = "jeu",
["Jordanian Sign Language"] = "jos",
["Jorá"] = "jor",
["Jowulu"] = "jow",
["Ju"] = "juu",
["Jukun Takum"] = "jbu",
["Tiếng Jumaytepeque"] = "nai-jum",
["Jumla Sign Language"] = "jus",
["Jumli"] = "jml",
["Jungle Inga"] = "inj",
["Juquila Mixe"] = "mxq",
["Jur Modo"] = "bex",
["Tiếng Juray"] = "juy",
["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",
["Tiếng Kabuverdianu"] = "kea",
["Kabwa"] = "cwa",
["Kabwari"] = "kcw",
["Tiếng Kachama-Ganjule"] = "kcx",
["Kachari"] = "xac",
["Kachi Koli"] = "gjk",
["Kacipo-Balesi"] = "koe",
["Kaco'"] = "xkk",
["Kadai"] = "kzd",
["Kadar"] = "kej",
["Kadara"] = "kad",
["Kadaru"] = "kdu",
["Kadiwéu"] = "kbc",
["Kado"] = "kdv",
["Kadugli"] = "xtc",
["Kaduo"] = "ktp",
["Kaera"] = "jka",
["Kafoa"] = "kpu",
["Kagan Kalagan"] = "kll",
["Kagate"] = "syw",
["Tiếng Kagayanen"] = "cgc",
["Kagoma"] = "kdm",
["Kagoro"] = "xkg",
["Kagulu"] = "kki",
["Kahe"] = "hka",
["Kahua"] = "agw",
["Kaian"] = "kct",
["Kaibobo"] = "kzb",
["Kaidipang"] = "kzp",
["Kaiep"] = "kbw",
["Kaikadi"] = "kep",
["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",
["Tiếng Kaki Ae"] = "tbd",
["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",
["Kalkoti"] = "xka",
["Kalou"] = "ywa",
["Kaluli"] = "bco",
["Kalumpang"] = "kli",
["Kam"] = "kdx",
["Kamakan"] = "vkm",
["Kamang"] = "woi",
["Kamano"] = "kbq",
["Kamantan"] = "kci",
["Kamar"] = "keq",
["Kamara"] = "jmr",
["Kamarian"] = "kzx",
["Kamaru"] = "kgx",
["Kamarupi Prakrit"] = "inc-kam",
["Kamasa"] = "klp",
["Kamasau"] = "kms",
["Tiếng Kamayo"] = "kyk",
["Kamayurá"] = "kay",
["Kamba"] = "kam",
["Kambaira"] = "kyy",
["Tiếng Kambera"] = "xbr",
["Kamberataro"] = "kbv",
["Kamberau"] = "irx",
["Kambiwá"] = "xbw",
["Kami"] = "kmi",
["Kamkata-viri"] = "bsh",
["Kamo"] = "kcq",
["Kamoro"] = "kgq",
["Kamu"] = "xmu",
["Tiếng Kamula"] = "xla",
["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",
["Kangri"] = "xnr",
["Kaniet"] = "ktk",
["Kanikkaran"] = "kev",
["Kaningdon-Nindem"] = "kdp",
["Kaningi"] = "kzo",
["Kaningra"] = "knr",
["Kaninuwa"] = "wat",
["Kanite"] = "kmu",
["Kanjari"] = "kft",
["Kanju"] = "kbe",
["Tiếng Kankanaey"] = "kne",
["Kannada Kurumba"] = "kfi",
["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",
["Tiếng Kaqchikel"] = "cak",
["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",
["Tiếng Karekare"] = "kai",
["Karey"] = "kyd",
["Kari"] = "kbj",
["Karingani"] = "kgn",
["Karipuna"] = "kuq",
["Karipúna"] = "kgm",
["Karipúna Creole French"] = "kmv",
["Tiếng Kariri"] = "kzw",
["Tiếng Karitiâna"] = "ktn",
["Kariya"] = "kil",
["Kariyarra"] = "vka",
["Karkar-Yuri"] = "yuj",
["Karkin"] = "krb",
["Karko"] = "kko",
["Karnai"] = "bbv",
["Karo"] = "kxh",
["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",
["Tiếng Kaurna"] = "zku",
["Kauwera"] = "xau",
["Kawacha"] = "kcb",
["Kawaiisu"] = "xaw",
["Kawe"] = "kgb",
["Kawishana"] = "awd-kaw",
["Kaxararí"] = "ktx",
["Kaxuyana"] = "kbb",
["Kaya"] = "zra",
["Kayabí"] = "kyz",
["Kayagar"] = "kyt",
["Kayan"] = "pdu",
["Kayan Mahakam"] = "xay",
["Kayan River Kayan"] = "xkn",
["Tiếng Kalanguya"] = "kak",
["Kayardild"] = "gyd",
["Kayeli"] = "kzl",
["Kaytetye"] = "gbb",
["Kayupulau"] = "kzu",
["Kazukuru"] = "kzk",
["Ke'o"] = "xxk",
["Keak"] = "keh",
["Keapara"] = "khz",
["Kedah Malay"] = "meo",
["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",
["Kenyang"] = "ken",
["Kenyi"] = "lke",
["Keoru-Ahia"] = "xeu",
["Kepkiriwát"] = "kpn",
["Kepo'"] = "kuk",
["Kera"] = "ker",
["Kerak"] = "hhr",
["Kereho"] = "xke",
["Kerek"] = "krk",
["Kerewe"] = "ked",
["Kerewo"] = "kxz",
["Kerinci"] = "kvr",
["Tiếng Kerman"] = "xme-ker",
["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",
["Tiếng Kholosi"] = "inc-kho",
["Khotanese"] = "kho",
["Khroskyabs"] = "jiq",
["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",
["Kim"] = "kia",
["Kimaama"] = "kig",
["Kimaragang"] = "kqr",
["Kimbu"] = "kiv",
["Kimki"] = "sbt",
["Kimré"] = "kqp",
["Kinabalian"] = "cbw",
["Kinalakna"] = "kco",
["Tiếng Kinaray-a"] = "krj",
["Kinga"] = "zga",
["Kings River Yokuts"] = "nai-kry",
["Kinikinao"] = "gqn",
["Tiếng Kinnaur"] = "kfk",
["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",
["Tiếng Koalib"] = "kib",
["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",
["Kui (Ấn Độ)"] = "kxu",
["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",
["Tiếng Komi-Yazva"] = "urj-kya",
["Kominimung"] = "xoi",
["Komo"] = "xom",
["Tiếng Komodo"] = "kvh",
["Kompane"] = "kvp",
["Komyandaret"] = "kzv",
["Kon Keu"] = "kkn",
["Konabéré"] = "bbo",
["Konai"] = "kxw",
["Konda"] = "knd",
["Konda-Dora"] = "kfc",
["Kondekor"] = "gau",
["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",
["Tiếng Korwa"] = "kfp",
["Kosadle"] = "kiq",
["Kosarek Yale"] = "kkl",
["Kosena"] = "kze",
["Koshin"] = "kid",
["Kota (Gabon)"] = "koq",
["Kota (India)"] = "kfe",
["Kota Bangun Kutai Malay"] = "mqg",
["Kota Marudu Talantang"] = "grm",
["Kota Marudu Tinagas"] = "ktr",
["Kotafon Gbe"] = "kqk",
["Koti"] = "eko",
["Tiếng Kott"] = "zko",
["Kou"] = "snz",
["Kouya"] = "kyf",
["Kovai"] = "kqb",
["Kove"] = "kvc",
["Kowaki"] = "xow",
["Kowiai"] = "kwh",
["Koy Sanjaq Surat"] = "kqd",
["Koya"] = "kff",
["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",
["Kresh"] = "krs",
["Krevinian"] = "zkv",
["Kreye"] = "xre",
["Krikati-Timbira"] = "xri",
["Krim"] = "krm",
["Tiếng Kriol Úc"] = "rop",
["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",
["Tiếng Kudiya"] = "kfg",
["Kudu-Camo"] = "kov",
["Kugama"] = "kow",
["Kugbo"] = "kes",
["Kugu-Muminh"] = "xmh",
["Kui (India)"] = "kxu",
["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",
["Tiếng Kumeyaay"] = "nai-kum",
["Kumhali"] = "kra",
["Kumu"] = "kmw",
["Kumukio"] = "kuo",
["Tiếng Kuna"] = "cuk",
["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",
["Kuo"] = "xuo",
["Kuot"] = "kto",
["Kupa"] = "kug",
["Kupang Malay"] = "mkn",
["Kupia"] = "key",
["Kupsabiny"] = "kpz",
["Kur"] = "kuv",
["Kura Ede Nago"] = "nqk",
["Kurama"] = "krh",
["Kuranko"] = "knk",
["Kuri"] = "nbn",
["Kuria"] = "kuj",
["Kurichiya"] = "kfh",
["Kurmukar"] = "kfv",
["Kurnai"] = "unn",
["Kurrama"] = "vku",
["Kurti"] = "ktm",
["Kurtjar"] = "gdj",
["Kurudu"] = "kjr",
["Kurukh"] = "kru",
["Kuruáya"] = "kyr",
["Kusaal"] = "kus",
["Kusaghe"] = "ksg",
["Kushi"] = "kuh",
["Kustenau"] = "awd-kus",
["Kusu"] = "ksv",
["Kusunda"] = "kgg",
["Kutang Ghale"] = "ght",
["Tiếng Ktunaxa"] = "kut",
["Kutep"] = "kub",
["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",
["Tiếng Kven"] = "fkv",
["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",
["Kwanja"] = "knp",
["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",
["Tiếng Kwinti"] = "kww",
["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",
["Tiếng Laalaa"] = "cae",
["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",
["Laha (Vietnam)"] = "lha",
["Lahanan"] = "lhn",
["Lahta Karen"] = "kvt",
["Lahu Shi"] = "lhi",
["Lahul Lohar"] = "lhl",
["Lai"] = "cnh",
["Laimbue"] = "lmx",
["Laitu Chin"] = "clj",
["Laiyolo"] = "lji",
["Laka"] = "lak",
["Tiếng Lakalei"] = "lka",
["Lake Miwok"] = "lmw",
["Lakha"] = "lkh",
["Laki"] = "lki",
["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",
["Tiếng Bạch Lạp Mã"] = "lay",
["Lamaholot"] = "slp",
["Lamalera"] = "lmr",
["Lamang"] = "hia",
["Lamatuka"] = "lmq",
["Lamba"] = "lam",
["Lambichhong"] = "lmh",
["Lambya"] = "lai",
["Lame"] = "bma",
["Lamenu"] = "lmu",
["Lamet"] = "lbn",
["Lamja-Dengsa-Tola"] = "ldh",
["Lamkang"] = "lmk",
["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",
["Tiếng Lutuv"] = "clt",
["Lavatbura-Lamusong"] = "lbv",
["Lawangan"] = "lbx",
["Tiếng Lawi"] = "lvi",
["Lawu"] = "lwu",
["Lawunuia"] = "tgi",
["Layakha"] = "lya",
["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",
["Lelemi"] = "lef",
["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",
["Tiếng León"] = "roa-leo",
["Lepki"] = "lpe",
["Lere"] = "gnh",
["Lese"] = "les",
["Lesing-Gelimi"] = "let",
["Letemboi"] = "nms",
["Leti (Cameroon)"] = "leo",
["Leti (Indonesia)"] = "lti",
["Levuka"] = "lvu",
["Lewo"] = "lww",
["Lewo Eleng"] = "lwe",
["Lewotobi"] = "lwt",
["Leyigha"] = "ayi",
["Lhokpu"] = "lhp",
["Li'o"] = "ljl",
["Liana-Seti"] = "ste",
["Liangmai Naga"] = "njn",
["Liberia Kpelle"] = "xpe",
["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",
["Limbum"] = "lmp",
["Limi"] = "ylm",
["Limilngan"] = "lmc",
["Tiếng Lindu"] = "klw",
["Linear A"] = "lab",
["Tiếng Lâm Cao"] = "onb",
["Lingkhim"] = "lii",
["Lingua Franca Nova"] = "lfn",
["Linngithigh"] = "lnj",
["Tiếng Lipan"] = "apl",
["Lipo"] = "lpo",
["Lisabata-Nuniali"] = "lcs",
["Lisela"] = "lcl",
["Lish"] = "lsh",
["Lishán Didán"] = "trg",
["Literary Chinese"] = "lzh",
["Lithuanian Sign Language"] = "lls",
["Little Swanport"] = "aus-lsw",
["Litzlitz"] = "lzl",
["Lizu"] = "sit-liz",
["Lo-Toga"] = "lht",
["Loarki"] = "lrk",
["Lobala"] = "loq",
["Lobi"] = "lob",
["Lodhi"] = "lbm",
["Logba"] = "lgq",
["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",
["Loma"] = "lom",
["Lomaiviti"] = "lmv",
["Lomakka"] = "loi",
["Lomavren"] = "rmi",
["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",
["Tiếng Lorrain"] = "roa-lor",
["Lote"] = "uvl",
["Lotha Naga"] = "njh",
["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",
["Tiếng Hạ Tanana"] = "taa",
["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",
["Tiếng Lucumí"] = "luq",
["Lufu"] = "ldq",
["Lugbara"] = "lgg",
["Luguru"] = "ruf",
["Luhu"] = "lcq",
["Tiếng Luhya"] = "luy",
["Luimbi"] = "lum",
["Luiseño"] = "lui",
["Lukpa"] = "dop",
["Lule"] = "ule",
["Lule Sami"] = "smj",
["Lumba-Yakkha"] = "luu",
["Lumbee"] = "lmz",
["Lumbu"] = "lup",
["Lumun"] = "lmd",
["Lun Bawang"] = "lnd",
["Luna"] = "luj",
["Lunanakha"] = "luk",
["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"] = "bnt-lwl",
["Tiếng Lycia"] = "xlc",
["Lyélé"] = "lee",
["Láadan"] = "ldn",
["Láá Láá Bwamu"] = "bwj",
["Ma"] = "msj",
["Ma Manda"] = "skc",
["Ma'di"] = "mhi",
["Ma'ya"] = "slz",
["Tiếng Maay"] = "ymm",
["Maba"] = "mqa",
["Mabaale"] = "mmz",
["Tiếng Mabaan"] = "mfz",
["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",
["Magahat"] = "mtw",
["Tiếng Magaha"] = "mag",
["Magdalena Peñasco Mixtec"] = "xtm",
["Magiyi"] = "gmg",
["Magoma"] = "gmx",
["Magɨ"] = "gkd",
["Mahasu Pahari"] = "bfz",
["Mahican"] = "mjy",
["Mahongwe"] = "mhb",
["Mahou"] = "mxx",
["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",
["Majang"] = "mpe",
["Majera"] = "xmj",
["Tiếng Majhi"] = "mjz",
["Majhwar"] = "mmj",
["Mak (China)"] = "mkg",
["Mak (Nigeria)"] = "pbl",
["Makaa"] = "mcp",
["Makah"] = "myh",
["Makalero"] = "mjb",
["Makasae"] = "mkz",
["Tiếng Makassar"] = "mak",
["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"] = "mlf",
["Mal Paharia"] = "mkb",
["Mala (New Guinea)"] = "ped",
["Mala (Nigeria)"] = "ruy",
["Mala Malasar"] = "ima",
["Malaccan Creole Malay"] = "ccm",
["Malalamai"] = "mmt",
["Malalí"] = "sai-mal",
["Malango"] = "mln",
["Malankuravan"] = "mjo",
["Malapandaram"] = "mjp",
["Malaryan"] = "mjq",
["Malas"] = "mkr",
["Malasanga"] = "mqz",
["Malasar"] = "ymr",
["Malavedan"] = "mjr",
["Malawi Lomwe"] = "lon",
["Malawian Sign Language"] = "lws",
["Malayic Dayak"] = "xdy",
["Malaynon"] = "mlz",
["Malaysian Sign Language"] = "xml",
["Malba Birifor"] = "bfo",
["Male"] = "mdc",
["Tiếng Malecite-Passamaquoddy"] = "pqm",
["Maleu-Kilenge"] = "mgl",
["Malfaxal"] = "mlx",
["Malgana"] = "vml",
["Malgbe"] = "mxf",
["Mali"] = "gcc",
["Malibu"] = "sai-mlb",
["Malila"] = "mgq",
["Malimba"] = "mzd",
["Malimpung"] = "mli",
["Malinaltepec Tlapanec"] = "tcf",
["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",
["Mamara Senoufo"] = "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",
["Tiếng Mandahuaca"] = "mht",
["Mandaic"] = "mid",
["Mandailing Batak"] = "btm",
["Mandalorian"] = "art-man",
["Mandan"] = "mhq",
["Mandandanyi"] = "zmk",
["Mandar"] = "mdr",
["Mandari"] = "mqu",
["Mandeali"] = "mjl",
["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",
["Mango"] = "mge",
["Mangole"] = "mqc",
["Mangseng"] = "mbh",
["Manigri-Kambolé Ede Nago"] = "xkb",
["Manikion"] = "mnx",
["Manipa"] = "mqp",
["Mankiyali"] = "nlm",
["Manna-Dora"] = "mju",
["Tiếng Mannan"] = "mjv",
["Manombai"] = "woo",
["Tiếng Mansaka"] = "msk",
["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",
["Mapos Buang"] = "bzh",
["Mapoyo"] = "mcg",
["Mapun"] = "sjm",
["Mara"] = "mec",
["Mara Chin"] = "mrh",
["Marachi"] = "lri",
["Maraghei"] = "vmh",
["Maragus"] = "mrs",
["Maram Naga"] = "nma",
["Marama"] = "lrm",
["Tiếng Maranao"] = "mrw",
["Maranungku"] = "zmr",
["Mararit"] = "mgb",
["Maratino"] = "sai-mar",
["Marau"] = "mvr",
["Marawan"] = "awd-mar",
["Marba"] = "mpg",
["Marenje"] = "vmr",
["Marfa"] = "mvu",
["Margany"] = "zmc",
["Marghi South"] = "mfm",
["Margi"] = "mrt",
["Maria"] = "mds",
["Mariaté"] = "awd-mrt",
["Tiếng Maricopa"] = "mrc",
["Maridan"] = "zmd",
["Maridjabin"] = "zmj",
["Marik"] = "dad",
["Marimanindji"] = "zmm",
["Marind"] = "mrz",
["Maring"] = "mbw",
["Maring Naga"] = "nng",
["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",
["Marrucinian"] = "umc",
["Marsian"] = "ims",
["Martha's Vineyard Sign Language"] = "mre",
["Marti Ke"] = "zmg",
["Martu Wangka"] = "mpj",
["Tiếng Martuthunira"] = "vma",
["Marúbo"] = "mzr",
["Masaba"] = "myx",
["Masadiit Itneg"] = "tis",
["Masakará"] = "sai-msk",
["Masalit"] = "mls",
["Masana"] = "mcn",
["Masbate Sorsogon"] = "bks",
["Tiếng Masbatenyo"] = "msb",
["Mashco Piro"] = "cuj",
["Mashi"] = "mho",
["Masimasi"] = "ism",
["Masiwang"] = "bnf",
["Maskelynes"] = "klv",
["Maslam"] = "msv",
["Masmaje"] = "mes",
["Massachusett"] = "wam",
["Massalat"] = "mdg",
["Massep"] = "mvs",
["Matagalpa"] = "mtn",
["Tiếng Matal"] = "mfh",
["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",
["Maung"] = "mph",
["Tiếng Creole Mauritius"] = "mfe",
["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",
["Media Lengua"] = "mue",
["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",
["Tiếng Melo"] = "mfx",
["Melpa"] = "med",
["Mendalam Kayan"] = "xkd",
["Mendankwe-Nkwen"] = "mfd",
["Mengaka"] = "xmg",
["Mengen"] = "mee",
["Menien"] = "sai-men",
["Menka"] = "mea",
["Tiếng Menominee"] = "mez",
["Tiếng Mentawai"] = "mwv",
["Menya"] = "mcr",
["Meoswar"] = "mvx",
["Mer"] = "mnu",
["Meramera"] = "mxm",
["Merei"] = "lmb",
["Merey"] = "meq",
["Merlav"] = "mrm",
["Meroitic"] = "xmr",
["Meru"] = "mer",
["Tiếng Mesaka"] = "iyo",
["Mese"] = "mci",
["Mesme"] = "zim",
["Mesmes"] = "mys",
["Mesqan"] = "mvz",
["Messapic"] = "cms",
["Meta'"] = "mgo",
["Metlatónoc Mixtec"] = "mxv",
["Mewari"] = "mtr",
["Mewati"] = "wtm",
["Mexican Sign Language"] = "mfs",
["Meyah"] = "mej",
["Mezontla Popoloca"] = "pbe",
["Tiếng Meänkieli"] = "fit",
["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",
["Middle Cornish"] = "cnx",
["Middle Gujarati"] = "inc-mgu",
["Middle Kannada"] = "dra-mkn",
["Middle Median"] = "xme-mid",
["Middle Newar"] = "nwx",
["Middle Norwegian"] = "gmq-mno",
["Middle Oriya"] = "inc-mor",
["Middle Watut"] = "mpl",
["Tiếng Wales trung đại"] = "wlm",
["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",
["Tiếng Minangkabau"] = "min",
["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",
["Mirgan"] = "zrg",
["Miriti"] = "mmv",
["Miriwoong Sign Language"] = "rsm",
["Miriwung"] = "mep",
["Mirpur Panjabi"] = "pmu",
["Misantla Totonac"] = "tlc",
["Miship"] = "mjs",
["Misima-Paneati"] = "mpx",
["Mising"] = "mrg",
["Tiếng Miskito"] = "miq",
["Mitla Zapotec"] = "zaw",
["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",
["Mlahsö"] = "lhs",
["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",
["Mohegan-Pequot"] = "xpq",
["Moi (Congo)"] = "mow",
["Moi (Indonesia)"] = "mxn",
["Moikodi"] = "mkp",
["Moingi"] = "mwz",
["Mojave"] = "mov",
["Moji"] = "ymi",
["Mok"] = "mqt",
["Mokerang"] = "mft",
["Mokole"] = "mkl",
["Mokpwe"] = "bri",
["Molale"] = "mbe",
["Tiếng Molbog"] = "pwm",
["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",
["Tiếng Mongo"] = "lol",
["Mongol"] = "mgt",
["Mongolian Sign Language"] = "msr",
["Tiếng Mongondow"] = "mog",
["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",
["Moose Cree"] = "crm",
["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",
["Moro"] = "mor",
["Moroccan Amazigh"] = "zgh",
["Moroccan Sign Language"] = "xms",
["Morom"] = "bdo",
["Moronene"] = "mqn",
["Morori"] = "mok",
["Morouas"] = "mrp",
["Mortlockese"] = "mrl",
["Moru"] = "mgd",
["Mosimo"] = "mqv",
["Moskona"] = "mtj",
["Mota"] = "mtt",
["Motembo"] = "tmv",
["Mouk-Aria"] = "mwh",
["Mount Iraya Agta"] = "atl",
["Mount Iriga Agta"] = "agz",
["Mountain Koiari"] = "kpx",
["Mouwase"] = "jmw",
["Movima"] = "mzp",
["Moyadan Itneg"] = "ity",
["Moyon Naga"] = "nmo",
["Mozambican Sign Language"] = "mzy",
["Mpade"] = "mpi",
["Mpalitjanh"] = "xpj",
["Mpi"] = "mpz",
["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",
["Tiếng Mudburra"] = "dmw",
["Muduapa"] = "wiv",
["Muduga"] = "udg",
["Muellama"] = "sai-mue",
["Mufian"] = "aoj",
["Muher"] = "sem-mhr",
["Muinane"] = "bmr",
["Mukha-Dora"] = "mmk",
["Mukulu"] = "moz",
["Mulaha"] = "mfw",
["Mulam"] = "mlm",
["Mulao"] = "giu",
["Mullu Kurumba"] = "kpb",
["Mullukmulluk"] = "mpb",
["Muluridyi"] = "vmu",
["Mum"] = "kqa",
["Mumuye"] = "mzm",
["Tiếng Muna"] = "mnb",
["Munda"] = "unx",
["Tiếng Mundabli"] = "boe",
["Mundang"] = "mua",
["Mundani"] = "mnf",
["Mundat"] = "mmf",
["Mundolinco"] = "art-mun",
["Mundurukú"] = "myu",
["Mungaka"] = "mhk",
["Mungbam"] = "mij",
["Munggui"] = "mth",
["Mungkip"] = "mpv",
["Muniche"] = "myr",
["Munit"] = "mtc",
["Tiếng Munsee"] = "umu",
["Mur Pano"] = "tkv",
["Muratayak"] = "asx",
["Murik (Malaysia)"] = "mxr",
["Murik (New Guinea)"] = "mtf",
["Murkim"] = "rmh",
["Murle"] = "mur",
["Murrinh-Patha"] = "mwf",
["Murui Huitoto"] = "huu",
["Murupi"] = "mqw",
["Muruwari"] = "zmu",
["Musan"] = "mmp",
["Musar"] = "mmi",
["Musasa"] = "smm",
["Musey"] = "mse",
["Musgu"] = "mug",
["Tiếng Musi"] = "mui",
["Muskum"] = "mje",
["Musom"] = "msu",
["Mussau-Emira"] = "emi",
["Muthuvan"] = "muv",
["Mutu"] = "tuc",
["Muya"] = "mvm",
["Muyang"] = "muy",
["Muyuw"] = "myw",
["Muzi"] = "ymz",
["Muzo"] = "sai-muz",
["Mvanip"] = "mcj",
["Mvuba"] = "mxh",
["Mwaghavul"] = "sur",
["Mwali Comorian"] = "wlc",
["Tiếng Mwan"] = "moa",
["Mwani"] = "wmw",
["Mwatebu"] = "mwa",
["Mwera"] = "mwe",
["Mwimbi-Muthambi"] = "mws",
["Mycenaean Greek"] = "gmy",
["Myene"] = "mye",
["Mysian"] = "yms",
["Mzieme Naga"] = "nme",
["Mághdì"] = "gmd",
["Tiếng Mòcheno"] = "mhn",
["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",
["Tiếng Nafaanra"] = "nfr",
["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",
["Tiếng Nambikwara"] = "nab",
["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",
["Nankina"] = "nnk",
["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",
["Naskapi"] = "nsk",
["Nasu"] = "ywq",
["Natagaimas"] = "nts",
["Natchez"] = "ncz",
["Nateni"] = "ntm",
["Nathembo"] = "nte",
["Natioro"] = "nti",
["Natú"] = "sai-nat",
["Natügu"] = "ntu",
["Nauete"] = "nxa",
["Naukanski"] = "ynk",
["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",
["Ndau"] = "ndc",
["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",
["Tiếng Ngadha"] = "nxg",
["Ngadjunmaya"] = "nju",
["Ngadjuri"] = "jui",
["Ngaing"] = "nnf",
["Ngaju"] = "nij",
["Ngala"] = "nud",
["Ngalakan"] = "nig",
["Ngalkbun"] = "ngk",
["Ngam"] = "nmc",
["Ngamambo"] = "nbv",
["Ngambay"] = "sba",
["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",
["Tiếng Ngiyambaa"] = "wyb",
["Ngizim"] = "ngi",
["Ngkoth"] = "aus-ngk",
["Ngkâlmpw Kanum"] = "kcd",
["Ngochang"] = "tbq-ngo",
["Ngom"] = "nra",
["Ngombale"] = "nla",
["Ngombe (Central African Republic)"] = "nmj",
["Tiếng Ngombe (Congo)"] = "ngc",
["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",
["Nisga'a"] = "ncg",
["Nisi"] = "yso",
["Niuafo'ou"] = "num",
["Niuatoputapu"] = "nkp",
["Tiếng Nivaclé"] = "cag",
["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",
["Nobonob"] = "gaw",
["Nocamán"] = "nom",
["Nocte Naga"] = "njb",
["Noiri"] = "noi",
["Nokuku"] = "nkk",
["Nomaande"] = "lem",
["Nomane"] = "nof",
["Nomatsiguenga"] = "not",
["Nomlaki"] = "nol",
["Nomu"] = "noh",
["Nonuya"] = "noj",
["Nooksack"] = "nok",
["Noon"] = "snf",
["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 Efate"] = "llp",
["North Fali"] = "fll",
["North Giziga"] = "gis",
["North Marquesan"] = "mrq",
["North Mesopotamian Arabic"] = "ayp",
["North Mofu"] = "mfk",
["North Muyu"] = "kti",
["North Nuaulu"] = "nni",
["North Picene"] = "nrp",
["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",
["Tiếng Bắc Catanduanes Bikol"] = "cts",
["Northern Dagara"] = "dgi",
["Northern East Cree"] = "crl",
["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 Khanty"] = "kca-nor",
["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",
["Tiếng Bắc Paiute"] = "pao",
["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 Tepehuan"] = "ntp",
["Northern Tidong"] = "ntd",
["Northern Tlaxiaco Mixtec"] = "xtn",
["Northern Toussian"] = "tsp",
["Northern Tutchone"] = "ttm",
["Northern Valley Yokuts"] = "nai-nvy",
["Tiếng Tây Bắc Gbaya"] = "gya",
["Northwest Maidu"] = "mjd",
["Northwest Oaxaca Mixtec"] = "mxa",
["Northwest Pashayi"] = "glh",
["Northwestern Dinka"] = "diw",
["Northwestern Fars"] = "faz",
["Northwestern Ojibwa"] = "ojb",
["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",
["Ntcham"] = "bud",
["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",
["Numidian"] = "nxm",
["Nungali"] = "nug",
["Nunggubuyu"] = "nuy",
["Nungon"] = "paa-nun",
["Nungu"] = "rin",
["Nupbikha"] = "npb",
["Tiếng Nupe"] = "nup",
["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",
["Nyishi"] = "njz",
["Nyiyaparli"] = "xny",
["Nyokon"] = "nvo",
["Nyole (Kenya)"] = "nyd",
["Nyole (Uganda)"] = "nuj",
["Nyong"] = "muo",
["Nyoro"] = "nyo",
["Nyulnyul"] = "nyv",
["Tiếng Nyunga"] = "nys",
["Nyungwe"] = "nyu",
["Nyâlayu"] = "yly",
["Tiếng Nzadi"] = "nzd",
["Nzakambay"] = "nzy",
["Nzakara"] = "nzk",
["Nzanyi"] = "nja",
["Nzima"] = "nzi",
["Nüpode Huitoto"] = "hux",
["Tiếng Nǀuu"] = "ngh",
["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 Bengali"] = "inc-obn",
["Tiếng Catalan cổ"] = "roa-oca",
["Tiếng Cornwall cổ"] = "oco",
["Old Gujarati"] = "inc-ogu",
["Old Hindi"] = "inc-ohi",
["Tiếng Hungary cổ"] = "ohu",
["Old Kamta"] = "inc-ork",
["Tiếng Kannada cổ"] = "dra-okn",
["Tiếng Telugu cổ"] = "dra-ote",
["Old Kentish Sign Language"] = "okl",
["Old Leonese"] = "roa-ole",
["Tiếng Navarro-Aragon"] = "roa-ona",
["Tiếng Litva cổ"] = "olt",
["Old Manipuri"] = "omp",
["Old Marathi"] = "omr",
["Old Nubian"] = "onw",
["Old Oriya"] = "inc-oor",
["Tiếng Punjab cổ"] = "inc-opa",
["Tiếng Nam Ả Rập cổ"] = "sem-srb",
["Old Tati"] = "xme-ott",
["Tiếng Tây Tạng cổ"] = "otb",
["Old Welsh"] = "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",
["Oneida"] = "one",
["Ong"] = "oog",
["Ongota"] = "bxe",
["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",
["Osing"] = "osi",
["Ososo"] = "oso",
["Ot Danum"] = "otd",
["Otank"] = "uta",
["Oti"] = "oti",
["Otomaco"] = "sai-oto",
["Otoro"] = "otr",
["Ottawa"] = "otw",
["Ouma"] = "oum",
["Oune"] = "oue",
["Owa"] = "stn",
["Owenia"] = "wsr",
["Owiniga"] = "owi",
["Oy"] = "oyb",
["Oya'oya"] = "oyy",
["Tiếng Oyda"] = "oyd",
["Ozolotepec Zapotec"] = "zao",
["Pa"] = "ppt",
["Pa Di"] = "pdi",
["Pa'a"] = "pqa",
["Paama"] = "pma",
["Paasaal"] = "sig",
["Pacahuara"] = "pcp",
["Padoe"] = "pdo",
["Paelignian"] = "pgn",
["Paeonian"] = "ine-pae",
["Pagi"] = "pgi",
["Pagibete"] = "pae",
["Tiếng Pagu"] = "pgu",
["Pahanan Agta"] = "apf",
["Tiếng Pothohar"] = "phr",
["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",
["Tiếng Paku"] = "pku",
["Paku Karen"] = "kpp",
["Pal"] = "abw",
["Palaka Senoufo"] = "plr",
["Palantla Chinantec"] = "cpa",
["Palawan Batak"] = "bya",
["Paleni"] = "pnl",
["Palenquero"] = "pln",
["Palewyami"] = "nai-ply",
["Palikur"] = "plu",
["Paliyan"] = "pcf",
["Pallanganmiddang"] = "pmd",
["Palor"] = "fap",
["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",
["Paniya"] = "pcg",
["Pankararé"] = "pax",
["Pankararú"] = "paz",
["Pankhu"] = "pkh",
["Pannei"] = "pnc",
["Panobo"] = "pno",
["Panyi Bai"] = "bfc",
["Panyjima"] = "pnw",
["Panzaleo"] = "sai-pnz",
["Pao"] = "ppa",
["Tiếng Totonac Papantla"] = "top",
["Papapana"] = "ppn",
["Papar"] = "dpp",
["Papasena"] = "pas",
["Papel"] = "pbo",
["Papi"] = "ppe",
["Papitalai"] = "pat",
["Papora"] = "ppu",
["Papua New Guinean Sign Language"] = "pgz",
["Papuan Malay"] = "pmy",
["Papuma"] = "ppm",
["Para Naga"] = "pzn",
["Parachi"] = "prc",
["Tiếng Guarani Paraguay"] = "gug",
["Paraguayan Sign Language"] = "pys",
["Parakanã"] = "pak",
["Paranan"] = "prf",
["Paranawát"] = "paf",
["Paratió"] = "sai-par",
["Tiếng Paraujano"] = "pbg",
["Parawen"] = "prw",
["Pardhan"] = "pch",
["Pardhi"] = "pcl",
["Pare"] = "asa",
["Tiếng Pareci"] = "pab",
["Paredarerme"] = "xpd",
["Parenga"] = "pcj",
["Parya"] = "paq",
["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",
["Tiếng Mã Lai Pattani"] = "mfa",
["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",
["Pennsylvania German"] = "pdc",
["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",
["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",
["Pitjantjatjara"] = "pjt",
["Pitta-Pitta"] = "pit",
["Piu"] = "pix",
["Piya-Kwonci"] = "piy",
["Tiếng Apache đồng bằng"] = "apk",
["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",
["Polci"] = "plj",
["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",
["Tiếng Algic nguyên thủy"] = "aql-pro",
["Proto-Amuesha-Chamicuro"] = "awd-amc-pro",
["Proto-Anatolian"] = "ine-ana-pro",
["Proto-Apachean"] = "apa-pro",
["Proto-Arawa"] = "auf-pro",
["Tiếng Arawak nguyên thủy"] = "awd-pro",
["Proto-Armenian"] = "hyx-pro",
["Proto-Arnhem"] = "aus-arn-pro",
["Tiếng Aari nguyên thủy"] = "omv-aro-pro",
["Proto-Atayalic"] = "map-ata-pro",
["Proto-Athabaskan"] = "ath-pro",
["Proto-Atlantic-Congo"] = "alv-pro",
["Tiếng Avar-Andic nguyên thủy"] = "cau-ava-pro",
["Proto-Bantoid"] = "nic-bod-pro",
["Proto-Batak"] = "btk-pro",
["Tiếng Bối-Thái nguyên thủy"] = "qfa-bet-pro",
["Proto-Benue-Congo"] = "nic-bco-pro",
["Proto-Bongo-Bagirmi"] = "csu-bba-pro",
["Proto-Boran"] = "sai-bor-pro",
["Proto-Bua"] = "alv-bua-pro",
["Proto-Bungku-Tolaki"] = "poz-btk-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-Chadic"] = "cdc-pro",
["Proto-Chatino"] = "omq-cha-pro",
["Proto-Chibchan"] = "cba-pro",
["Proto-Chimakuan"] = "chi-pro",
["Proto-Chinookan"] = "nai-ckn-pro",
["Proto-Chukotko-Kamchatkan"] = "qfa-cka-pro",
["Proto-Chumash"] = "nai-chu-pro",
["Proto-Cupan"] = "azc-cup-pro",
["Proto-Daju"] = "sdv-daj-pro",
["Proto-Daly"] = "aus-dal-pro",
["Tiếng Dizi nguyên thủy"] = "omv-diz-pro",
["Proto-Eastern Jebel"] = "sdv-eje-pro",
["Proto-Eastern Oti-Volta"] = "nic-eov-pro",
["Proto-Edoid"] = "alv-edo-pro",
["Tiếng Eskimo-Aleut nguyên thủy"] = "esx-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-Kam-Sui"] = "qfa-kms-pro",
["Proto-Kampa"] = "awd-kmp-pro",
["Proto-Kham"] = "sit-kha-pro",
["Proto-Khoe"] = "khi-kho-pro",
["Tiếng Koman nguyên thủy"] = "ssa-kom-pro",
["Proto-Komisenian"] = "ira-kms-pro",
["Tiếng Kra nguyên thủy"] = "qfa-kra-pro",
["Tiếng Kra-Dai nguyên thủy"] = "qfa-tak-pro",
["Proto-Kru"] = "kro-pro",
["Proto-Kuki-Chin"] = "tbq-kuk-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-Lolo-Burmese"] = "tbq-lob-pro",
["Proto-Loloish"] = "tbq-lol-pro",
["Proto-Lower Cross River"] = "nic-lcr-pro",
["Proto-Luish"] = "sit-luu-pro",
["Proto-Maidun"] = "nai-mdu-pro",
["Proto-Mande"] = "dmn-pro",
["Proto-Mangbetu"] = "csu-maa-pro",
["Tiếng Mari nguyên thủy"] = "chm-pro",
["Proto-Masa"] = "cdc-mas-pro",
["Proto-Mazatec"] = "omq-maz-pro",
["Proto-Medo-Parthian"] = "ira-mpr-pro",
["Tiếng Miền nguyên thủy"] = "hmx-mie-pro",
["Proto-Mixe-Zoque"] = "nai-miz-pro",
["Proto-Mixtec"] = "omq-mxt-pro",
["Proto-Mixtecan"] = "omq-mix-pro",
["Proto-Mumuye"] = "alv-mum-pro",
["Proto-Munji-Yidgha"] = "ira-mny-pro",
["Proto-Na-Dene"] = "xnd-pro",
["Proto-Nahuan"] = "azc-nah-pro",
["Proto-Nawiki"] = "awd-nwk-pro",
["Tiếng Nguni nguyên thủy"] = "bnt-ngu-pro",
["Tiếng Niger-Congo nguyên thủy"] = "nic-pro",
["Tiếng Nin-Sahara nguyên thủy"] = "ssa-pro",
["Proto-Nilotic"] = "sdv-nil-pro",
["Proto-Norse"] = "gmq-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",
["Tiếng Nuristan nguyên thủy"] = "iir-nur-pro",
["Proto-Nyima"] = "sdv-nyi-pro",
["Proto-Nyulnyulan"] = "aus-nyu-pro",
["Proto-Ogoni"] = "nic-ogo-pro",
["Tiếng Omo nguyên thủy"] = "omv-pro",
["Tiếng Önge nguyên thủy"] = "qfa-ong-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"] = "nic-plt-pro",
["Proto-Plateau Penutian"] = "nai-plp-pro",
["Proto-Pnar-Khasi-Lyngngam"] = "aav-pkl-pro",
["Proto-Pomeranian"] = "zlw-pom-pro",
["Proto-Pomo"] = "nai-pom-pro",
["Tiếng Rukai nguyên thủy"] = "dru-pro",
["Tiếng Lưu Cầu nguyên thủy"] = "jpx-ryu-pro",
["Proto-Saka"] = "xsc-sak-pro",
["Proto-Saka-Wakhi"] = "xsc-skw-pro",
["Proto-Sanglechi-Ishkashimi"] = "ira-sgi-pro",
["Proto-Sara"] = "csu-sar-pro",
["Proto-Scythian"] = "xsc-pro",
["Proto-Shughni-Roshani"] = "ira-shr-pro",
["Proto-Shughni-Yazghulami"] = "ira-shy-pro",
["Proto-Shughni-Yazghulami-Munji"] = "ira-sym-pro",
["Proto-Siouan-Catawban"] = "nai-sca-pro",
["Proto-Songhay"] = "son-pro",
["Proto-Sotho-Tswana"] = "bnt-sts-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",
["Proto-Trans-New Guinea"] = "ngf-pro",
["Proto-Trique"] = "omq-tri-pro",
["Proto-Tsezian"] = "cau-tsz-pro",
["Proto-Tsimshianic"] = "nai-tsi-pro",
["Tiếng Tupi nguyên thủy"] = "tup-pro",
["Proto-Ubangian"] = "nic-ubg-pro",
["Proto-Upper Cross River"] = "nic-ucr-pro",
["Proto-Utian"] = "nai-utn-pro",
["Tiếng Ute-Aztec nguyên thủy"] = "azc-pro",
["Proto-Volta-Congo"] = "nic-vco-pro",
["Proto-Volta-Niger"] = "alv-von-pro",
["Tiếng Semit Tây nguyên thủy"] = "sem-wes-pro",
["Proto-Western Mande"] = "dmn-mdw-pro",
["Proto-Witotoan"] = "sai-wit-pro",
["Proto-Yeniseian"] = "qfa-yen-pro",
["Proto-Yupik"] = "ypk-pro",
["Proto-Zapotec"] = "omq-zpc-pro",
["Proto-Zapotecan"] = "omq-zap-pro",
["Proto-Zaza-Gorani"] = "ira-zgr-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",
["Puinave"] = "pui",
["Puiron"] = "sit-prn",
["Pukapukan"] = "pkp",
["Pulabu"] = "pup",
["Puluwat"] = "puw",
["Puma"] = "pum",
["Tiếng Pumpokol"] = "xpm",
["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",
["Tiếng Qimant"] = "ahg",
["Quebec Sign Language"] = "fcs",
["Querétaro Otomi"] = "otq",
["Quetzaltepec Mixe"] = "pxm",
["Queyu"] = "qvy",
["Quiavicuzas Zapotec"] = "zpj",
["Quileute"] = "qui",
["Quimbaya"] = "sai-qmb",
["Quinault"] = "qun",
["Quinigua"] = "nai-qng",
["Quinqui"] = "quq",
["Quioquitani-Quierí Zapotec"] = "ztq",
["Quiotepec Chinantec"] = "chq",
["Quitemo"] = "sai-qtm",
["Tiếng Quốc tế ngữ"] = "eo",
["Rabona"] = "sai-rab",
["Raga"] = "lml",
["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",
["Tiếng Ratagnon"] = "btn",
["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",
["Reli"] = "rei",
["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",
["Rincón Zapotec"] = "zar",
["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",
["Tiếng Rotuman"] = "rtm",
["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",
["Réunion Creole French"] = "rcf",
["Sa"] = "sax",
["Sa'a"] = "apb",
["Sa'ban"] = "snv",
["Sa'och"] = "scq",
["Saafi-Saafi"] = "sav",
["Saam"] = "raq",
["Saamia"] = "lsm",
["Saare"] = "uss",
["Saba"] = "saa",
["Tiếng Bisaya Sabah"] = "bsy",
["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",
["Tiếng Sambali"] = "xsb",
["Sambalpuri"] = "spv",
["Sambe"] = "xab",
["Samberigi"] = "ssx",
["Samburu"] = "saq",
["Tiếng Thát Mai"] = "smh",
["Tiếng Samo"] = "smq",
["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",
["Tiếng Zapotec San Juan Guelavía"] = "zab",
["San Juan Quiahije Chatino"] = "ctp-san",
["San Juan Teita Mixtec"] = "xtj",
["San Luís Temalacayuca Popoloca"] = "pps",
["San Marcos Tlalcoyalco Popoloca"] = "pls",
["Tiếng Triqui San Martín Itunyoso"] = "trq",
["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",
["Tiếng Sangir"] = "sxn",
["Sangisari"] = "sgr",
["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",
["Tiếng Sarikol"] = "srh",
["Sarli"] = "sdf",
["Sartang"] = "onp",
["Sarua"] = "swy",
["Sarudu"] = "sdu",
["Saruga"] = "sra",
["Tiếng Sasak"] = "sas",
["Sasaru"] = "sxs",
["Sassarese"] = "sdc",
["Satawalese"] = "stw",
["Sateré-Mawé"] = "mav",
["Sathmar Swabian"] = "gmw-stm",
["Saudi Arabian Sign Language"] = "sdl",
["Sauraseni Apabhramsa"] = "inc-sap",
["Saurashtra"] = "saz",
["Sauri"] = "srt",
["Sause"] = "sao",
["Sausi"] = "ssj",
["Savi"] = "sdg",
["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",
["Sechelt"] = "sec",
["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",
["Tiếng Sena"] = "seh",
["Senara Sénoufo"] = "seq",
["Senaya"] = "syn",
["Sene"] = "sej",
["Sengele"] = "szg",
["Senggi"] = "snu",
["Sengo"] = "spk",
["Sengseng"] = "ssz",
["Tiếng Senhaja de Srair"] = "sjs",
["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",
["Serer"] = "srr",
["Serili"] = "sve",
["Seroa"] = "kqu",
["Serrano"] = "ser",
["Seru"] = "szd",
["Serua"] = "srw",
["Serudung Murut"] = "srk",
["Serui-Laut"] = "seu",
["Seta"] = "stf",
["Setaman"] = "stm",
["Seti"] = "sbi",
["Severn Ojibwa"] = "ojs",
["Sewa Bay"] = "sew",
["Seychellois Creole"] = "crs",
["Sha"] = "scw",
["Shabak"] = "sdb",
["Shabo"] = "sbf",
["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",
["Tiếng Shebayo"] = "awd-she",
["Shehri"] = "shv",
["Shekkacho"] = "moy",
["Sheko"] = "she",
["Shelta"] = "sth",
["Shendu"] = "shl",
["Sheni"] = "scv",
["Sherbro"] = "bun",
["Sherdukpen"] = "sdp",
["Tiếng Kham Sheshi"] = "kip",
["Shi"] = "shr",
["Shihhi Arabic"] = "ssh",
["Shiki"] = "gua",
["Shilluk"] = "shk",
["Tiếng Shinasha"] = "bwo",
["Shipibo-Conibo"] = "shp",
["Shixing"] = "sxg",
["Shoo-Minda-Nye"] = "bcv",
["Shoshone"] = "shh",
["Shua"] = "shg",
["Shuar"] = "jiv",
["Shuba"] = "cbq",
["Tiếng Shughnan"] = "sgh",
["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",
["Sinaugoro"] = "snc",
["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",
["Sirenik"] = "ysr",
["Siri"] = "sir",
["Siriano"] = "sri",
["Sirionó"] = "srq",
["Sirmauri"] = "srx",
["Siroi"] = "ssd",
["Sissala"] = "sld",
["Tiếng Tứ Thổ"] = "sit-sit",
["Siuslaw"] = "sis",
["Sivandi"] = "siy",
["Siwai"] = "siw",
["Siwu"] = "akp",
["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",
["Songlai Chin"] = "csj",
["Songomeno"] = "soe",
["Songoora"] = "sod",
["Sonha"] = "soi",
["Sonia"] = "siq",
["Soninke"] = "snk",
["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 Efate"] = "erk",
["South Fali"] = "fal",
["South Giziga"] = "giz",
["South Lembata"] = "lmf",
["South Marquesan"] = "mqm",
["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",
["Tiếng Bạch Nam"] = "bfs",
["Southern Birifor"] = "biv",
["Southern Bobo"] = "bwq",
["Southern Bontoc"] = "obk",
["Southern Carrier"] = "caf",
["Southern Catanduanes Bicolano"] = "bln",
["Southern Dagaare"] = "dga",
["Southern East Cree"] = "crj",
["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",
["Southern Kurdish"] = "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",
["Tiếng Khương Nam"] = "qxs",
["Southern Rengma Naga"] = "nre",
["Southern Rincon Zapotec"] = "zsr",
["Southern Sama"] = "ssb",
["Southern Samo"] = "sbd",
["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",
["Squamish"] = "squ",
["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",
["Sulung"] = "suv",
["Suma"] = "sqm",
["Sumariup"] = "siv",
["Sumau"] = "six",
["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",
["Susu"] = "sus",
["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",
["Tiếng Tadyawan"] = "tdy",
["Tae'"] = "rob",
["Tafi"] = "tcd",
["Tafreshi"] = "xme-taf",
["Tagabawa"] = "bgs",
["Tagakaulu Kalagan"] = "klg",
["Tagbanwa"] = "tbw",
["Tagbu"] = "tbm",
["Tagdal"] = "tda",
["Tagish"] = "tgx",
["Tagwana Senoufo"] = "tgw",
["Tahltan"] = "tht",
["Tai"] = "taw",
["Tai Hang Tong"] = "thc",
["Tai Hongjin"] = "tiz",
["Tai Long"] = "thi",
["Tai Thanh"] = "tmm",
["Tai Ya"] = "cuu",
["Taiap"] = "gpn",
["Taikat"] = "aos",
["Tiếng Nga bồi Taimyr"] = "crp-tpr",
["Tainae"] = "ago",
["Tairuma"] = "uar",
["Taita"] = "dav",
["Tiếng Taivoan"] = "tvx",
["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",
["Tangoa"] = "tgp",
["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",
["Tiếng Tarantino"] = "roa-tar",
["Tarao"] = "tro",
["Taraon"] = "mhu",
["Tareng"] = "tgr",
["Tarjumo"] = "txj",
["Tarok"] = "yer",
["Tarpia"] = "tpf",
["Tartessian"] = "txr",
["Taruma"] = "tdm",
["Tasawaq"] = "twq",
["Tasmate"] = "tmt",
["Tiếng Tat"] = "ttt",
["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",
["Tiếng Tayma"] = "sem-tay",
["Tayo"] = "cks",
["Tiếng Taíno"] = "tnq",
["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",
["Tedim Chin"] = "ctd",
["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",
["Tengger"] = "tes",
["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",
["Ter Sami"] = "sjt",
["Tera"] = "ttr",
["Terebu"] = "trb",
["Terei"] = "buo",
["Tereno"] = "ter",
["Tereweng"] = "twg",
["Tiếng Teribe"] = "tfr",
["Terik"] = "tec",
["Termanu"] = "twu",
["Ternateño"] = "tmg",
["Tese"] = "keg",
["Teshenawa"] = "twc",
["Tetela"] = "tll",
["Tetelcingo Nahuatl"] = "nhg",
["Tetete"] = "teb",
["Tetserret"] = "tez",
["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",
["Thachanadan"] = "thn",
["Thado Chin"] = "tcz",
["Thai Sign Language"] = "tsq",
["Thaiphum Chin"] = "cth",
["Thakali"] = "ths",
["Thamudic"] = "sem-tha",
["Thangal Naga"] = "nki",
["Thangmi"] = "thf",
["Thao"] = "ssf",
["Tharaka"] = "thk",
["Tharrgari"] = "dhr",
["Thawa"] = "xtv",
["Thompson"] = "thp",
["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",
["Tigon Mbembe"] = "nza",
["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",
["Tiếng Tipai"] = "nai-tip",
["Tippera"] = "tpe",
["Tira"] = "tic",
["Tirahi"] = "tra",
["Tiranige Diga Dogon"] = "tde",
["Tircul"] = "pyx",
["Tiri"] = "cir",
["Tita"] = "tdq",
["Titan"] = "ttv",
["Tiv"] = "tiv",
["Tiwa"] = "lax",
["Tiếng Tiwi"] = "tiw",
["Tiéfo"] = "tiq",
["Tiéyaxo Bozo"] = "boz",
["Tjurruru"] = "tju",
["Tiếng Tepehua Tlachichilco"] = "tpt",
["Tiếng Me'phaa Tlacoapa"] = "tpl",
["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",
["Toma"] = "tod",
["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",
["Tiếng Tonkawa"] = "tqw",
["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",
["Transylvanian Saxon"] = "gmw-tsx",
["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",
["Tsez"] = "ddo",
["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",
["Tiếng Tunica"] = "tun",
["Tunisian Arabic"] = "aeb",
["Tiếng Berber Tunisia"] = "sds",
["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",
["Tiếng Turoyo"] = "tru",
["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",
["Tuwuli"] = "bov",
["Tuxináwa"] = "tux",
["Tuxá"] = "tud",
["Tuyuca"] = "tue",
["Twana"] = "twa",
["Twendi"] = "twn",
["Tiếng Tyap"] = "kcg",
["Tyaraity"] = "woa",
["Tyerrernotepanner"] = "xph",
["Tz'utujil"] = "tzj",
["Tzeltal"] = "tzh",
["Tiếng Tzotzil"] = "tzo",
["Tày Tac"] = "tyt",
["Tiếng Tây Bồi"] = "tas",
["Téén"] = "lor",
["Tübatulabal"] = "tub",
["Tiếng U"] = "uuu",
["Uab Meto"] = "aoz",
["Uamué"] = "uam",
["Uare"] = "ksj",
["Ubaghara"] = "byc",
["Ubang"] = "uba",
["Ubi"] = "ubi",
["Ubir"] = "ubr",
["Ucayali-Yurúa Ashéninka"] = "cpb",
["Uda"] = "uda",
["Tiếng Uduk"] = "udu",
["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",
["Tiếng Ulch"] = "ulc",
["Uldeme"] = "udl",
["Ulithian"] = "uli",
["Ullatan"] = "ull",
["Ulumanda'"] = "ulm",
["Ulwa"] = "ulw",
["Uma"] = "ppk",
["Uma' Lasan"] = "xky",
["Uma' Lung"] = "ulu",
["Umanakaina"] = "gdn",
["Umatilla"] = "uma",
["Umbindhamu"] = "umd",
["Umbu-Ungu"] = "ubu",
["Umbugarla"] = "umr",
["Tiếng Umbundu"] = "umb",
["Umbuygamu"] = "umg",
["Umeda"] = "upi",
["Umiida"] = "xud",
["Umiray Dumaget Agta"] = "due",
["Umon"] = "umm",
["Umotína"] = "umo",
["Umpila"] = "ump",
["Una"] = "mtg",
["Tiếng Unami"] = "unm",
["Unas"] = "art-una",
["Unde Kaili"] = "unz",
["Uneme"] = "une",
["Unggaranggu"] = "xun",
["Unggumi"] = "xgu",
["Unserdeutsch"] = "uln",
["Unua"] = "onu",
["Unubahe"] = "unu",
["Uokha"] = "uok",
["Upper Chehalis"] = "cjh",
["Upper Grand Valley Dani"] = "dna",
["Tiếng Thượng Kinabatangan"] = "dmg",
["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",
["Urali"] = "url",
["Urapmin"] = "urm",
["Urarina"] = "ura",
["Urat"] = "urt",
["Urhobo"] = "urh",
["Uri"] = "uvh",
["Urigina"] = "urg",
["Urim"] = "uri",
["Urimo"] = "urx",
["Uripiv-Wala-Rano-Atchin"] = "upv",
["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",
["Usui"] = "usi",
["Utarmbung"] = "omo",
["Ute"] = "ute",
["Utu"] = "utu",
["Tiếng Uvbie"] = "evh",
["Uwinymil"] = "aus-uwi",
["Uya"] = "usu",
["Uyajitaya"] = "duk",
["Uzekwe"] = "eze",
["Vaagri Booli"] = "vaa",
["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",
["Virgin Islands Creole"] = "vic",
["Vishavan"] = "vis",
["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",
["Tiếng Võro"] = "vro",
["Wa"] = "wbm",
["Wa'ema"] = "wag",
["Waama"] = "wwa",
["Waamwang"] = "wmn",
["Wab"] = "wab",
["Wabo"] = "wbb",
["Waboda"] = "kmx",
["Waci Gbe"] = "wci",
["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",
["Wagi"] = "fad",
["Wahau Kayan"] = "whu",
["Wahau Kenyah"] = "whk",
["Tiếng Wahgi"] = "wgi",
["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",
["Wancho"] = "nnp",
["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",
["Tiếng Wardaman"] = "wrr",
["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",
["Tiếng Wastek"] = "hus",
["Wasu"] = "wsu",
["Watakataui"] = "wtk",
["Watam"] = "wax",
["Wathaurong"] = "wth",
["Watiwa"] = "wtf",
["Watubela"] = "wah",
["Waube"] = "kop",
["Wauja"] = "wau",
["Wauyai"] = "wuy",
["Wawa"] = "www",
["Wawonii"] = "wow",
["Waxiang"] = "wxa",
["Wayanad Chetti"] = "ctt",
["Wayoró"] = "wyr",
["Wayumará"] = "sai-way",
["Wedau"] = "wed",
["Weh"] = "weh",
["Welaung"] = "weu",
["Weliki"] = "klh",
["Welsh Romani"] = "rmw",
["Wemale"] = "weo",
["Tiếng Wemba-Wemba"] = "xww",
["Weme Gbe"] = "wem",
["Wendat"] = "wdt",
["Weri"] = "wer",
["Wersing"] = "kvw",
["West Albay Bikol"] = "fbl",
["West Ambae"] = "nnd",
["West Central Banda"] = "bbp",
["Tiếng Tây Duyên hải Bajau"] = "bdr",
["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",
["Tiếng Mari Tây"] = "mrj",
["Western Mashan Hmong"] = "hmw",
["Western Meohang"] = "raf",
["Western Muria"] = "mut",
["Tiếng Tân Aram Tây"] = "amw",
["Western Ojibwa"] = "ojw",
["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",
["Tiếng Wiradjuri"] = "wrh",
["Wiraféd"] = "wir",
["Wirangu"] = "wgu",
["Wiru"] = "wiu",
["Wirö"] = "wpc",
["Wiwa"] = "mbp",
["Tiếng Wiyot"] = "wiy",
["Woccon"] = "xwc",
["Wogamusin"] = "wog",
["Wogeo"] = "woc",
["Woi"] = "wbw",
["Tiếng Woiwurrung"] = "wyi",
["Wojenaka"] = "jod",
["Wolane"] = "wle",
["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",
["Tiếng Xavante"] = "xav",
["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",
["Tiếng Yaaku"] = "muu",
["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",
["Yamphu"] = "ybi",
["Yan-nhangu"] = "jay",
["Yana"] = "ynn",
["Yanda"] = "yda",
["Yanda Dogon"] = "dym",
["Yandjibara"] = "xyb",
["Yandruwandha"] = "ynd",
["Yanesha'"] = "ame",
["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",
["Tiếng Yanyuwa"] = "jao",
["Tiếng Yao (châu Phi)"] = "yao",
["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",
["Yatee Zapotec"] = "zty",
["Tiếng Zapotec Yatzachi"] = "zav",
["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",
["Tiếng Yazghulom"] = "yah",
["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",
["Tiếng Creole Nghi Lan"] = "ycr",
["Yimas"] = "yee",
["Yimchungru Naga"] = "yim",
["Yinbaw Karen"] = "kvu",
["Yinchia"] = "yin",
["Tiếng Yindjibarndi"] = "yij",
["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",
["Yolmo"] = "scp",
["Yolngu Sign Language"] = "ygs",
["Yoloxochitl Mixtec"] = "xty",
["Yom"] = "pil",
["Yombe"] = "yom",
["Yopno"] = "yut",
["Yora"] = "mts",
["Yorta Yorta"] = "xyy",
["Tiếng Mixtec Yosondúa"] = "mpm",
["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",
["Yámana"] = "yag",
["Zaachila Zapotec"] = "ztx",
["Zabana"] = "kji",
["Zacatepec Chatino"] = "ctz",
["Zacatlán-Ahuacatlán-Tepetzintla Nahuatl"] = "nhi",
["Zakhring"] = "zkr",
["Zambian Sign Language"] = "zsl",
["Zan Gula"] = "zna",
["Zanaki"] = "zak",
["Zande"] = "zne",
["Zangskari"] = "zau",
["Zangwal"] = "zah",
["Tiếng Zapotec Zaniza"] = "zpw",
["Tiếng Zapotec"] = "zap",
["Zaramo"] = "zaj",
["Zari"] = "zaz",
["Zauzou"] = "zal",
["Tiếng Karen Zayein"] = "kxk",
["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",
["Tiếng Zapotec Zoogocho"] = "zpq",
["Zotung Chin"] = "czt",
["Zou"] = "zom",
["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-Hmao"] = "hmd",
["Tiếng Aari"] = "aiw",
["Tiếng Aasax"] = "aas",
["Tiếng Abaga"] = "abg",
["Tiếng Abai"] = "poz-abi",
["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 Aceh"] = "ace",
["Tiếng Achawa"] = "aca",
["Tiếng Acheron"] = "acz",
["Tiếng Acholi"] = "ach",
["Tiếng Adangme"] = "ada",
["Tiếng Adja"] = "ajg",
["Tiếng Adygea"] = "ady",
["Tiếng Adzera"] = "adz",
["Tiếng Afar"] = "aa",
["Tiếng Afrikaans"] = "af",
["Tiếng Agawam"] = "alg-aga",
["Tiếng Aghem"] = "agq",
["Tiếng Aghul"] = "agx",
["Tiếng Aghwan"] = "xag",
["Tiếng Ahom"] = "aho",
["Tiếng Ahtna"] = "aht",
["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 Akan"] = "ak",
["Tiếng Akawaio"] = "ake",
["Tiếng Akha"] = "ahk",
["Tiếng Akhvakh"] = "akv",
["Tiếng Akkad"] = "akk",
["Tiếng Aklanon"] = "akl",
["Tiếng Alaba-K’abeena"] = "alw",
["Tiếng Alabama"] = "akz",
["Tiếng Alagwa"] = "wbj",
["Tiếng Alak"] = "alk",
["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 Algonquin"] = "alq",
["Tiếng Algonquin nguyên thủy"] = "alg-pro",
["Tiếng Alsea"] = "aes",
["Tiếng Alutor"] = "alr",
["Tiếng Ama"] = "amm",
["Tiếng Amahuaca"] = "amc",
["Tiếng Amaimon"] = "ali",
["Tiếng Amarasi"] = "aaz",
["Tiếng Ambrak"] = "aag",
["Tiếng Amdang"] = "amj",
["Tiếng Amhara"] = "am",
["Tiếng Amis"] = "ami",
["Tiếng Amurdag"] = "amg",
["Tiếng Amuzgo"] = "amu",
["Tiếng Anal"] = "anm",
["Tiếng Andi"] = "ani",
["Tiếng Angika"] = "anp",
["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 Anuki"] = "aui",
["Tiếng Anyi"] = "any",
["Tiếng Apache Tây"] = "apw",
["Tiếng Aparaí"] = "apy",
["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 Araweté"] = "awt",
["Tiếng Archi"] = "aqc",
["Tiếng Arem"] = "aem",
["Tiếng Argobba"] = "agj",
["Tiếng Armenia"] = "hy",
["Tiếng Armenia cổ"] = "xcl",
["Tiếng Armenia trung đại"] = "axm",
["Tiếng Aromania"] = "rup",
["Tiếng Ashraaf"] = "cus-ash",
["Tiếng Askopan"] = "eiv",
["Tiếng Asli nguyên thủy"] = "mkh-asl-pro",
["Tiếng Assam"] = "as",
["Tiếng Assan"] = "xss",
["Tiếng Asturias"] = "ast",
["Tiếng Asur"] = "asr",
["Tiếng Atayal"] = "tay",
["Tiếng Athpariya"] = "aph",
["Tiếng Atikamekw"] = "atj",
["Tiếng Atong (Ấn Độ)"] = "aot",
["Tiếng Auhelawa"] = "kud",
["Tiếng Aukan"] = "djk",
["Tiếng Avar"] = "av",
["Tiếng Avesta"] = "ae",
["Tiếng Avokaya"] = "avu",
["Tiếng Awadh"] = "awa",
["Tiếng Awing"] = "azo",
["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 Babatana"] = "baa",
["Tiếng Babungo"] = "bav",
["Tiếng Babuza"] = "bzg",
["Tiếng Bactria"] = "xbc",
["Tiếng Badaga"] = "bfq",
["Tiếng Badanchi"] = "bau",
["Tiếng Badui"] = "bac",
["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 Bakhtiari"] = "bqi",
["Tiếng Bala"] = "tuw-bal",
["Tiếng Balanta-Ganja"] = "bjt",
["Tiếng Balanta-Kentohe"] = "ble",
["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 Banjar"] = "bjn",
["Tiếng Bantawa"] = "bap",
["Tiếng Bantu nguyên thủy"] = "bnt-pro",
["Tiếng Baoule"] = "bci",
["Tiếng Barai"] = "bbb",
["Tiếng Barakai"] = "baj",
["Tiếng Bari"] = "bfa",
["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 Batak Simalungun"] = "bts",
["Tiếng Batek"] = "btq",
["Tiếng Bats"] = "bbl",
["Tiếng Batuley"] = "bay",
["Tiếng Bayern"] = "bar",
["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 Berber Bắc Sahara"] = "mzb",
["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 Bhil"] = "bhb",
["Tiếng Bhil Dungra"] = "duh",
["Tiếng Bhnong"] = "mkh-bhn",
["Tiếng Bhojpur"] = "bho",
["Tiếng Bhumij"] = "aav-bhu",
["Tiếng Bidayuh Biatah"] = "bth",
["Tiếng Bih"] = "ibh",
["Tiếng Bihari"] = "bh",
["Tiếng Bilaspur"] = "kfs",
["Tiếng Bilen"] = "byn",
["Tiếng Birao"] = "brr",
["Tiếng Birhor"] = "biy",
["Tiếng Birjia"] = "bix",
["Tiếng Bishnupriya"] = "bpy",
["Tiếng Bislama"] = "bi",
["Tiếng Bisu"] = "bzi",
["Tiếng Bit"] = "bgk",
["Tiếng Blackfoot"] = "bla",
["Tiếng Blagar"] = "beu",
["Tiếng Blang"] = "blr",
["Tiếng Bodo (Ấn Độ)"] = "brx",
["Tiếng Bodo-Garo nguyên thủy"] = "tbq-bdg-pro",
["Tiếng Boghom"] = "bux",
["Tiếng Bokar"] = "sit-bok",
["Tiếng Bokobaru"] = "bus",
["Tiếng Bondo"] = "bfw",
["Tiếng Boon"] = "bnl",
["Tiếng Borôro"] = "bor",
["Tiếng Botlikh"] = "bph",
["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 Bru"] = "bru",
["Tiếng Bru Tây"] = "brv",
["Tiếng Brâu"] = "brb",
["Tiếng Budukh"] = "bdk",
["Tiếng Bughotu"] = "bgt",
["Tiếng Bugis"] = "bug",
["Tiếng Bukhara"] = "bhh",
["Tiếng Bulgar"] = "xbo",
["Tiếng Bulgari"] = "bg",
["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 Bách Tế"] = "pkc",
["Tiếng Bảo An"] = "peh",
["Tiếng Bắc Altai"] = "atv",
["Tiếng Bắc Amami Ōshima"] = "ryn",
["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 Mansi"] = "mns-nor",
["Tiếng Bắc Ndebele"] = "nd",
["Tiếng Bắc Nisu"] = "yiv",
["Tiếng Bắc Sami"] = "se",
["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ố Cam"] = "bbh",
["Tiếng Bố Lưu"] = "ply",
["Tiếng Bố Mang"] = "bvp",
["Tiếng Bố Y"] = "pcc",
["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 Canela"] = "ram",
["Tiếng Cao Câu Ly"] = "zkg",
["Tiếng Carib nguyên thủy"] = "sai-car-pro",
["Tiếng Carrier"] = "crx",
["Tiếng Catalan"] = "ca",
["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 Chakma"] = "ccp",
["Tiếng Chăm cổ"] = "ocm",
["Tiếng Chamalal"] = "cji",
["Tiếng Chamba"] = "cdh",
["Tiếng Chamicuro"] = "ccc",
["Tiếng Chamorro"] = "ch",
["Tiếng Chatino cao nguyên Tây"] = "ctp",
["Tiếng Chaura"] = "crv",
["Tiếng Chavacano"] = "cbk",
["Tiếng Chechen"] = "ce",
["Tiếng Chepang"] = "cdm",
["Tiếng Cherokee"] = "chr",
["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 Chinantec Ojitlán"] = "chj",
["Tiếng Chinantec Ozumacín"] = "chz",
["Tiếng Chinantec Tepinapa"] = "cte",
["Tiếng Chinook"] = "chh",
["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 Chong"] = "cog",
["Tiếng Chu Ru"] = "cje",
["Tiếng Chukot"] = "ckt",
["Tiếng Chulym"] = "clw",
["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 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 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 Corse"] = "co",
["Tiếng Cree"] = "cr",
["Tiếng Cree đồng bằng"] = "crk",
["Tiếng Creole Hà Lan Berbice"] = "brc",
["Tiếng Creole Jamaica"] = "jam",
["Tiếng Creole Louisiana"] = "lou",
["Tiếng Crow"] = "cro",
["Tiếng Cuman"] = "qwm",
["Tiếng Cupeño"] = "cup",
["Tiếng Cushit nguyên thủy"] = "cus-pro",
["Tiếng Càn-đà-la"] = "pgd",
["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ám"] = "gan",
["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 Dagbani"] = "dag",
["Tiếng Dahalik"] = "dlk",
["Tiếng Dahalo"] = "dal",
["Tiếng Dakota"] = "dak",
["Tiếng Dalmatia"] = "dlm",
["Tiếng Dambi"] = "dac",
["Tiếng Dan"] = "dnj",
["Tiếng Danau"] = "dnu",
["Tiếng Dangaléat"] = "daa",
["Tiếng Danu"] = "dnv",
["Tiếng Danuwar"] = "dhw",
["Tiếng Dargwa"] = "dar",
["Tiếng Dargwa nguyên thủy"] = "cau-drg-pro",
["Tiếng Daur"] = "dta",
["Tiếng Dawro"] = "dwr",
["Tiếng Degema"] = "deg",
["Tiếng Denesuline"] = "chp",
["Tiếng Desiya"] = "dso",
["Tiếng Dhanka"] = "dhn",
["Tiếng Dhivehi"] = "dv",
["Tiếng Dhodia"] = "dho",
["Tiếng Dibabawon"] = "mbd",
["Tiếng Digan"] = "rom",
["Tiếng Digan Tavringer"] = "rmu",
["Tiếng Dinka"] = "din",
["Tiếng Dirasha"] = "gdl",
["Tiếng Ditidaht"] = "dtd",
["Tiếng Dizi"] = "mdx",
["Tiếng Do Thái"] = "he",
["Tiếng Dogri"] = "doi",
["Tiếng Dogrib"] = "dgr",
["Tiếng Dolgan"] = "dlg",
["Tiếng Domari"] = "rmt",
["Tiếng Dongolawi"] = "kzh",
["Tiếng Dravida nguyên thủy"] = "dra-pro",
["Tiếng Dubla"] = "dub",
["Tiếng Dukha"] = "trk-dkh",
["Tiếng Duun"] = "dux",
["Tiếng Duy Ngô Nhĩ"] = "ug",
["Tiếng Duy Ngô Nhĩ cổ"] = "oui",
["Tiếng Dyirbal"] = "dbl",
["Tiếng Dzongkha"] = "dz",
["Tiếng Dzuun"] = "dnn",
["Tiếng Ebla"] = "xeb",
["Tiếng Ebrié"] = "ebr",
["Tiếng Ebughu"] = "ebg",
["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 Efai"] = "efa",
["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 Eotile"] = "eot",
["Tiếng Epie"] = "epi",
["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 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 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 Fon"] = "fon",
["Tiếng Fox"] = "sac",
["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 Gaddang"] = "gad",
["Tiếng Gael Scotland"] = "gd",
["Tiếng Gagauz"] = "gag",
["Tiếng Galati"] = "xga",
["Tiếng Galicia"] = "gl",
["Tiếng Galicia-Bồ Đào Nha"] = "roa-opt",
["Tiếng Gamit"] = "gbl",
["Tiếng Gamo"] = "gmv",
["Tiếng Ganza"] = "gza",
["Tiếng Garasia Adiwasi"] = "gas",
["Tiếng Garasia Rajput"] = "gra",
["Tiếng Garo"] = "grt",
["Tiếng Garre"] = "gex",
["Tiếng Gata'"] = "gaq",
["Tiếng Gawar-Bati"] = "gwt",
["Tiếng Gbe Saxwe"] = "sxw",
["Tiếng Gbe nguyên thủy"] = "alv-gbe-pro",
["Tiếng Gedeo"] = "drs",
["Tiếng German Tây nguyên thủy"] = "gmw-pro",
["Tiếng Scots trung đại"] = "gmw-msc",
["Tiếng German nguyên thủy"] = "gem-pro",
["Tiếng Geʽez"] = "gez",
["Tiếng Ghadames"] = "gha",
["Tiếng Ghomala'"] = "bbj",
["Tiếng Gia Rai"] = "jra",
["Tiếng Gikuyu"] = "ki",
["Tiếng Gilak"] = "glk",
["Tiếng Gimi (Goroka)"] = "gim",
["Tiếng Girirra"] = "gii",
["Tiếng Giẻ"] = "jeh",
["Tiếng Glosa"] = "igs",
["Tiếng Godoberi"] = "gdo",
["Tiếng Gofa"] = "gof",
["Tiếng Gone Dau"] = "goo",
["Tiếng Gorowa"] = "gow",
["Tiếng Goth"] = "got",
["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 Guaraní"] = "gn",
["Tiếng Guarani Mbya"] = "gun",
["Tiếng Guarayu"] = "gyr",
["Tiếng Gujarat"] = "gu",
["Tiếng Gulay"] = "gvl",
["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 Creole Haiti"] = "ht",
["Tiếng Hajong"] = "haj",
["Tiếng Halba"] = "hlb",
["Tiếng Halkomelem"] = "hur",
["Tiếng Hamer-Banna"] = "amf",
["Tiếng Hanunoo"] = "hnn",
["Tiếng Harari"] = "har",
["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 Heiltsuk"] = "hei",
["Tiếng Hellen nguyên thủy"] = "grk-pro",
["Tiếng Herero"] = "hz",
["Tiếng Higaonon"] = "mba",
["Tiếng Hiligaynon"] = "hil",
["Tiếng Hindi"] = "hi",
["Tiếng Hindi Fiji"] = "hif",
["Tiếng Hindko Bắc"] = "hno",
["Tiếng Hindustan Caribe"] = "hns",
["Tiếng Hiri Motu"] = "ho",
["Tiếng Hitti"] = "hit",
["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 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 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 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ạ Sorb"] = "dsb",
["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 Ibatan"] = "ivb",
["Tiếng Ibibio"] = "ibb",
["Tiếng Ibino"] = "ibn",
["Tiếng Ibuoro"] = "ibr",
["Tiếng Iceland"] = "is",
["Tiếng Ido"] = "io",
["Tiếng Ifè"] = "ife",
["Tiếng Igala"] = "igl",
["Tiếng Igbo"] = "ig",
["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 Inupiaq"] = "ik",
["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 Isan"] = "tts",
["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 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 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 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 Jiiddu"] = "jii",
["Tiếng Jru'"] = "lbo",
["Tiếng Juang"] = "jun",
["Tiếng Jumjum"] = "jum",
["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 Kabyle"] = "kab",
["Tiếng Kachin"] = "kac",
["Tiếng Kadu"] = "zkd",
["Tiếng Kafa"] = "kbr",
["Tiếng Kaingang"] = "kgp",
["Tiếng Kakabai"] = "kqf",
["Tiếng Kalam"] = "gwc",
["Tiếng Kalao"] = "kly",
["Tiếng Kalash"] = "kls",
["Tiếng Kalinga Limos"] = "kmk",
["Tiếng Kalmyk"] = "xal",
["Tiếng Kalo Phần Lan"] = "rmf",
["Tiếng Kamassia"] = "xas",
["Tiếng Kambaata"] = "ktb",
["Tiếng Kanakanavu"] = "xnb",
["Tiếng Kangean"] = "kkv",
["Tiếng Kannada"] = "kn",
["Tiếng Kannauj"] = "bjj",
["Tiếng Kanuri"] = "kr",
["Tiếng Kapampangan"] = "pam",
["Tiếng Kapingamarangi"] = "kpg",
["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 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 nguyên thủy"] = "kar-pro",
["Tiếng Kari'na"] = "car",
["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 Kavalan"] = "ckv",
["Tiếng Kavet"] = "krv",
["Tiếng Kawésqar"] = "alc",
["Tiếng Kayapó"] = "txu",
["Tiếng Kayort"] = "kyv",
["Tiếng Kazakh"] = "kk",
["Tiếng Kensiu"] = "kns",
["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 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 Khowar"] = "khw",
["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ün"] = "kkh",
["Tiếng Khùa"] = "xhv",
["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 Kickapoo"] = "kic",
["Tiếng Kikai"] = "kzg",
["Tiếng Kili"] = "tuw-kil",
["Tiếng Kim Môn"] = "mji",
["Tiếng Kimbundu"] = "kmb",
["Tiếng Kintaq"] = "knq",
["Tiếng Kiowa"] = "kio",
["Tiếng Kiribati"] = "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 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 Parkar"] = "kvx",
["Tiếng Koli Wadiyara"] = "kxp",
["Tiếng Komi cổ"] = "urj-koo",
["Tiếng Komi-Permyak"] = "koi",
["Tiếng Komi-Zyrian"] = "kpv",
["Tiếng Kongo"] = "kg",
["Tiếng Konkan"] = "kok",
["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 Koryak"] = "kpy",
["Tiếng Kosrae"] = "kos",
["Tiếng Kotava"] = "avk",
["Tiếng Kraol"] = "rka",
["Tiếng Krio"] = "kri",
["Tiếng Krung"] = "krr",
["Tiếng Krymchak"] = "jct",
["Tiếng Kryts"] = "kry",
["Tiếng Kudmal"] = "kyw",
["Tiếng Kui Dawik"] = "dwk",
["Tiếng Kukna"] = "kex",
["Tiếng Kullu"] = "kfx",
["Tiếng Kulon-Pazeh"] = "uun",
["Tiếng Kumbewaha"] = "xks",
["Tiếng Kumyk"] = "kum",
["Tiếng Kumzar"] = "zum",
["Tiếng Kundal Shahi"] = "shd",
["Tiếng Kunigami"] = "xug",
["Tiếng Kurmanji"] = "kmr",
["Tiếng Kurtokha"] = "xkz",
["Tiếng Kurumba Attapady"] = "pkr",
["Tiếng Kutch"] = "kfr",
["Tiếng Kuvi"] = "kxv",
["Tiếng Kuy"] = "kdt",
["Tiếng Kw'adza"] = "wka",
["Tiếng Kwak'wala"] = "kwk",
["Tiếng Kwanyama"] = "kj",
["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 Ladakh"] = "lbj",
["Tiếng Ladin"] = "lld",
["Tiếng Ladino"] = "lad",
["Tiếng Lahnda"] = "lah",
["Tiếng Lak"] = "lbe",
["Tiếng Lakota"] = "lkt",
["Tiếng Lambadi"] = "lmn",
["Tiếng Lamboya"] = "lmy",
["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 Laz"] = "lzz",
["Tiếng Lemnos"] = "xle",
["Tiếng Lepcha"] = "lep",
["Tiếng Leponti"] = "xlp",
["Tiếng Lezghi nguyên thủy"] = "cau-lzg-pro",
["Tiếng Lezgi"] = "lez",
["Tiếng Lhao Vo"] = "mhx",
["Tiếng Liabuku"] = "lix",
["Tiếng Libido"] = "liq",
["Tiếng Liguria"] = "lij",
["Tiếng Lillooet"] = "lil",
["Tiếng Limburg"] = "li",
["Tiếng Lingala"] = "ln",
["Tiếng Lishana Deni"] = "lsd",
["Tiếng Lishanid Noshan"] = "aij",
["Tiếng Lisu"] = "lis",
["Tiếng Litva"] = "lt",
["Tiếng Livonia"] = "liv",
["Tiếng Livvi"] = "olo",
["Tiếng Lojban"] = "jbo",
["Tiếng Lokono"] = "arw",
["Tiếng Lombard"] = "lmo",
["Tiếng Lou"] = "loj",
["Tiếng Luba-Katanga"] = "lu",
["Tiếng Luganda"] = "lg",
["Tiếng Lur Bắc"] = "lrc",
["Tiếng Lur Nam"] = "luz",
["Tiếng Lushootseed"] = "lut",
["Tiếng Luwi"] = "xlu",
["Tiếng Luxembourg"] = "lb",
["Tiếng Lydia"] = "xld",
["Tiếng Lyngngam"] = "lyg",
["Tiếng Lyydi"] = "lud",
["Tiếng Lào"] = "lo",
["Tiếng Lô Lô"] = "ii",
["Tiếng Lư Nhân"] = "sit-lrn",
["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 Mabang"] = "mde",
["Tiếng Macedoni"] = "mk",
["Tiếng Macedoni cổ đại"] = "xmk",
["Tiếng Macushi"] = "mbc",
["Tiếng Madura"] = "mad",
["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 Malagasy"] = "mg",
["Tiếng Malayalam"] = "ml",
["Tiếng Malta"] = "mt",
["Tiếng Mampruli"] = "maw",
["Tiếng Man"] = "gv",
["Tiếng Manda (Ấn Độ)"] = "mha",
["Tiếng Mandara"] = "tbf",
["Tiếng Mandinka"] = "mnk",
["Tiếng Mangas"] = "zns",
["Tiếng Manggarai"] = "mqy",
["Tiếng Mangghuer"] = "xgn-mgr",
["Tiếng Manipur"] = "mni",
["Tiếng Mankanya"] = "knf",
["Tiếng Mano"] = "mev",
["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 Marathi"] = "mr",
["Tiếng Mari Đông"] = "mhr",
["Tiếng Marma"] = "rmz",
["Tiếng Marshall"] = "mh",
["Tiếng Marwar"] = "mwr",
["Tiếng Mator"] = "mtm",
["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 Me'en"] = "mym",
["Tiếng Media cổ"] = "xme-old",
["Tiếng Medumba"] = "byv",
["Tiếng Mehri"] = "gdq",
["Tiếng Memon"] = "mby",
["Tiếng Mende"] = "men",
["Tiếng Meriam"] = "ulk",
["Tiếng Mi'kmaq"] = "mic",
["Tiếng Miami"] = "mia",
["Tiếng Mingrelia"] = "xmf",
["Tiếng Minriq"] = "mnq",
["Tiếng Mintil"] = "mzt",
["Tiếng Miranda"] = "mwl",
["Tiếng Mixtec Chayuco"] = "mih",
["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 Mlabri"] = "mra",
["Tiếng Mogholi"] = "mhj",
["Tiếng Moglena-Rumani"] = "ruq",
["Tiếng Mohawk"] = "moh",
["Tiếng Moken"] = "mwt",
["Tiếng Mokil"] = "mkj",
["Tiếng Moklen"] = "mkm",
["Tiếng Moksha"] = "mdf",
["Tiếng Mongghul"] = "xgn-mgl",
["Tiếng Mooré"] = "mos",
["Tiếng Mordvin nguyên thủy"] = "urj-mdv-pro",
["Tiếng Morokodo"] = "mgc",
["Tiếng Motu"] = "meu",
["Tiếng Mozarab"] = "mxi",
["Tiếng Muak Sa-aak"] = "ukk",
["Tiếng Munda nguyên thủy"] = "mun-pro",
["Tiếng Mundari"] = "unr",
["Tiếng Munji"] = "mnj",
["Tiếng Mursi"] = "muz",
["Tiếng Muscogee"] = "mus",
["Tiếng Muskogee nguyên thủy"] = "nai-mus-pro",
["Tiếng Mwotlap"] = "mlv",
["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 Brunei"] = "kxd",
["Tiếng Mã Lai Bắc Maluku"] = "max",
["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ô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 Naga Chothe"] = "nct",
["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 Kolami"] = "nit",
["Tiếng Nam Mansi"] = "mns-sou",
["Tiếng Nam Ndebele"] = "nr",
["Tiếng Nam Sami"] = "sma",
["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 Nanai"] = "gld",
["Tiếng Napoli"] = "nap",
["Tiếng Nauru"] = "na",
["Tiếng Navajo"] = "nv",
["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",
["Tiếng Nepal"] = "ne",
["Tiếng Newa"] = "new",
["Tiếng Nga"] = "ru",
["Tiếng Ngalum"] = "szb",
["Tiếng Nganasan"] = "nio",
["Tiếng Ngas"] = "anc",
["Tiếng Ngiemboon"] = "nnh",
["Tiếng Ngomba"] = "jgo",
["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 Niue"] = "niu",
["Tiếng Nivkh"] = "niv",
["Tiếng Nkari"] = "nkz",
["Tiếng Nkonya"] = "nko",
["Tiếng Nobiin"] = "fia",
["Tiếng Nogai"] = "nog",
["Tiếng Noreia"] = "nrc",
["Tiếng Norman"] = "nrf",
["Tiếng Novgorod cổ"] = "zle-ono",
["Tiếng Novial"] = "nov",
["Tiếng Nubaca"] = "baf",
["Tiếng Nubi"] = "kcn",
["Tiếng Nuer"] = "nus",
["Tiếng Nuu-chah-nulth"] = "nuk",
["Tiếng Nyah Kur"] = "cbn",
["Tiếng Nyaw"] = "nyw",
["Tiếng Nyeu"] = "nyl",
["Tiếng Nùng"] = "nut",
["Tiếng Nùng Vẻn"] = "enc",
["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 Oirat"] = "xwo",
["Tiếng Ojibwe"] = "oj",
["Tiếng Okanagan"] = "oka",
["Tiếng Okinawa"] = "ryu",
["Tiếng Okinoerabu"] = "okn",
["Tiếng Olukumi"] = "ulb",
["Tiếng Omaha-Ponca"] = "oma",
["Tiếng Omok"] = "omk",
["Tiếng Oriya"] = "or",
["Tiếng Oriya Adiwasi"] = "ort",
["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 Ossetia"] = "os",
["Tiếng Ossetia cổ"] = "oos",
["Tiếng Otomi Mezquital"] = "ote",
["Tiếng Otuke"] = "otu",
["Tiếng Pa Kô"] = "pac",
["Tiếng Pa'O"] = "blk",
["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 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 Pali"] = "pi",
["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 Papiamento"] = "pap",
["Tiếng Parauk"] = "prk",
["Tiếng Parthia"] = "xpr",
["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 Nam"] = "spx",
["Tiếng Piemonte"] = "pms",
["Tiếng Pilagá"] = "plg",
["Tiếng Pinyin"] = "pny",
["Tiếng Pipil"] = "ppl",
["Tiếng Pnar"] = "pbv",
["Tiếng Pohnpei"] = "pon",
["Tiếng Polabia"] = "pox",
["Tiếng Ponosakan"] = "pns",
["Tiếng Popoluca cao nguyên"] = "poi",
["Tiếng Potawatomi"] = "pot",
["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 Prasuni"] = "prn",
["Tiếng Pucikwar"] = "apq",
["Tiếng Punic"] = "xpu",
["Tiếng Punjab"] = "pa",
["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 Quan Thoại"] = "cmn",
["Tiếng Quapaw"] = "qua",
["Tiếng Quechua"] = "qu",
["Tiếng Quenya"] = "qya",
["Tiếng Quiripi"] = "qyp",
["Tiếng Quảng Đông"] = "yue",
["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 Raute"] = "rau",
["Tiếng Ravula"] = "yea",
["Tiếng Rawang"] = "raw",
["Tiếng Rejang"] = "rej",
["Tiếng Rendille"] = "rel",
["Tiếng Rohingya"] = "rhg",
["Tiếng Romagnol"] = "rgn",
["Tiếng Romansh"] = "rm",
["Tiếng Rukai"] = "dru",
["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"] = "xsa",
["Tiếng Sabüm"] = "sbo",
["Tiếng Sadri"] = "sck",
["Tiếng Saek"] = "skb",
["Tiếng Saho"] = "ssy",
["Tiếng Saisiyat"] = "xsy",
["Tiếng Sakizaya"] = "szy",
["Tiếng Salar"] = "slr",
["Tiếng Salish nguyên thủy"] = "sal-pro",
["Tiếng Sami Akkala"] = "sia",
["Tiếng Sami Inari"] = "smn",
["Tiếng Sami Kildin"] = "sjd",
["Tiếng Sami Skolt"] = "sms",
["Tiếng Sami Ume"] = "sju",
["Tiếng Sami nguyên thủy"] = "smi-pro",
["Tiếng Samoa"] = "sm",
["Tiếng Samogitia"] = "sgs",
["Tiếng Samoyed nguyên thủy"] = "syd-pro",
["Tiếng Samtao"] = "stu",
["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 Saxon cổ"] = "osx",
["Tiếng Scots"] = "sco",
["Tiếng Sebat Bet Gurage"] = "sgw",
["Tiếng Selkup"] = "sel",
["Tiếng Semai"] = "sea",
["Tiếng Semaq Beri"] = "szc",
["Tiếng Semelai"] = "sza",
["Tiếng Semit nguyên thủy"] = "sem-pro",
["Tiếng Semnam"] = "ssm",
["Tiếng Seneca"] = "see",
["Tiếng Senni Koyraboro"] = "ses",
["Tiếng Senoufo Nyarafolo"] = "sev",
["Tiếng Serbia-Croatia"] = "sh",
["Tiếng Seri"] = "sei",
["Tiếng Seze"] = "sze",
["Tiếng Shan"] = "shn",
["Tiếng Sherpa"] = "xsr",
["Tiếng Shina"] = "scl",
["Tiếng Shina Kohistan"] = "plk",
["Tiếng Sholaga"] = "sle",
["Tiếng Shompen"] = "sii",
["Tiếng Shona"] = "sn",
["Tiếng Shor"] = "cjs",
["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 Sindh"] = "sd",
["Tiếng Bidayuh Bau"] = "sne",
["Tiếng Sinhala"] = "si",
["Tiếng Sioux nguyên thủy"] = "sio-pro",
["Tiếng Siraya"] = "fos",
["Tiếng Sissano"] = "sso",
["Tiếng Siwi"] = "siz",
["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 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 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 Sranan Tongo"] = "srn",
["Tiếng Sumer"] = "sux",
["Tiếng Sunda"] = "su",
["Tiếng Sunda cổ"] = "osn",
["Tiếng Suri"] = "suq",
["Tiếng Surjapur"] = "sjp",
["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 Tagal Murut"] = "mvv",
["Tiếng Tagalog"] = "tl",
["Tiếng Tagoi"] = "tag",
["Tiếng Tahiti"] = "ty",
["Tiếng Tai Loi"] = "tlq",
["Tiếng Tai Tây Nam nguyên thủy"] = "tai-swe-pro",
["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 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 Tangut"] = "txg",
["Tiếng Tanimbili"] = "tbe",
["Tiếng Taos"] = "twf",
["Tiếng Tapirapé"] = "taf",
["Tiếng Tara Baka"] = "bdh",
["Tiếng Tariana"] = "tae",
["Tiếng Tarifit"] = "rif",
["Tiếng Tashelhit"] = "shi",
["Tiếng Tat-Do Thái"] = "jdt",
["Tiếng Tatar"] = "tt",
["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 Taz"] = "zhx-taz",
["Tiếng Telugu"] = "te",
["Tiếng Tem"] = "kdh",
["Tiếng Temiar"] = "tea",
["Tiếng Temoq"] = "tmo",
["Tiếng Ten'edn"] = "tnz",
["Tiếng Tenharim"] = "pah",
["Tiếng Tepehuan Đông Nam"] = "stp",
["Tiếng Teressa"] = "tef",
["Tiếng Ternate"] = "tft",
["Tiếng Tetum"] = "tet",
["Tiếng Thavưng"] = "thm",
["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 Song"] = "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ượ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 Tiruray"] = "tiy",
["Tiếng Tiên Ti"] = "qfa-xgx-xbi",
["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 Tonga"] = "to",
["Tiếng Tooro"] = "ttj",
["Tiếng Torwali"] = "trw",
["Tiếng Toto"] = "txo",
["Tiếng Tráng Tả Giang"] = "zzj",
["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 Mansi"] = "mns-cen",
["Tiếng Trung Nahuatl"] = "nhn",
["Tiếng Trung Nahuatl Huasteca"] = "nch",
["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 Đứ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 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 Tunni"] = "tqq",
["Tiếng Tupi"] = "tpn",
["Tiếng Tupi cổ"] = "tpw",
["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 Tuva"] = "tyv",
["Tiếng Tuvalu"] = "tvl",
["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 Do Thái Barzani"] = "bjf",
["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 Kavkaz nguyên thủy"] = "cau-nwc-pro",
["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 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 Chaima"] = "ciy",
["Tiếng Ubykh"] = "uby",
["Tiếng Udi"] = "udi",
["Tiếng Udihe"] = "ude",
["Tiếng Udmurt"] = "udm",
["Tiếng Ugarit"] = "uga",
["Tiếng Ugong"] = "ugo",
["Tiếng Ugria nguyên thủy"] = "urj-ugr-pro",
["Tiếng Ukraina"] = "uk",
["Tiếng Umbria"] = "xum",
["Tiếng Uneapa"] = "bbn",
["Tiếng Urak Lawoi'"] = "urk",
["Tiếng Ural nguyên thủy"] = "urj-pro",
["Tiếng Urartu"] = "xur",
["Tiếng Urdu"] = "ur",
["Tiếng Urubú-Kaapor"] = "urb",
["Tiếng Urum"] = "uum",
["Tiếng Ushojo"] = "ush",
["Tiếng Uzbek"] = "uz",
["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 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 Vot"] = "vot",
["Tiếng Vurës"] = "msn",
["Tiếng Waata"] = "ssn",
["Tiếng Waimaha"] = "bao",
["Tiếng Waiwai"] = "waw",
["Tiếng Wakhi"] = "wbl",
["Tiếng Wales"] = "cy",
["Tiếng Wallis"] = "wls",
["Tiếng Wallon"] = "wa",
["Tiếng Wambule"] = "wme",
["Tiếng Waneci"] = "wne",
["Tiếng War-Jaintia"] = "aml",
["Tiếng Waray"] = "war",
["Tiếng Warekena"] = "gae",
["Tiếng Warji"] = "wji",
["Tiếng Wayampi"] = "oym",
["Tiếng Wayana"] = "way",
["Tiếng Wayuu"] = "guc",
["Tiếng Wewaw"] = "wea",
["Tiếng Wobé"] = "wob",
["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 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 Yaeyama"] = "rys",
["Tiếng Yaghnob"] = "yai",
["Tiếng Yakan"] = "yka",
["Tiếng Yakima"] = "yak",
["Tiếng Yakkha"] = "ybh",
["Tiếng Yakut"] = "sah",
["Tiếng Yami"] = "tao",
["Tiếng Yao (Nam Mĩ)"] = "sai-yao",
["Tiếng Yap"] = "yap",
["Tiếng Yapunda"] = "yev",
["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 Yiwom"] = "gek",
["Tiếng Yogad"] = "yog",
["Tiếng Yola"] = "yol",
["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 Yoy"] = "yoy",
["Tiếng Yugh"] = "yug",
["Tiếng Yukaghir nguyên thủy"] = "qfa-yuk-pro",
["Tiếng Yup'ik"] = "esu",
["Tiếng Yuri"] = "sai-yri",
["Tiếng Yurok"] = "yur",
["Tiếng Zaghawa"] = "zag",
["Tiếng Zaiwa"] = "atb",
["Tiếng Zarma"] = "dje",
["Tiếng Zarphat"] = "zrp",
["Tiếng Zay"] = "zwa",
["Tiếng Zayse-Zergulla"] = "zay",
["Tiếng Zaza"] = "zza",
["Tiếng Zeeland"] = "zea",
["Tiếng Zenaga"] = "zen",
["Tiếng Zirenkel"] = "zrn",
["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 Ö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 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 Khanty"] = "kca-eas",
["Tiếng Đông Yugur"] = "yuy",
["Tiếng Đường Uông"] = "zhx-twa",
["Tiếng Độc Long"] = "duu",
["Tiếng Đức"] = "de",
["Tiếng Đức Alemanni"] = "gsw",
["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 Bắc Levant"] = "apc",
["Tiếng Ả Rập Hijazi"] = "acw",
["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 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",
["Tiếng Önge"] = "oon",
["Đa ngữ"] = "mul",
["ǀXam"] = "xam",
["ǁAni"] = "hnh",
["ǁGana"] = "gnk",
["ǁXegwi"] = "xeg",
["ǂHoan"] = "huc",
["ǃKung"] = "khi-kun",
["Tiếng Bắc Selkup"] = "sel-nor",
["Tiếng Nam Selkup"] = "sel-sou",
["Tiếng Selkup nguyên thủy"] = "sel-pro",
["Tiếng Slovak cổ"] = "zlw-osk",
["Proto-Central Naga"] = "sit-aao-pro",
["Tiếng Bạch nguyên thủy"] = "sit-bai-pro",
["Bangru"] = "sit-ban",
["Proto-Bodish"] = "sit-bdi-pro",
["Tiếng Tứ Xuyên"] = "zhx-sic",
["Tiếng Quảng Lâm"] = "aav-qal",
}
c0bvl9y3z5dfddt7qh4vaahwfxzzeev
2353532
2353529
2026-05-15T07:26:29Z
Hiyuune
50834
2353532
Scribunto
text/plain
return {
["Tiếng A'ou"] = "aou",
["Aba"] = "utp",
["Abai Sungai"] = "abf",
["Tiếng Abanyom"] = "abm",
["Abenlen Ayta"] = "abp",
["Abipon"] = "axb",
["Abishira"] = "ash",
["Abom"] = "aob",
["Tiếng Abon"] = "abo",
["Tiếng Abron"] = "abr",
["Abu"] = "ado",
["Abu' Arapesh"] = "aah",
["Abua"] = "abn",
["Tiếng Abui"] = "abz",
["Abun"] = "kgr",
["Abung"] = "abl",
["Tiếng Abure"] = "abu",
["Abureni"] = "mgj",
["Abé"] = "aba",
["Tiếng Me'phaa Acatepec"] = "tpx",
["Ache"] = "yif",
["Tiếng Achi"] = "acr",
["Tiếng Achuar"] = "acu",
["Achumawi"] = "acv",
["Aché"] = "guq",
["Acroá"] = "acs",
["Adabe"] = "adb",
["Adai"] = "xad",
["Adamorobe Sign Language"] = "ads",
["Adang"] = "adn",
["Adangbe"] = "adq",
["Adap"] = "adp",
["Adasen"] = "tiu",
["Adele"] = "ade",
["Adhola"] = "adh",
["Tiếng Adi"] = "adi",
["Adioukrou"] = "adj",
["Adithinngithigh"] = "dth",
["Tiếng Adnyamathanha"] = "adt",
["Adonara"] = "adr",
["Aduge"] = "adu",
["Aeka"] = "aez",
["Aekyom"] = "awi",
["Aequian"] = "xae",
["Aer"] = "aeq",
["Afade"] = "aal",
["Afghan Sign Language"] = "afg",
["Afitti"] = "aft",
["Afra"] = "ulf",
["Afrihili"] = "afh",
["Afro-Seminole Creole"] = "afs",
["Agarabi"] = "agd",
["Agariya"] = "agi",
["Tiếng Agatu"] = "agc",
["Agavotaguerra"] = "avo",
["Aghu"] = "ahh",
["Aghu Tharrnggala"] = "gtu",
["Agi"] = "aif",
["Agob"] = "kit",
["Agoi"] = "ibm",
["Tiếng Aguacateca"] = "agu",
["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",
["Tiếng Aka-Kede"] = "akx",
["Aka-Kol"] = "aky",
["Aka-Kora"] = "ack",
["Akar-Bale"] = "acl",
["Akaselem"] = "aks",
["Akatek"] = "knj",
["Ake"] = "aik",
["Akebu"] = "keu",
["Akei"] = "tsr",
["Akeu"] = "aeu",
["Akolet"] = "akt",
["Akoose"] = "bss",
["Akoye"] = "miw",
["Akpa"] = "akf",
["Akpes"] = "ibe",
["Akrukay"] = "afi",
["Akuku"] = "ayk",
["Akum"] = "aku",
["Tiếng Akuntsu"] = "aqz",
["Akurio"] = "ako",
["Akuwagel"] = "bey",
["Akwa"] = "akw",
["Akyaung Ari"] = "nqy",
["Al-Sayyid Bedouin Sign Language"] = "syy",
["Alabat Island Agta"] = "dul",
["Alacatlatzala Mixtec"] = "mim",
["Alago"] = "ala",
["Tiếng Alamblak"] = "amp",
["Tiếng Alangan"] = "alj",
["Alapmunte"] = "apv",
["Alas-Kluet Batak"] = "btz",
["Alazapa"] = "nai-ala",
["Albanian Sign Language"] = "sqk",
["Tiếng Mixtec Alcozauca"] = "xta",
["Alege"] = "alf",
["Algerian Sign Language"] = "asp",
["Ali"] = "aiy",
["Alladian"] = "ald",
["Allar"] = "all",
["Tiếng Alyentiyak"] = "sai-all",
["Alngith"] = "aid",
["Alo Phola"] = "ypo",
["Alor"] = "aol",
["Aloápam Zapotec"] = "zaq",
["Alu"] = "mte",
["Tiếng Kurumba Alu"] = "xua",
["Alugu"] = "aub",
["Tiếng Alumu-Tesu"] = "aab",
["Alune"] = "alp",
["Alungul"] = "aus-alu",
["Aluo"] = "yna",
["Alur"] = "alz",
["Alutiiq"] = "ems",
["Alviri-Vidari"] = "avd",
["Alyawarr"] = "aly",
["Amahai"] = "amq",
["Tiếng Amal"] = "aad",
["Tiếng Amanab"] = "amn",
["Amanayé"] = "ama",
["Amara"] = "aie",
["Amarakaeri"] = "amr",
["Amarizana"] = "awd-ama",
["Amasi"] = "alv-ama",
["Amatlán Zapotec"] = "zpo",
["Amba"] = "rwm",
["Tiếng Ambai"] = "amk",
["Ambakich"] = "aew",
["Ambala Ayta"] = "abc",
["Ambelau"] = "amv",
["Ambele"] = "ael",
["Amblong"] = "alm",
["Ambo"] = "amb",
["Ambul"] = "apo",
["Tiếng Ambulas"] = "abt",
["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",
["Tiếng Anaang"] = "anw",
["Anakalangu"] = "akg",
["Anam"] = "pda",
["Anambé"] = "aan",
["Anamgura"] = "imi",
["Anasi"] = "bpo",
["Tiếng Anauyá"] = "awd-ana",
["Ancient Ligurian"] = "xlg",
["Ancient North Arabian"] = "xna",
["Ancient Zapotec"] = "xzp",
["Andai"] = "afd",
["Andajin"] = "ajn",
["Tiếng Ả Rập Andalusia"] = "xaa",
["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",
["Angaataha"] = "agm",
["Angaité"] = "aqt",
["Angal"] = "age",
["Angal Enen"] = "aoe",
["Angal Heneng"] = "akh",
["Tiếng Angami"] = "njm",
["Angevin"] = "roa-ang",
["Tiếng Yali Angguruk"] = "yli",
["Angkamuthi"] = "avm",
["Angkola Batak"] = "akb",
["Tiếng Angkula"] = "aus-ang",
["Angloromani"] = "rme",
["Angor"] = "agg",
["Angoram"] = "aog",
["Angosturas Tunebo"] = "tnd",
["Anguthimri"] = "awg",
["Ani Phowa"] = "ypn",
["Animere"] = "anf",
["Anindilyakwa"] = "aoi",
["Anjam"] = "boj",
["Anmatyerre"] = "amx",
["Tiếng Annobón"] = "fab",
["Anong"] = "nun",
["Anor"] = "anj",
["Anserma"] = "ans",
["Ansus"] = "and",
["Antakarinya"] = "ant",
["Antigua and Barbuda Creole English"] = "aig",
["Tiếng Creole Antilles"] = "gcf",
["Anu"] = "anl",
["Anuak"] = "anu",
["Anufo"] = "cko",
["Anus"] = "auq",
["Anuta"] = "aud",
["Anyin Morofo"] = "mtb",
["Tiếng Ao"] = "njo",
["Aoheng"] = "pni",
["Aore"] = "aor",
["Ap Ma"] = "kbx",
["Apalachee"] = "xap",
["Apali"] = "ena",
["Apasco-Apoala Mixtec"] = "mip",
["Tiếng Apatani"] = "apt",
["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",
["Tiếng Arapaho"] = "arp",
["Arapaso"] = "arj",
["Arara-Karo"] = "arr",
["Ararandewára"] = "xaj",
["Arawum"] = "awm",
["Arbore"] = "arv",
["Are"] = "mwc",
["Areba"] = "aea",
["Argentine Sign Language"] = "aed",
["Arguni"] = "agf",
["Arhuaco"] = "arh",
["Arhâ"] = "aqr",
["Arhö"] = "aok",
["Tiếng Ari"] = "aac",
["Aribwatsa"] = "laz",
["Aribwaung"] = "ylu",
["Arifama-Miniafia"] = "aai",
["Arigidi"] = "aqg",
["Arikapú"] = "ark",
["Arikara"] = "ari",
["Arikem"] = "ait",
["Tiếng Arin"] = "xrn",
["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",
["Tiếng Ashkun"] = "ask",
["Asho Chin"] = "csh",
["Asháninka"] = "cni",
["Tiếng Ashéninka Pajonal"] = "cjo",
["Ashéninka Perené"] = "prq",
["Tiếng Asi"] = "bno",
["Asilulu"] = "asl",
["Asoa"] = "asv",
["Assangori"] = "sjg",
["Tiếng Assiniboine"] = "asb",
["Asu"] = "aum",
["Asue Awyu"] = "psa",
["Tiếng Asumboa"] = "aua",
["Asunción Mixtepec Zapotec"] = "zoo",
["Ata"] = "atm",
["Ata Manobo"] = "atd",
["Atakapa"] = "aqp",
["Atampaya"] = "amz",
["Atanques"] = "cba-ata",
["Atatláhuca Mixtec"] = "mib",
["Tiếng Atemble"] = "ate",
["Ateso"] = "teo",
["Ati"] = "atk",
["Atohwaim"] = "aqm",
["Atong (Cameroon)"] = "ato",
["Atorada"] = "aox",
["Tiếng Atsahuaca"] = "atc",
["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",
["Avatime"] = "avn",
["Avau"] = "avb",
["Avava"] = "tmb",
["Avikam"] = "avi",
["Avá-Canoeiro"] = "avv",
["Awa (China)"] = "vwa",
["Awa (New Guinea)"] = "awb",
["Awa-Cuaiquer"] = "kwi",
["Awabakal"] = "awk",
["Awak"] = "awo",
["Awar"] = "aya",
["Awara"] = "awx",
["Awbono"] = "awh",
["Aweer"] = "bob",
["Awera"] = "awr",
["Awetí"] = "awe",
["Tiếng Awjila"] = "auj",
["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",
["Tiếng Me'phaa Azoyú"] = "tpc",
["Baa"] = "kwb",
["Tiếng Baagandji"] = "drl",
["Baan"] = "bvj",
["Baangi"] = "bqx",
["Baatonum"] = "bba",
["Baba"] = "bbw",
["Babango"] = "bbm",
["Babanki"] = "bbk",
["Babine-Witsuwit'en"] = "bcr",
["Babole"] = "bvx",
["Tiếng Bacama"] = "bcy",
["Tiếng Mã Lai Bacan"] = "btj",
["Bada"] = "bhz",
["Bade"] = "bde",
["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",
["Tiếng Bagua"] = "sai-bag",
["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",
["Bajjika"] = "vjk",
["Baka"] = "bkc",
["Bakairí"] = "bkq",
["Bakaka"] = "bqz",
["Baki"] = "bki",
["Bakoko"] = "bkh",
["Bakole"] = "kme",
["Bakpinka"] = "bbs",
["Bakulung"] = "bbu",
["Bakumpai"] = "bkr",
["Tiếng Bakung"] = "xkl",
["Bakwé"] = "bjw",
["Balaesang"] = "bls",
["Balangao"] = "blw",
["Balangingi"] = "sse",
["Tiếng Balantak"] = "blz",
["Balau"] = "blg",
["Baldemu"] = "bdn",
["Bali"] = "bcp",
["Baliledo"] = "poz-bal",
["Balinese Malay"] = "mhp",
["Balkan Romani"] = "rmn",
["Balo"] = "bqo",
["Baloi"] = "biz",
["Balong"] = "bnt-bal",
["Baltic Romani"] = "rml",
["Baluan-Pam"] = "blq",
["Bamako Sign Language"] = "bog",
["Bamali"] = "bbq",
["Bambalang"] = "bmo",
["Bambam"] = "ptu",
["Bambili-Bambui"] = "baw",
["Bamenyam"] = "bce",
["Bamu"] = "bcf",
["Bamukumbit"] = "bqt",
["Bamum"] = "bax",
["Bamunka"] = "bvm",
["Bamwe"] = "bmg",
["Ban Khor Sign Language"] = "bfk",
["Bana"] = "bcw",
["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",
["Tiếng Bandjalang"] = "bdy",
["Bangala"] = "bxg",
["Bangandu"] = "bgf",
["Bangba"] = "bbe",
["Tiếng Banggai"] = "bgz",
["Tiếng Bangi"] = "bni",
["Bangime"] = "dba",
["Bangka"] = "mfb",
["Bangolan"] = "bgj",
["Bangubangu"] = "bnx",
["Bangwinji"] = "bsj",
["Baniva"] = "bvv",
["Baniwa"] = "bwi",
["Banka"] = "bxw",
["Bankan Tey Dogon"] = "dbw",
["Tiếng Bankon"] = "abb",
["Banoni"] = "bcm",
["Bantayanon"] = "bfx",
["Bantik"] = "bnq",
["Banyumasan"] = "map-bms",
["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",
["Tiếng Barikewa"] = "jbk",
["Barngarla"] = "bjb",
["Barok"] = "bjk",
["Tiếng Barombi"] = "bbi",
["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",
["Bassari"] = "bsc",
["Bassossi"] = "bsi",
["Bata"] = "bta",
["Bataan Ayta"] = "ayt",
["Batad Ifugao"] = "ifb",
["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",
["Beaver"] = "bea",
["Beba"] = "bfp",
["Bebe"] = "bzv",
["Bebele"] = "beb",
["Bebeli"] = "bek",
["Bebil"] = "bxp",
["Bedik"] = "tnr",
["Bedjond"] = "bjv",
["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",
["Betta Kurumba"] = "xub",
["Bhadrawahi"] = "bhd",
["Bhalay"] = "bhx",
["Bharia"] = "bha",
["Bhatri"] = "bgw",
["Bhattiyali"] = "bht",
["Bhaya"] = "bhe",
["Bhele"] = "bhy",
["Bhilali"] = "bhi",
["Bhoti Kinnauri"] = "nes",
["Bhunjia"] = "bhu",
["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",
["Tiếng Bilua"] = "blb",
["Bilur"] = "bxf",
["Tiếng Bima"] = "bhp",
["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",
["Tiếng Binukid"] = "bkd",
["Binumarien"] = "bjr",
["Bipi"] = "biq",
["Birgid"] = "brk",
["Birgit"] = "btf",
["Biri"] = "bzr",
["Biritai"] = "bqq",
["Birri"] = "bvq",
["Birrpayi"] = "xbj",
["Birwa"] = "brl",
["Biseni"] = "ije",
["Bishuo"] = "bwh",
["Bisis"] = "bnw",
["Bisorio"] = "bir",
["Tiếng Bissa"] = "bib",
["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",
["Tiếng Gadaba Bodo"] = "gbj",
["Bodo Parja"] = "bdv",
["Bofi"] = "bff",
["Boga"] = "bvw",
["Bogaya"] = "boq",
["Boguru"] = "bqu",
["Tiếng Tân Aram Bohtan"] = "bhn",
["Boikin"] = "bzf",
["Bokha"] = "ybk",
["Boko"] = "bqc",
["Bokoto"] = "bdt",
["Bokyi"] = "bky",
["Tiếng Bola"] = "bnp",
["Bolak"] = "art-blk",
["Bolango"] = "bld",
["Bole"] = "bol",
["Bolgo"] = "bvo",
["Bolia"] = "bli",
["Bolinao"] = "smk",
["Bolivian Sign Language"] = "bvl",
["Tiếng Boloki"] = "bkt",
["Bolon"] = "bof",
["Bolondo"] = "bzm",
["Bolongan"] = "blj",
["Bom"] = "bmf",
["Boma Nkuu"] = "bnt-bon",
["Boma Yumu"] = "bnt-boy",
["Bomboli"] = "bml",
["Bomboma"] = "bws",
["Bomitaba"] = "zmx",
["Bomu"] = "bmq",
["Bomwali"] = "bmw",
["Bon Gula"] = "glc",
["Bondei"] = "bou",
["Bondoukou Kulango"] = "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",
["Botolan Sambal"] = "sbl",
["Bouna Kulango"] = "nku",
["Bourbonnais-Berrichon"] = "roa-bbn",
["Tiếng Bourguignon"] = "roa-brg",
["Bozaba"] = "bzo",
["Bragat"] = "aof",
["Brazilian Sign Language"] = "bzs",
["Brek Karen"] = "kvl",
["Brem"] = "buq",
["Bribri"] = "bzd",
["British Sign Language"] = "bfi",
["Brokkat"] = "bro",
["Brokpake"] = "sgt",
["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",
["Tiếng Bube"] = "bvb",
["Bubi"] = "buw",
["Bubia"] = "bbx",
["Budibud"] = "btp",
["Budong-Budong"] = "bdx",
["Budu"] = "buu",
["Buduma"] = "bdm",
["Budza"] = "bja",
["Buena Vista Yokuts"] = "nai-bvy",
["Buglere"] = "sab",
["Bugun"] = "bgg",
["Buhi'non Bikol"] = "ubl",
["Tiếng Buhid"] = "bku",
["Buhutu"] = "bxh",
["Bujhyal"] = "byh",
["Bukar-Sadung Bidayuh"] = "sdo",
["Bukat"] = "bvk",
["Bukawa"] = "buk",
["Bukit Malay"] = "bvu",
["Bukitan"] = "bkn",
["Bukiyip"] = "ape",
["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",
["Bumthangkha"] = "kjz",
["Bun"] = "buv",
["Buna"] = "bvn",
["Bunaba"] = "bck",
["Bunak"] = "bfn",
["Bunama"] = "bdd",
["Bundeli"] = "bns",
["Bung"] = "bqd",
["Bungain"] = "but",
["Bunganditj"] = "xbg",
["Tiếng Bungku"] = "bkz",
["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",
["Bussa"] = "dox",
["Busuu"] = "bju",
["Butbut Kalinga"] = "kyb",
["Butchulla"] = "xby",
["Butmas-Tur"] = "bnr",
["Tiếng Butuanon"] = "btw",
["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",
["Cajonos Zapotec"] = "zad",
["Caka"] = "ckx",
["Cakchiquel-Quiché Mixed Language"] = "ckz",
["Cakfem-Mushere"] = "cky",
["Calabrian Greek"] = "grk-cal",
["Calamian Tagbanwa"] = "tbk",
["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",
["Camunic"] = "xcc",
["Candoshi-Shapra"] = "cbu",
["Canichana"] = "caz",
["Cao Miao"] = "cov",
["Tiếng Capanahua"] = "kaq",
["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",
["Tiếng Catawba"] = "chc",
["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",
["Tiếng Bạch Trung"] = "bca",
["Central Bontoc"] = "lbk",
["Central Cagayan Agta"] = "agt",
["Tiếng Trung Dusun"] = "dtp",
["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 Puebla Nahuatl"] = "ncx",
["Central Sama"] = "sml",
["Central Siberian Yupik"] = "ess",
["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",
["Chak"] = "ckh",
["Chakali"] = "cli",
["Chala"] = "cll",
["Chaldean Neo-Aramaic"] = "cld",
["Chali"] = "tgf",
["Chamacoco"] = "ceg",
["Chamba Daka"] = "ccg",
["Chamba Leko"] = "ndi",
["Chambri"] = "can",
["Champenois"] = "roa-cha",
["Chang"] = "nbc",
["Changriwa"] = "cga",
["Changthang"] = "cna",
["Chantyal"] = "chx",
["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",
["Chenchu"] = "cde",
["Chenoua"] = "cnu",
["Chepya"] = "ycp",
["Cherepon"] = "cpn",
["Chesu"] = "ych",
["Chetco-Tolowa"] = "ctc",
["Chhintange"] = "ctn",
["Chhulung"] = "cur",
["Chiangmai Sign Language"] = "csd",
["Chiapanec"] = "cip",
["Tiếng Triqui Chicahuaxtla"] = "trs",
["Chichicapan Zapotec"] = "zpv",
["Chichimeca-Jonaz"] = "pei",
["Chichonyi-Chidzihana-Chikauma"] = "coh",
["Chicomuceltec"] = "cob",
["Chiduruma"] = "dug",
["Chigmecatitlán Mixtec"] = "mii",
["Chilcotin"] = "clc",
["Chilean Sign Language"] = "csg",
["Chilisso"] = "clh",
["Chiltepec Chinantec"] = "csa",
["Chimalapa Zoque"] = "zoh",
["Chimariko"] = "cid",
["Chimila"] = "cbg",
["Chimwiini"] = "bnt-cmw",
["Chinali"] = "cih",
["Chinbon Chin"] = "cnb",
["Chinese Pidgin English"] = "cpi",
["Chinese Sign Language"] = "csl",
["Chipaya"] = "cap",
["Chiquihuitlán Mazatec"] = "maq",
["Chiquimulilla"] = "nai-chi",
["Chiquitano"] = "cax",
["Tiếng Chiricahua"] = "apm",
["Chirino"] = "sai-chi",
["Chiripá"] = "nhd",
["Chitimacha"] = "ctm",
["Chitkuli Kinnauri"] = "cik",
["Chitwania Tharu"] = "the",
["Choapan Zapotec"] = "zpc",
["Chochotec"] = "coz",
["Chokri Naga"] = "nri",
["Chokwe"] = "cjk",
["Tiếng Chol"] = "ctu",
["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",
["Tiếng Churah"] = "cdj",
["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",
["Classical Gaelic"] = "ghc",
["Classical Guaraní"] = "gn-cls",
["Classical Mandaic"] = "myz",
["Classical Newar"] = "nwc",
["Classical Quechua"] = "qwc",
["Coahuilteco"] = "xcw",
["Coast Miwok"] = "csi",
["Tiếng Kadazan bờ biển"] = "kzj",
["Coastal Konjo"] = "kjc",
["Coatecas Altas Zapotec"] = "zca",
["Coatepec Nahuatl"] = "naz",
["Coatlán Mixe"] = "mco",
["Coatlán Zapotec"] = "zps",
["Coatzospan Mixtec"] = "miz",
["Tiếng Cocama"] = "cod",
["Tiếng Cochimi"] = "coj",
["Cocopa"] = "coc",
["Cocos Islands Malay"] = "coa",
["Coeruna"] = "sai-coe",
["Coeur d'Alene"] = "crd",
["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",
["Copala Triqui"] = "trc",
["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",
["Tiếng Cowlitz"] = "cow",
["Coyaima"] = "coy",
["Coyotepec Popoloca"] = "pbf",
["Coyutla Totonac"] = "toc",
["Crimean Gothic"] = "gme-cgo",
["Croatian Sign Language"] = "csq",
["Cross River Mbembe"] = "mfn",
["Cruzeño"] = "crz",
["Cuban Sign Language"] = "csf",
["Cubeo"] = "cub",
["Cueva"] = "sai-cva",
["Cuiba"] = "cui",
["Cuitlatec"] = "cuy",
["Culina"] = "cul",
["Culli"] = "sai-cul",
["Cumanagoto"] = "cuo",
["Cumbric"] = "xcb",
["Cun"] = "cuq",
["Cung"] = "cug",
["Curonian"] = "xcu",
["Curripaco"] = "kpc",
["Cutchi-Swahili"] = "ccl",
["Cuvok"] = "cuv",
["Cuyamecalco Mixtec"] = "xtu",
["Tiếng Cuyunon"] = "cyo",
["Cwi Bwamu"] = "bwy",
["Czech Sign Language"] = "cse",
["Tiếng Cống"] = "cnc",
["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",
["Dagba"] = "dgk",
["Dagik"] = "dec",
["Dagoman"] = "dgn",
["Daho-Doo"] = "das",
["Dai"] = "dij",
["Dair"] = "drb",
["Dairi Batak"] = "btd",
["Dakaka"] = "bpa",
["Dakka"] = "dkk",
["Dakpa"] = "dka",
["Daloa Bété"] = "bev",
["Dama (Nigeria)"] = "dmm",
["Dama (Sierra Leone)"] = "dmn-dam",
["Damakawa"] = "dam",
["Damal"] = "uhn",
["Dameli"] = "dml",
["Dampelas"] = "dms",
["Danaru"] = "dnr",
["Dandami Maria"] = "daq",
["Dangaura Tharu"] = "thl",
["Danish Sign Language"] = "dsl",
["Dano"] = "aso",
["Dao"] = "daz",
["Daonda"] = "dnd",
["Dar Daju Daju"] = "djc",
["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",
["Tiếng Deg Xinag"] = "ing",
["Degenan"] = "dge",
["Dehwari"] = "deh",
["Dek"] = "dek",
["Dela-Oenale"] = "row",
["Delo"] = "ntr",
["Delta Yokuts"] = "nai-dly",
["Dem"] = "dem",
["Dema"] = "dmx",
["Demisa"] = "dei",
["Demta"] = "dmy",
["Dena'ina"] = "tfn",
["Dendi"] = "ddn",
["Dengese"] = "dez",
["Dengka"] = "dnk",
["Deno"] = "dbb",
["Denya"] = "anv",
["Dení"] = "dny",
["Deori"] = "der",
["Desano"] = "des",
["Dewas Rai"] = "dwz",
["Dewoin"] = "dee",
["Dezfuli"] = "def",
["Dghwede"] = "dgh",
["Dhaiso"] = "dhs",
["Dhalandji"] = "dhl",
["Dhangu"] = "dhg",
["Dhao"] = "nfa",
["Tiếng Dharug"] = "xdk",
["Dhatki"] = "mki",
["Dhimal"] = "dhi",
["Dhofari Arabic"] = "adf",
["Dhudhuroa"] = "ddr",
["Dhungaloo"] = "dhx",
["Dhurga"] = "dhu",
["Dhuwal"] = "dwu",
["Dhuwaya"] = "dwy",
["Dia"] = "dia",
["Dibiyaso"] = "dby",
["Dibo"] = "dio",
["Dicamay Agta"] = "duy",
["Didinga"] = "did",
["Tiếng Dieri"] = "dif",
["Digo"] = "dig",
["Dii"] = "dur",
["Dijim-Bwilim"] = "cfa",
["Dilling"] = "dil",
["Dima"] = "jma",
["Tiếng Dimasa"] = "dis",
["Dimbong"] = "dii",
["Dime"] = "dim",
["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",
["Djinang"] = "dji",
["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",
["Domaaki"] = "dmk",
["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",
["Tiếng Doteli"] = "dty",
["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",
["Dumi"] = "dus",
["Dumpas"] = "dmv",
["Dumun"] = "dui",
["Duna"] = "duc",
["Dungmali"] = "raa",
["Dungu"] = "dbv",
["Tiếng Agta Dupaningan"] = "duo",
["Dura"] = "drq",
["Duri"] = "mvp",
["Duriankere"] = "dbn",
["Tiếng Duruwa"] = "pci",
["Dusner"] = "dsn",
["Dusun Deyah"] = "dun",
["Dusun Malang"] = "duq",
["Tiếng Dusun Witu"] = "duw",
["Tiếng Hạ Saxon Hà Lan"] = "nds-nl",
["Dutch Sign Language"] = "dse",
["Duupa"] = "dae",
["Duvle"] = "duv",
["Duwai"] = "dbp",
["Duwet"] = "gve",
["Dwang"] = "nnu",
["Dyaabugay"] = "dyy",
["Dyaberdyaber"] = "dyb",
["Dyan"] = "dya",
["Dyangadi"] = "dyn",
["Dyugun"] = "dyd",
["Tiếng Dyula"] = "dyu",
["Dza"] = "jen",
["Dzala"] = "dzl",
["Dzando"] = "dzn",
["Dzao Min"] = "bpn",
["Dzodinka"] = "add",
["Dâw"] = "kwa",
["Tiếng Ai"] = "eee",
["E'ma Buyang"] = "yzg",
["Tiếng Assam cận đại"] = "inc-oas",
["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 Acipa"] = "acp",
["Tiếng Arrernte Đông"] = "aer",
["Eastern Bolivian Guaraní"] = "gui",
["Eastern Canadian Inuktitut"] = "ike",
["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 Kayah"] = "eky",
["Eastern Keres"] = "kee",
["Eastern Krahn"] = "kqo",
["Eastern Lalu"] = "yit",
["Eastern Maninkakan"] = "emk",
["Eastern Meohang"] = "emg",
["Eastern Muria"] = "emu",
["Eastern Ngad'a"] = "nea",
["Eastern Nisu"] = "nos",
["Eastern Ojibwa"] = "ojg",
["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 Ica"] = "ica",
["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",
["Eravallan"] = "era",
["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",
["Falam Chin"] = "cfm",
["Fali"] = "fli",
["Fam"] = "fam",
["Tiếng Fanagalo"] = "fng",
["Fanamaket"] = "bjp",
["Fang (Bantu)"] = "fan",
["Fang (Beboid)"] = "fak",
["Fania"] = "fni",
["Far Western Muria"] = "fmu",
["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",
["Tiếng Foi"] = "foi",
["Foia Foia"] = "ffi",
["Folopa"] = "ppo",
["Foma"] = "fom",
["Fongoro"] = "fgr",
["Foodo"] = "fod",
["Forak"] = "frq",
["Fordata"] = "frd",
["Fore"] = "for",
["Forest Nenets"] = "syd-fne",
["Fortsenal"] = "frt",
["Franc-Comtois"] = "roa-fcm",
["Francisco León Zoque"] = "zos",
["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",
["Gaddi"] = "gbk",
["Gade"] = "ged",
["Gadjerawang"] = "gdh",
["Gadsup"] = "gaj",
["Gafat"] = "gft",
["Gagadu"] = "gbu",
["Gagnoa Bété"] = "btg",
["Gahri"] = "bfu",
["Gaikundi"] = "gbf",
["Gaina"] = "gcn",
["Gal"] = "gap",
["Galambu"] = "glo",
["Galela"] = "gbi",
["Galeya"] = "gar",
["Galice"] = "gce",
["Galindian"] = "xgl",
["Gallaecian"] = "cel-gal",
["Tiếng Gallo"] = "roa-gal",
["Tiếng Gallura"] = "sdn",
["Tiếng Galo"] = "adl",
["Galoli"] = "gal",
["Gambera"] = "gma",
["Gamela"] = "sai-gam",
["Tiếng Gamilaraay"] = "kld",
["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",
["Garhwali"] = "gbm",
["Tiếng Garifuna"] = "cab",
["Garingbal"] = "xgi",
["Garus"] = "gyb",
["Garza"] = "xgr",
["Gashowu"] = "nai-gsy",
["Gaulish"] = "cel-gau",
["Gavak"] = "dmc",
["Gavar"] = "gou",
["Gavião do Jiparaná"] = "gvo",
["Tiếng Gawwada"] = "gwd",
["Tiếng Gayil"] = "gyl",
["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",
["Tiếng Gbiri-Niragu"] = "grh",
["Gboloo Grebo"] = "gec",
["Gciriku"] = "diu",
["Gcwi"] = "gwj",
["Ge"] = "hmj",
["Gebe"] = "gei",
["Gedaged"] = "gdd",
["Geji"] = "gji",
["Gela"] = "nlg",
["Gelao"] = "gio",
["Gele'"] = "sbc",
["Geme"] = "geq",
["Gen"] = "gej",
["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",
["Ghomara"] = "gho",
["Tiếng Ghotuo"] = "aaa",
["Ghulfan"] = "ghl",
["Giangan"] = "bgi",
["Gibanawa"] = "gib",
["Gidar"] = "gid",
["Gikyode"] = "acd",
["Gilima"] = "gix",
["Gimi (Austronesian)"] = "gip",
["Gimme"] = "kmp",
["Gimnime"] = "gmn",
["Ginuman"] = "gnm",
["Girawa"] = "bbr",
["Giryama"] = "nyf",
["Githabul"] = "gih",
["Gitua"] = "ggt",
["Gitxsan"] = "git",
["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",
["Gojri"] = "gju",
["Gokana"] = "gkn",
["Gokhy"] = "sit-gkh",
["Gola"] = "gol",
["Golin"] = "gvf",
["Golpa"] = "lja",
["Gondi"] = "gon",
["Gongduk"] = "goe",
["Gonja"] = "gjn",
["Goo"] = "gov",
["Tiếng Gooniyandi"] = "gni",
["Gor"] = "gqr",
["Gorakor"] = "goc",
["Gorap"] = "goq",
["Goreng"] = "xgg",
["Tiếng Gorontalo"] = "gor",
["Gorovu"] = "grq",
["Gottscheerish"] = "gmw-gts",
["Goundo"] = "goy",
["Gourmanchéma"] = "gux",
["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 Kpelle"] = "gkp",
["Guinea-Bissau Creole"] = "pov",
["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",
["Gur Lama"] = "las",
["Guragone"] = "gge",
["Guramalum"] = "grz",
["Tiếng Goran"] = "hac",
["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",
["Gutnish"] = "gmq-gut",
["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",
["Haisla"] = "has",
["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",
["Harijan Kinnauri"] = "kjo",
["Tiếng Harsusi"] = "hss",
["Haruai"] = "tmd",
["Haruku"] = "hrk",
["Haryanvi"] = "bgc",
["Harzani"] = "hrz",
["Hasaitic"] = "sem-has",
["Hasha"] = "ybj",
["Hassaniya Arabic"] = "mey",
["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",
["Heiban"] = "hbn",
["Helong"] = "heg",
["Helu"] = "elu-prk",
["Hema"] = "nix",
["Hemba"] = "hem",
["Herdé"] = "hed",
["Hermit"] = "llf",
["Tiếng Hernici"] = "xhr",
["Hewa"] = "ham",
["Heyo"] = "auk",
["Hibito"] = "hib",
["Hidatsa"] = "hid",
["Highland Konjo"] = "kjk",
["Highland Oaxaca Chontal"] = "chd",
["Highland Puebla Nahuatl"] = "azz",
["Tiếng Totonac cao nguyên"] = "tos",
["Hijuk"] = "hij",
["Hill Maria"] = "mrr",
["Himarimã"] = "hir",
["Himyaritic"] = "sem-him",
["Hindi Dogri"] = "dgo",
["Hinduri"] = "hii",
["Hinukh"] = "gin",
["Hismaic"] = "sem-his",
["Hitchiti"] = "nai-hit",
["Hitu"] = "htu",
["Hiw"] = "hiw",
["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",
["Holiya"] = "hoy",
["Holma"] = "hod",
["Holoholo"] = "hoo",
["Holu"] = "hol",
["Homa"] = "hom",
["Honduran Lenca"] = "len",
["Honduras Sign Language"] = "hds",
["Hone"] = "juh",
["Hong Kong Sign Language"] = "hks",
["Honi"] = "how",
["Tiếng Hopi"] = "hop",
["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",
["Humburi Senni"] = "hmb",
["Humene"] = "huf",
["Hun"] = "uth",
["Hunde"] = "hke",
["Hungana"] = "hum",
["Hungarian Sign Language"] = "hsh",
["Hungworo"] = "nat",
["Hunjara-Kaina Ke"] = "hkk",
["Hunnic"] = "xhc",
["Hupdë"] = "jup",
["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",
["Tiếng Ibanag"] = "ibg",
["Ibani"] = "iby",
["Iberian"] = "xib",
["Iboko"] = "bkp",
["Ibu"] = "ibu",
["Icelandic Sign Language"] = "icl",
["Iceve-Maci"] = "bec",
["Tiếng Ida'an"] = "dbj",
["Idakho-Isukha-Tiriki"] = "ida",
["Idaté"] = "idt",
["Idere"] = "ide",
["Idesa"] = "ids",
["Idi"] = "idi",
["Idoma"] = "idu",
["Idon"] = "idc",
["Tiếng Idu"] = "clk",
["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",
["Ikposo"] = "kpo",
["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",
["Inuvialuktun"] = "ikt",
["Ipai"] = "nai-ipa",
["Ipalapa Amuzgo"] = "azm",
["Ipiko"] = "ipo",
["Ipili"] = "ipi",
["Ipulo"] = "ass",
["Iquito"] = "iqu",
["Ir"] = "irr",
["Irantxe"] = "irn",
["Iranun"] = "ill",
["Tiếng Ả Rập Iraq"] = "acm",
["Irarutu"] = "irh",
["Iraya"] = "iry",
["Iresim"] = "ire",
["Iriga Bicolano"] = "bto",
["Irish Sign Language"] = "isg",
["Tiếng Irula"] = "iru",
["Isabi"] = "isa",
["Isanzu"] = "isn",
["Isarog Agta"] = "agk",
["Isaurian"] = "und-isa",
["Isconahua"] = "isc",
["Isebe"] = "igo",
["Ishkashimi"] = "isk",
["Isinai"] = "inn",
["Isirawa"] = "srl",
["Islander Creole English"] = "icr",
["Israeli Sign Language"] = "isr",
["Isthmus Mixe"] = "mir",
["Tiếng Zapotec Isthmus"] = "zai",
["Isu"] = "isu",
["Isubu"] = "szv",
["Italian Sign Language"] = "ise",
["Itawit"] = "itv",
["Tiếng Itene"] = "ite",
["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",
["Tiếng Izon"] = "ijc",
["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",
["Jaunsari"] = "jns",
["Jawe"] = "jaz",
["Jaya"] = "jyy",
["Jebero"] = "jeb",
["Jeikó"] = "sai-jko",
["Tiếng Jemez"] = "tow",
["Jenaama Bozo"] = "bze",
["Jeng"] = "jeg",
["Jennu Kurumba"] = "xuj",
["Jere"] = "jer",
["Jeri Kuo"] = "jek",
["Jerung"] = "jee",
["Jhankot Sign Language"] = "jhs",
["Jiamao"] = "jio",
["Jiba"] = "juo",
["Jibu"] = "jib",
["Tiếng Jicarilla"] = "apj",
["Jilbe"] = "jie",
["Jili"] = "mgi",
["Jilim"] = "jil",
["Jimi"] = "jmi",
["Jimjimen"] = "jim",
["Tiếng Tấn"] = "cjy",
["Jina"] = "jia",
["Jingulu"] = "jig",
["Jiongnai Bunu"] = "pnu",
["Jirajara"] = "sai-jrj",
["Jirel"] = "jul",
["Jiru"] = "jrr",
["Jita"] = "jit",
["Jju"] = "kaj",
["Joba"] = "job",
["Jofotek-Bromnya"] = "jbr",
["Jola-Fonyi"] = "dyo",
["Jola-Kasa"] = "csk",
["Jonkor Bourmataguil"] = "jeu",
["Jordanian Sign Language"] = "jos",
["Jorá"] = "jor",
["Jowulu"] = "jow",
["Ju"] = "juu",
["Jukun Takum"] = "jbu",
["Tiếng Jumaytepeque"] = "nai-jum",
["Jumla Sign Language"] = "jus",
["Jumli"] = "jml",
["Jungle Inga"] = "inj",
["Juquila Mixe"] = "mxq",
["Jur Modo"] = "bex",
["Tiếng Juray"] = "juy",
["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",
["Tiếng Kabuverdianu"] = "kea",
["Kabwa"] = "cwa",
["Kabwari"] = "kcw",
["Tiếng Kachama-Ganjule"] = "kcx",
["Kachari"] = "xac",
["Kachi Koli"] = "gjk",
["Kacipo-Balesi"] = "koe",
["Kaco'"] = "xkk",
["Kadai"] = "kzd",
["Kadar"] = "kej",
["Kadara"] = "kad",
["Kadaru"] = "kdu",
["Kadiwéu"] = "kbc",
["Kado"] = "kdv",
["Kadugli"] = "xtc",
["Kaduo"] = "ktp",
["Kaera"] = "jka",
["Kafoa"] = "kpu",
["Kagan Kalagan"] = "kll",
["Kagate"] = "syw",
["Tiếng Kagayanen"] = "cgc",
["Kagoma"] = "kdm",
["Kagoro"] = "xkg",
["Kagulu"] = "kki",
["Kahe"] = "hka",
["Kahua"] = "agw",
["Kaian"] = "kct",
["Kaibobo"] = "kzb",
["Kaidipang"] = "kzp",
["Kaiep"] = "kbw",
["Kaikadi"] = "kep",
["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",
["Tiếng Kaki Ae"] = "tbd",
["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",
["Kalkoti"] = "xka",
["Kalou"] = "ywa",
["Kaluli"] = "bco",
["Kalumpang"] = "kli",
["Kam"] = "kdx",
["Kamakan"] = "vkm",
["Kamang"] = "woi",
["Kamano"] = "kbq",
["Kamantan"] = "kci",
["Kamar"] = "keq",
["Kamara"] = "jmr",
["Kamarian"] = "kzx",
["Kamaru"] = "kgx",
["Kamarupi Prakrit"] = "inc-kam",
["Kamasa"] = "klp",
["Kamasau"] = "kms",
["Tiếng Kamayo"] = "kyk",
["Kamayurá"] = "kay",
["Kamba"] = "kam",
["Kambaira"] = "kyy",
["Tiếng Kambera"] = "xbr",
["Kamberataro"] = "kbv",
["Kamberau"] = "irx",
["Kambiwá"] = "xbw",
["Kami"] = "kmi",
["Kamkata-viri"] = "bsh",
["Kamo"] = "kcq",
["Kamoro"] = "kgq",
["Kamu"] = "xmu",
["Tiếng Kamula"] = "xla",
["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",
["Kangri"] = "xnr",
["Kaniet"] = "ktk",
["Kanikkaran"] = "kev",
["Kaningdon-Nindem"] = "kdp",
["Kaningi"] = "kzo",
["Kaningra"] = "knr",
["Kaninuwa"] = "wat",
["Kanite"] = "kmu",
["Kanjari"] = "kft",
["Kanju"] = "kbe",
["Tiếng Kankanaey"] = "kne",
["Kannada Kurumba"] = "kfi",
["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",
["Tiếng Kaqchikel"] = "cak",
["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",
["Tiếng Karekare"] = "kai",
["Karey"] = "kyd",
["Kari"] = "kbj",
["Karingani"] = "kgn",
["Karipuna"] = "kuq",
["Karipúna"] = "kgm",
["Karipúna Creole French"] = "kmv",
["Tiếng Kariri"] = "kzw",
["Tiếng Karitiâna"] = "ktn",
["Kariya"] = "kil",
["Kariyarra"] = "vka",
["Karkar-Yuri"] = "yuj",
["Karkin"] = "krb",
["Karko"] = "kko",
["Karnai"] = "bbv",
["Karo"] = "kxh",
["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",
["Tiếng Kaurna"] = "zku",
["Kauwera"] = "xau",
["Kawacha"] = "kcb",
["Kawaiisu"] = "xaw",
["Kawe"] = "kgb",
["Kawishana"] = "awd-kaw",
["Kaxararí"] = "ktx",
["Kaxuyana"] = "kbb",
["Kaya"] = "zra",
["Kayabí"] = "kyz",
["Kayagar"] = "kyt",
["Kayan"] = "pdu",
["Kayan Mahakam"] = "xay",
["Kayan River Kayan"] = "xkn",
["Tiếng Kalanguya"] = "kak",
["Kayardild"] = "gyd",
["Kayeli"] = "kzl",
["Kaytetye"] = "gbb",
["Kayupulau"] = "kzu",
["Kazukuru"] = "kzk",
["Ke'o"] = "xxk",
["Keak"] = "keh",
["Keapara"] = "khz",
["Kedah Malay"] = "meo",
["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",
["Kenyang"] = "ken",
["Kenyi"] = "lke",
["Keoru-Ahia"] = "xeu",
["Kepkiriwát"] = "kpn",
["Kepo'"] = "kuk",
["Kera"] = "ker",
["Kerak"] = "hhr",
["Kereho"] = "xke",
["Kerek"] = "krk",
["Kerewe"] = "ked",
["Kerewo"] = "kxz",
["Kerinci"] = "kvr",
["Tiếng Kerman"] = "xme-ker",
["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",
["Tiếng Kholosi"] = "inc-kho",
["Khotanese"] = "kho",
["Khroskyabs"] = "jiq",
["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",
["Kim"] = "kia",
["Kimaama"] = "kig",
["Kimaragang"] = "kqr",
["Kimbu"] = "kiv",
["Kimki"] = "sbt",
["Kimré"] = "kqp",
["Kinabalian"] = "cbw",
["Kinalakna"] = "kco",
["Tiếng Kinaray-a"] = "krj",
["Kinga"] = "zga",
["Kings River Yokuts"] = "nai-kry",
["Kinikinao"] = "gqn",
["Tiếng Kinnaur"] = "kfk",
["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",
["Tiếng Koalib"] = "kib",
["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",
["Kui (Ấn Độ)"] = "kxu",
["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",
["Tiếng Komi-Yazva"] = "urj-kya",
["Kominimung"] = "xoi",
["Komo"] = "xom",
["Tiếng Komodo"] = "kvh",
["Kompane"] = "kvp",
["Komyandaret"] = "kzv",
["Kon Keu"] = "kkn",
["Konabéré"] = "bbo",
["Konai"] = "kxw",
["Konda"] = "knd",
["Konda-Dora"] = "kfc",
["Kondekor"] = "gau",
["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",
["Tiếng Korwa"] = "kfp",
["Kosadle"] = "kiq",
["Kosarek Yale"] = "kkl",
["Kosena"] = "kze",
["Koshin"] = "kid",
["Kota (Gabon)"] = "koq",
["Kota (India)"] = "kfe",
["Kota Bangun Kutai Malay"] = "mqg",
["Kota Marudu Talantang"] = "grm",
["Kota Marudu Tinagas"] = "ktr",
["Kotafon Gbe"] = "kqk",
["Koti"] = "eko",
["Tiếng Kott"] = "zko",
["Kou"] = "snz",
["Kouya"] = "kyf",
["Kovai"] = "kqb",
["Kove"] = "kvc",
["Kowaki"] = "xow",
["Kowiai"] = "kwh",
["Koy Sanjaq Surat"] = "kqd",
["Koya"] = "kff",
["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",
["Kresh"] = "krs",
["Krevinian"] = "zkv",
["Kreye"] = "xre",
["Krikati-Timbira"] = "xri",
["Krim"] = "krm",
["Tiếng Kriol Úc"] = "rop",
["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",
["Tiếng Kudiya"] = "kfg",
["Kudu-Camo"] = "kov",
["Kugama"] = "kow",
["Kugbo"] = "kes",
["Kugu-Muminh"] = "xmh",
["Kui (India)"] = "kxu",
["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",
["Tiếng Kumeyaay"] = "nai-kum",
["Kumhali"] = "kra",
["Kumu"] = "kmw",
["Kumukio"] = "kuo",
["Tiếng Kuna"] = "cuk",
["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",
["Kuo"] = "xuo",
["Kuot"] = "kto",
["Kupa"] = "kug",
["Kupang Malay"] = "mkn",
["Kupia"] = "key",
["Kupsabiny"] = "kpz",
["Kur"] = "kuv",
["Kura Ede Nago"] = "nqk",
["Kurama"] = "krh",
["Kuranko"] = "knk",
["Kuri"] = "nbn",
["Kuria"] = "kuj",
["Kurichiya"] = "kfh",
["Kurmukar"] = "kfv",
["Kurnai"] = "unn",
["Kurrama"] = "vku",
["Kurti"] = "ktm",
["Kurtjar"] = "gdj",
["Kurudu"] = "kjr",
["Kurukh"] = "kru",
["Kuruáya"] = "kyr",
["Kusaal"] = "kus",
["Kusaghe"] = "ksg",
["Kushi"] = "kuh",
["Kustenau"] = "awd-kus",
["Kusu"] = "ksv",
["Kusunda"] = "kgg",
["Kutang Ghale"] = "ght",
["Tiếng Ktunaxa"] = "kut",
["Kutep"] = "kub",
["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",
["Tiếng Kven"] = "fkv",
["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",
["Kwanja"] = "knp",
["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",
["Tiếng Kwinti"] = "kww",
["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",
["Tiếng Laalaa"] = "cae",
["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",
["Laha (Vietnam)"] = "lha",
["Lahanan"] = "lhn",
["Lahta Karen"] = "kvt",
["Lahu Shi"] = "lhi",
["Lahul Lohar"] = "lhl",
["Lai"] = "cnh",
["Laimbue"] = "lmx",
["Laitu Chin"] = "clj",
["Laiyolo"] = "lji",
["Laka"] = "lak",
["Tiếng Lakalei"] = "lka",
["Lake Miwok"] = "lmw",
["Lakha"] = "lkh",
["Laki"] = "lki",
["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",
["Tiếng Bạch Lạp Mã"] = "lay",
["Lamaholot"] = "slp",
["Lamalera"] = "lmr",
["Lamang"] = "hia",
["Lamatuka"] = "lmq",
["Lamba"] = "lam",
["Lambichhong"] = "lmh",
["Lambya"] = "lai",
["Lame"] = "bma",
["Lamenu"] = "lmu",
["Lamet"] = "lbn",
["Lamja-Dengsa-Tola"] = "ldh",
["Lamkang"] = "lmk",
["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",
["Tiếng Lutuv"] = "clt",
["Lavatbura-Lamusong"] = "lbv",
["Lawangan"] = "lbx",
["Tiếng Lawi"] = "lvi",
["Lawu"] = "lwu",
["Lawunuia"] = "tgi",
["Layakha"] = "lya",
["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",
["Lelemi"] = "lef",
["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",
["Tiếng León"] = "roa-leo",
["Lepki"] = "lpe",
["Lere"] = "gnh",
["Lese"] = "les",
["Lesing-Gelimi"] = "let",
["Letemboi"] = "nms",
["Leti (Cameroon)"] = "leo",
["Leti (Indonesia)"] = "lti",
["Levuka"] = "lvu",
["Lewo"] = "lww",
["Lewo Eleng"] = "lwe",
["Lewotobi"] = "lwt",
["Leyigha"] = "ayi",
["Lhokpu"] = "lhp",
["Li'o"] = "ljl",
["Liana-Seti"] = "ste",
["Liangmai Naga"] = "njn",
["Liberia Kpelle"] = "xpe",
["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",
["Limbum"] = "lmp",
["Limi"] = "ylm",
["Limilngan"] = "lmc",
["Tiếng Lindu"] = "klw",
["Linear A"] = "lab",
["Tiếng Lâm Cao"] = "onb",
["Lingkhim"] = "lii",
["Lingua Franca Nova"] = "lfn",
["Linngithigh"] = "lnj",
["Tiếng Lipan"] = "apl",
["Lipo"] = "lpo",
["Lisabata-Nuniali"] = "lcs",
["Lisela"] = "lcl",
["Lish"] = "lsh",
["Lishán Didán"] = "trg",
["Literary Chinese"] = "lzh",
["Lithuanian Sign Language"] = "lls",
["Little Swanport"] = "aus-lsw",
["Litzlitz"] = "lzl",
["Lizu"] = "sit-liz",
["Lo-Toga"] = "lht",
["Loarki"] = "lrk",
["Lobala"] = "loq",
["Lobi"] = "lob",
["Lodhi"] = "lbm",
["Logba"] = "lgq",
["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",
["Loma"] = "lom",
["Lomaiviti"] = "lmv",
["Lomakka"] = "loi",
["Lomavren"] = "rmi",
["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",
["Tiếng Lorrain"] = "roa-lor",
["Lote"] = "uvl",
["Lotha Naga"] = "njh",
["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",
["Tiếng Hạ Tanana"] = "taa",
["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",
["Tiếng Lucumí"] = "luq",
["Lufu"] = "ldq",
["Lugbara"] = "lgg",
["Luguru"] = "ruf",
["Luhu"] = "lcq",
["Tiếng Luhya"] = "luy",
["Luimbi"] = "lum",
["Luiseño"] = "lui",
["Lukpa"] = "dop",
["Lule"] = "ule",
["Lule Sami"] = "smj",
["Lumba-Yakkha"] = "luu",
["Lumbee"] = "lmz",
["Lumbu"] = "lup",
["Lumun"] = "lmd",
["Lun Bawang"] = "lnd",
["Luna"] = "luj",
["Lunanakha"] = "luk",
["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"] = "bnt-lwl",
["Tiếng Lycia"] = "xlc",
["Lyélé"] = "lee",
["Láadan"] = "ldn",
["Láá Láá Bwamu"] = "bwj",
["Ma"] = "msj",
["Ma Manda"] = "skc",
["Ma'di"] = "mhi",
["Ma'ya"] = "slz",
["Tiếng Maay"] = "ymm",
["Maba"] = "mqa",
["Mabaale"] = "mmz",
["Tiếng Mabaan"] = "mfz",
["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",
["Magahat"] = "mtw",
["Tiếng Magaha"] = "mag",
["Magdalena Peñasco Mixtec"] = "xtm",
["Magiyi"] = "gmg",
["Magoma"] = "gmx",
["Magɨ"] = "gkd",
["Mahasu Pahari"] = "bfz",
["Mahican"] = "mjy",
["Mahongwe"] = "mhb",
["Mahou"] = "mxx",
["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",
["Majang"] = "mpe",
["Majera"] = "xmj",
["Tiếng Majhi"] = "mjz",
["Majhwar"] = "mmj",
["Mak (China)"] = "mkg",
["Mak (Nigeria)"] = "pbl",
["Makaa"] = "mcp",
["Makah"] = "myh",
["Makalero"] = "mjb",
["Makasae"] = "mkz",
["Tiếng Makassar"] = "mak",
["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"] = "mlf",
["Mal Paharia"] = "mkb",
["Mala (New Guinea)"] = "ped",
["Mala (Nigeria)"] = "ruy",
["Mala Malasar"] = "ima",
["Malaccan Creole Malay"] = "ccm",
["Malalamai"] = "mmt",
["Malalí"] = "sai-mal",
["Malango"] = "mln",
["Malankuravan"] = "mjo",
["Malapandaram"] = "mjp",
["Malaryan"] = "mjq",
["Malas"] = "mkr",
["Malasanga"] = "mqz",
["Malasar"] = "ymr",
["Malavedan"] = "mjr",
["Malawi Lomwe"] = "lon",
["Malawian Sign Language"] = "lws",
["Malayic Dayak"] = "xdy",
["Malaynon"] = "mlz",
["Malaysian Sign Language"] = "xml",
["Malba Birifor"] = "bfo",
["Male"] = "mdc",
["Tiếng Malecite-Passamaquoddy"] = "pqm",
["Maleu-Kilenge"] = "mgl",
["Malfaxal"] = "mlx",
["Malgana"] = "vml",
["Malgbe"] = "mxf",
["Mali"] = "gcc",
["Malibu"] = "sai-mlb",
["Malila"] = "mgq",
["Malimba"] = "mzd",
["Malimpung"] = "mli",
["Malinaltepec Tlapanec"] = "tcf",
["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",
["Mamara Senoufo"] = "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",
["Tiếng Mandahuaca"] = "mht",
["Mandaic"] = "mid",
["Mandailing Batak"] = "btm",
["Mandalorian"] = "art-man",
["Mandan"] = "mhq",
["Mandandanyi"] = "zmk",
["Mandar"] = "mdr",
["Mandari"] = "mqu",
["Mandeali"] = "mjl",
["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",
["Mango"] = "mge",
["Mangole"] = "mqc",
["Mangseng"] = "mbh",
["Manigri-Kambolé Ede Nago"] = "xkb",
["Manikion"] = "mnx",
["Manipa"] = "mqp",
["Mankiyali"] = "nlm",
["Manna-Dora"] = "mju",
["Tiếng Mannan"] = "mjv",
["Manombai"] = "woo",
["Tiếng Mansaka"] = "msk",
["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",
["Mapos Buang"] = "bzh",
["Mapoyo"] = "mcg",
["Mapun"] = "sjm",
["Mara"] = "mec",
["Mara Chin"] = "mrh",
["Marachi"] = "lri",
["Maraghei"] = "vmh",
["Maragus"] = "mrs",
["Maram Naga"] = "nma",
["Marama"] = "lrm",
["Tiếng Maranao"] = "mrw",
["Maranungku"] = "zmr",
["Mararit"] = "mgb",
["Maratino"] = "sai-mar",
["Marau"] = "mvr",
["Marawan"] = "awd-mar",
["Marba"] = "mpg",
["Marenje"] = "vmr",
["Marfa"] = "mvu",
["Margany"] = "zmc",
["Marghi South"] = "mfm",
["Margi"] = "mrt",
["Maria"] = "mds",
["Mariaté"] = "awd-mrt",
["Tiếng Maricopa"] = "mrc",
["Maridan"] = "zmd",
["Maridjabin"] = "zmj",
["Marik"] = "dad",
["Marimanindji"] = "zmm",
["Marind"] = "mrz",
["Maring"] = "mbw",
["Maring Naga"] = "nng",
["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",
["Marrucinian"] = "umc",
["Marsian"] = "ims",
["Martha's Vineyard Sign Language"] = "mre",
["Marti Ke"] = "zmg",
["Martu Wangka"] = "mpj",
["Tiếng Martuthunira"] = "vma",
["Marúbo"] = "mzr",
["Masaba"] = "myx",
["Masadiit Itneg"] = "tis",
["Masakará"] = "sai-msk",
["Masalit"] = "mls",
["Masana"] = "mcn",
["Masbate Sorsogon"] = "bks",
["Tiếng Masbatenyo"] = "msb",
["Mashco Piro"] = "cuj",
["Mashi"] = "mho",
["Masimasi"] = "ism",
["Masiwang"] = "bnf",
["Maskelynes"] = "klv",
["Maslam"] = "msv",
["Masmaje"] = "mes",
["Massachusett"] = "wam",
["Massalat"] = "mdg",
["Massep"] = "mvs",
["Matagalpa"] = "mtn",
["Tiếng Matal"] = "mfh",
["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",
["Maung"] = "mph",
["Tiếng Creole Mauritius"] = "mfe",
["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",
["Media Lengua"] = "mue",
["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",
["Tiếng Melo"] = "mfx",
["Melpa"] = "med",
["Mendalam Kayan"] = "xkd",
["Mendankwe-Nkwen"] = "mfd",
["Mengaka"] = "xmg",
["Mengen"] = "mee",
["Menien"] = "sai-men",
["Menka"] = "mea",
["Tiếng Menominee"] = "mez",
["Tiếng Mentawai"] = "mwv",
["Menya"] = "mcr",
["Meoswar"] = "mvx",
["Mer"] = "mnu",
["Meramera"] = "mxm",
["Merei"] = "lmb",
["Merey"] = "meq",
["Merlav"] = "mrm",
["Meroitic"] = "xmr",
["Meru"] = "mer",
["Tiếng Mesaka"] = "iyo",
["Mese"] = "mci",
["Mesme"] = "zim",
["Mesmes"] = "mys",
["Mesqan"] = "mvz",
["Messapic"] = "cms",
["Meta'"] = "mgo",
["Metlatónoc Mixtec"] = "mxv",
["Mewari"] = "mtr",
["Mewati"] = "wtm",
["Mexican Sign Language"] = "mfs",
["Meyah"] = "mej",
["Mezontla Popoloca"] = "pbe",
["Tiếng Meänkieli"] = "fit",
["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",
["Middle Cornish"] = "cnx",
["Middle Gujarati"] = "inc-mgu",
["Middle Kannada"] = "dra-mkn",
["Middle Median"] = "xme-mid",
["Middle Newar"] = "nwx",
["Middle Norwegian"] = "gmq-mno",
["Middle Oriya"] = "inc-mor",
["Middle Watut"] = "mpl",
["Tiếng Wales trung đại"] = "wlm",
["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",
["Tiếng Minangkabau"] = "min",
["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",
["Mirgan"] = "zrg",
["Miriti"] = "mmv",
["Miriwoong Sign Language"] = "rsm",
["Miriwung"] = "mep",
["Mirpur Panjabi"] = "pmu",
["Misantla Totonac"] = "tlc",
["Miship"] = "mjs",
["Misima-Paneati"] = "mpx",
["Mising"] = "mrg",
["Tiếng Miskito"] = "miq",
["Mitla Zapotec"] = "zaw",
["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",
["Mlahsö"] = "lhs",
["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",
["Mohegan-Pequot"] = "xpq",
["Moi (Congo)"] = "mow",
["Moi (Indonesia)"] = "mxn",
["Moikodi"] = "mkp",
["Moingi"] = "mwz",
["Mojave"] = "mov",
["Moji"] = "ymi",
["Mok"] = "mqt",
["Mokerang"] = "mft",
["Mokole"] = "mkl",
["Mokpwe"] = "bri",
["Molale"] = "mbe",
["Tiếng Molbog"] = "pwm",
["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",
["Tiếng Mongo"] = "lol",
["Mongol"] = "mgt",
["Mongolian Sign Language"] = "msr",
["Tiếng Mongondow"] = "mog",
["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",
["Moose Cree"] = "crm",
["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",
["Moro"] = "mor",
["Moroccan Amazigh"] = "zgh",
["Moroccan Sign Language"] = "xms",
["Morom"] = "bdo",
["Moronene"] = "mqn",
["Morori"] = "mok",
["Morouas"] = "mrp",
["Mortlockese"] = "mrl",
["Moru"] = "mgd",
["Mosimo"] = "mqv",
["Moskona"] = "mtj",
["Mota"] = "mtt",
["Motembo"] = "tmv",
["Mouk-Aria"] = "mwh",
["Mount Iraya Agta"] = "atl",
["Mount Iriga Agta"] = "agz",
["Mountain Koiari"] = "kpx",
["Mouwase"] = "jmw",
["Movima"] = "mzp",
["Moyadan Itneg"] = "ity",
["Moyon Naga"] = "nmo",
["Mozambican Sign Language"] = "mzy",
["Mpade"] = "mpi",
["Mpalitjanh"] = "xpj",
["Mpi"] = "mpz",
["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",
["Tiếng Mudburra"] = "dmw",
["Muduapa"] = "wiv",
["Muduga"] = "udg",
["Muellama"] = "sai-mue",
["Mufian"] = "aoj",
["Muher"] = "sem-mhr",
["Muinane"] = "bmr",
["Mukha-Dora"] = "mmk",
["Mukulu"] = "moz",
["Mulaha"] = "mfw",
["Mulam"] = "mlm",
["Mulao"] = "giu",
["Mullu Kurumba"] = "kpb",
["Mullukmulluk"] = "mpb",
["Muluridyi"] = "vmu",
["Mum"] = "kqa",
["Mumuye"] = "mzm",
["Tiếng Muna"] = "mnb",
["Munda"] = "unx",
["Tiếng Mundabli"] = "boe",
["Mundang"] = "mua",
["Mundani"] = "mnf",
["Mundat"] = "mmf",
["Mundolinco"] = "art-mun",
["Mundurukú"] = "myu",
["Mungaka"] = "mhk",
["Mungbam"] = "mij",
["Munggui"] = "mth",
["Mungkip"] = "mpv",
["Muniche"] = "myr",
["Munit"] = "mtc",
["Tiếng Munsee"] = "umu",
["Mur Pano"] = "tkv",
["Muratayak"] = "asx",
["Murik (Malaysia)"] = "mxr",
["Murik (New Guinea)"] = "mtf",
["Murkim"] = "rmh",
["Murle"] = "mur",
["Murrinh-Patha"] = "mwf",
["Murui Huitoto"] = "huu",
["Murupi"] = "mqw",
["Muruwari"] = "zmu",
["Musan"] = "mmp",
["Musar"] = "mmi",
["Musasa"] = "smm",
["Musey"] = "mse",
["Musgu"] = "mug",
["Tiếng Musi"] = "mui",
["Muskum"] = "mje",
["Musom"] = "msu",
["Mussau-Emira"] = "emi",
["Muthuvan"] = "muv",
["Mutu"] = "tuc",
["Muya"] = "mvm",
["Muyang"] = "muy",
["Muyuw"] = "myw",
["Muzi"] = "ymz",
["Muzo"] = "sai-muz",
["Mvanip"] = "mcj",
["Mvuba"] = "mxh",
["Mwaghavul"] = "sur",
["Mwali Comorian"] = "wlc",
["Tiếng Mwan"] = "moa",
["Mwani"] = "wmw",
["Mwatebu"] = "mwa",
["Mwera"] = "mwe",
["Mwimbi-Muthambi"] = "mws",
["Mycenaean Greek"] = "gmy",
["Myene"] = "mye",
["Mysian"] = "yms",
["Mzieme Naga"] = "nme",
["Mághdì"] = "gmd",
["Tiếng Mòcheno"] = "mhn",
["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",
["Tiếng Nafaanra"] = "nfr",
["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",
["Tiếng Nambikwara"] = "nab",
["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",
["Nankina"] = "nnk",
["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",
["Naskapi"] = "nsk",
["Nasu"] = "ywq",
["Natagaimas"] = "nts",
["Natchez"] = "ncz",
["Nateni"] = "ntm",
["Nathembo"] = "nte",
["Natioro"] = "nti",
["Natú"] = "sai-nat",
["Natügu"] = "ntu",
["Nauete"] = "nxa",
["Naukanski"] = "ynk",
["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",
["Ndau"] = "ndc",
["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",
["Tiếng Ngadha"] = "nxg",
["Ngadjunmaya"] = "nju",
["Ngadjuri"] = "jui",
["Ngaing"] = "nnf",
["Ngaju"] = "nij",
["Ngala"] = "nud",
["Ngalakan"] = "nig",
["Ngalkbun"] = "ngk",
["Ngam"] = "nmc",
["Ngamambo"] = "nbv",
["Ngambay"] = "sba",
["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",
["Tiếng Ngiyambaa"] = "wyb",
["Ngizim"] = "ngi",
["Ngkoth"] = "aus-ngk",
["Ngkâlmpw Kanum"] = "kcd",
["Ngochang"] = "tbq-ngo",
["Ngom"] = "nra",
["Ngombale"] = "nla",
["Ngombe (Central African Republic)"] = "nmj",
["Tiếng Ngombe (Congo)"] = "ngc",
["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",
["Nisga'a"] = "ncg",
["Nisi"] = "yso",
["Niuafo'ou"] = "num",
["Niuatoputapu"] = "nkp",
["Tiếng Nivaclé"] = "cag",
["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",
["Nobonob"] = "gaw",
["Nocamán"] = "nom",
["Nocte Naga"] = "njb",
["Noiri"] = "noi",
["Nokuku"] = "nkk",
["Nomaande"] = "lem",
["Nomane"] = "nof",
["Nomatsiguenga"] = "not",
["Nomlaki"] = "nol",
["Nomu"] = "noh",
["Nonuya"] = "noj",
["Nooksack"] = "nok",
["Noon"] = "snf",
["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 Efate"] = "llp",
["North Fali"] = "fll",
["North Giziga"] = "gis",
["North Marquesan"] = "mrq",
["North Mesopotamian Arabic"] = "ayp",
["North Mofu"] = "mfk",
["North Muyu"] = "kti",
["North Nuaulu"] = "nni",
["North Picene"] = "nrp",
["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",
["Tiếng Bắc Catanduanes Bikol"] = "cts",
["Northern Dagara"] = "dgi",
["Northern East Cree"] = "crl",
["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 Khanty"] = "kca-nor",
["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",
["Tiếng Bắc Paiute"] = "pao",
["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 Tepehuan"] = "ntp",
["Northern Tidong"] = "ntd",
["Northern Tlaxiaco Mixtec"] = "xtn",
["Northern Toussian"] = "tsp",
["Northern Tutchone"] = "ttm",
["Northern Valley Yokuts"] = "nai-nvy",
["Tiếng Tây Bắc Gbaya"] = "gya",
["Northwest Maidu"] = "mjd",
["Northwest Oaxaca Mixtec"] = "mxa",
["Northwest Pashayi"] = "glh",
["Northwestern Dinka"] = "diw",
["Northwestern Fars"] = "faz",
["Northwestern Ojibwa"] = "ojb",
["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",
["Ntcham"] = "bud",
["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",
["Numidian"] = "nxm",
["Nungali"] = "nug",
["Nunggubuyu"] = "nuy",
["Nungon"] = "paa-nun",
["Nungu"] = "rin",
["Nupbikha"] = "npb",
["Tiếng Nupe"] = "nup",
["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",
["Nyishi"] = "njz",
["Nyiyaparli"] = "xny",
["Nyokon"] = "nvo",
["Nyole (Kenya)"] = "nyd",
["Nyole (Uganda)"] = "nuj",
["Nyong"] = "muo",
["Nyoro"] = "nyo",
["Nyulnyul"] = "nyv",
["Tiếng Nyunga"] = "nys",
["Nyungwe"] = "nyu",
["Nyâlayu"] = "yly",
["Tiếng Nzadi"] = "nzd",
["Nzakambay"] = "nzy",
["Nzakara"] = "nzk",
["Nzanyi"] = "nja",
["Nzima"] = "nzi",
["Nüpode Huitoto"] = "hux",
["Tiếng Nǀuu"] = "ngh",
["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 Bengali"] = "inc-obn",
["Tiếng Catalan cổ"] = "roa-oca",
["Tiếng Cornwall cổ"] = "oco",
["Old Gujarati"] = "inc-ogu",
["Old Hindi"] = "inc-ohi",
["Tiếng Hungary cổ"] = "ohu",
["Old Kamta"] = "inc-ork",
["Tiếng Kannada cổ"] = "dra-okn",
["Tiếng Telugu cổ"] = "dra-ote",
["Old Kentish Sign Language"] = "okl",
["Old Leonese"] = "roa-ole",
["Tiếng Navarro-Aragon"] = "roa-ona",
["Tiếng Litva cổ"] = "olt",
["Old Manipuri"] = "omp",
["Old Marathi"] = "omr",
["Old Nubian"] = "onw",
["Old Oriya"] = "inc-oor",
["Tiếng Punjab cổ"] = "inc-opa",
["Tiếng Nam Ả Rập cổ"] = "sem-srb",
["Old Tati"] = "xme-ott",
["Tiếng Tây Tạng cổ"] = "otb",
["Old Welsh"] = "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",
["Oneida"] = "one",
["Ong"] = "oog",
["Ongota"] = "bxe",
["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",
["Osing"] = "osi",
["Ososo"] = "oso",
["Ot Danum"] = "otd",
["Otank"] = "uta",
["Oti"] = "oti",
["Otomaco"] = "sai-oto",
["Otoro"] = "otr",
["Ottawa"] = "otw",
["Ouma"] = "oum",
["Oune"] = "oue",
["Owa"] = "stn",
["Owenia"] = "wsr",
["Owiniga"] = "owi",
["Oy"] = "oyb",
["Oya'oya"] = "oyy",
["Tiếng Oyda"] = "oyd",
["Ozolotepec Zapotec"] = "zao",
["Pa"] = "ppt",
["Pa Di"] = "pdi",
["Pa'a"] = "pqa",
["Paama"] = "pma",
["Paasaal"] = "sig",
["Pacahuara"] = "pcp",
["Padoe"] = "pdo",
["Paelignian"] = "pgn",
["Paeonian"] = "ine-pae",
["Pagi"] = "pgi",
["Pagibete"] = "pae",
["Tiếng Pagu"] = "pgu",
["Pahanan Agta"] = "apf",
["Tiếng Pothohar"] = "phr",
["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",
["Tiếng Paku"] = "pku",
["Paku Karen"] = "kpp",
["Pal"] = "abw",
["Palaka Senoufo"] = "plr",
["Palantla Chinantec"] = "cpa",
["Palawan Batak"] = "bya",
["Paleni"] = "pnl",
["Palenquero"] = "pln",
["Palewyami"] = "nai-ply",
["Palikur"] = "plu",
["Paliyan"] = "pcf",
["Pallanganmiddang"] = "pmd",
["Palor"] = "fap",
["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",
["Paniya"] = "pcg",
["Pankararé"] = "pax",
["Pankararú"] = "paz",
["Pankhu"] = "pkh",
["Pannei"] = "pnc",
["Panobo"] = "pno",
["Panyi Bai"] = "bfc",
["Panyjima"] = "pnw",
["Panzaleo"] = "sai-pnz",
["Pao"] = "ppa",
["Tiếng Totonac Papantla"] = "top",
["Papapana"] = "ppn",
["Papar"] = "dpp",
["Papasena"] = "pas",
["Papel"] = "pbo",
["Papi"] = "ppe",
["Papitalai"] = "pat",
["Papora"] = "ppu",
["Papua New Guinean Sign Language"] = "pgz",
["Papuan Malay"] = "pmy",
["Papuma"] = "ppm",
["Para Naga"] = "pzn",
["Parachi"] = "prc",
["Tiếng Guarani Paraguay"] = "gug",
["Paraguayan Sign Language"] = "pys",
["Parakanã"] = "pak",
["Paranan"] = "prf",
["Paranawát"] = "paf",
["Paratió"] = "sai-par",
["Tiếng Paraujano"] = "pbg",
["Parawen"] = "prw",
["Pardhan"] = "pch",
["Pardhi"] = "pcl",
["Pare"] = "asa",
["Tiếng Pareci"] = "pab",
["Paredarerme"] = "xpd",
["Parenga"] = "pcj",
["Parya"] = "paq",
["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",
["Tiếng Mã Lai Pattani"] = "mfa",
["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",
["Pennsylvania German"] = "pdc",
["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",
["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",
["Pitjantjatjara"] = "pjt",
["Pitta-Pitta"] = "pit",
["Piu"] = "pix",
["Piya-Kwonci"] = "piy",
["Tiếng Apache đồng bằng"] = "apk",
["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",
["Polci"] = "plj",
["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",
["Tiếng Algic nguyên thủy"] = "aql-pro",
["Proto-Amuesha-Chamicuro"] = "awd-amc-pro",
["Proto-Anatolian"] = "ine-ana-pro",
["Proto-Apachean"] = "apa-pro",
["Proto-Arawa"] = "auf-pro",
["Tiếng Arawak nguyên thủy"] = "awd-pro",
["Proto-Armenian"] = "hyx-pro",
["Proto-Arnhem"] = "aus-arn-pro",
["Tiếng Aari nguyên thủy"] = "omv-aro-pro",
["Proto-Atayalic"] = "map-ata-pro",
["Proto-Athabaskan"] = "ath-pro",
["Proto-Atlantic-Congo"] = "alv-pro",
["Tiếng Avar-Andic nguyên thủy"] = "cau-ava-pro",
["Proto-Bantoid"] = "nic-bod-pro",
["Proto-Batak"] = "btk-pro",
["Tiếng Bối-Thái nguyên thủy"] = "qfa-bet-pro",
["Proto-Benue-Congo"] = "nic-bco-pro",
["Proto-Bongo-Bagirmi"] = "csu-bba-pro",
["Proto-Boran"] = "sai-bor-pro",
["Proto-Bua"] = "alv-bua-pro",
["Proto-Bungku-Tolaki"] = "poz-btk-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-Chadic"] = "cdc-pro",
["Proto-Chatino"] = "omq-cha-pro",
["Proto-Chibchan"] = "cba-pro",
["Proto-Chimakuan"] = "chi-pro",
["Proto-Chinookan"] = "nai-ckn-pro",
["Proto-Chukotko-Kamchatkan"] = "qfa-cka-pro",
["Proto-Chumash"] = "nai-chu-pro",
["Proto-Cupan"] = "azc-cup-pro",
["Proto-Daju"] = "sdv-daj-pro",
["Proto-Daly"] = "aus-dal-pro",
["Tiếng Dizi nguyên thủy"] = "omv-diz-pro",
["Proto-Eastern Jebel"] = "sdv-eje-pro",
["Proto-Eastern Oti-Volta"] = "nic-eov-pro",
["Proto-Edoid"] = "alv-edo-pro",
["Tiếng Eskimo-Aleut nguyên thủy"] = "esx-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-Kam-Sui"] = "qfa-kms-pro",
["Proto-Kampa"] = "awd-kmp-pro",
["Proto-Kham"] = "sit-kha-pro",
["Proto-Khoe"] = "khi-kho-pro",
["Tiếng Koman nguyên thủy"] = "ssa-kom-pro",
["Proto-Komisenian"] = "ira-kms-pro",
["Tiếng Kra nguyên thủy"] = "qfa-kra-pro",
["Tiếng Kra-Dai nguyên thủy"] = "qfa-tak-pro",
["Proto-Kru"] = "kro-pro",
["Proto-Kuki-Chin"] = "tbq-kuk-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-Lolo-Burmese"] = "tbq-lob-pro",
["Proto-Loloish"] = "tbq-lol-pro",
["Proto-Lower Cross River"] = "nic-lcr-pro",
["Proto-Luish"] = "sit-luu-pro",
["Proto-Maidun"] = "nai-mdu-pro",
["Proto-Mande"] = "dmn-pro",
["Proto-Mangbetu"] = "csu-maa-pro",
["Tiếng Mari nguyên thủy"] = "chm-pro",
["Proto-Masa"] = "cdc-mas-pro",
["Proto-Mazatec"] = "omq-maz-pro",
["Proto-Medo-Parthian"] = "ira-mpr-pro",
["Tiếng Miền nguyên thủy"] = "hmx-mie-pro",
["Proto-Mixe-Zoque"] = "nai-miz-pro",
["Proto-Mixtec"] = "omq-mxt-pro",
["Proto-Mixtecan"] = "omq-mix-pro",
["Proto-Mumuye"] = "alv-mum-pro",
["Proto-Munji-Yidgha"] = "ira-mny-pro",
["Proto-Na-Dene"] = "xnd-pro",
["Proto-Nahuan"] = "azc-nah-pro",
["Proto-Nawiki"] = "awd-nwk-pro",
["Tiếng Nguni nguyên thủy"] = "bnt-ngu-pro",
["Tiếng Niger-Congo nguyên thủy"] = "nic-pro",
["Tiếng Nin-Sahara nguyên thủy"] = "ssa-pro",
["Proto-Nilotic"] = "sdv-nil-pro",
["Proto-Norse"] = "gmq-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",
["Tiếng Nuristan nguyên thủy"] = "iir-nur-pro",
["Proto-Nyima"] = "sdv-nyi-pro",
["Proto-Nyulnyulan"] = "aus-nyu-pro",
["Proto-Ogoni"] = "nic-ogo-pro",
["Tiếng Omo nguyên thủy"] = "omv-pro",
["Tiếng Önge nguyên thủy"] = "qfa-ong-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"] = "nic-plt-pro",
["Proto-Plateau Penutian"] = "nai-plp-pro",
["Proto-Pnar-Khasi-Lyngngam"] = "aav-pkl-pro",
["Proto-Pomeranian"] = "zlw-pom-pro",
["Proto-Pomo"] = "nai-pom-pro",
["Tiếng Rukai nguyên thủy"] = "dru-pro",
["Tiếng Lưu Cầu nguyên thủy"] = "jpx-ryu-pro",
["Proto-Saka"] = "xsc-sak-pro",
["Proto-Saka-Wakhi"] = "xsc-skw-pro",
["Proto-Sanglechi-Ishkashimi"] = "ira-sgi-pro",
["Proto-Sara"] = "csu-sar-pro",
["Proto-Scythian"] = "xsc-pro",
["Proto-Shughni-Roshani"] = "ira-shr-pro",
["Proto-Shughni-Yazghulami"] = "ira-shy-pro",
["Proto-Shughni-Yazghulami-Munji"] = "ira-sym-pro",
["Proto-Siouan-Catawban"] = "nai-sca-pro",
["Proto-Songhay"] = "son-pro",
["Proto-Sotho-Tswana"] = "bnt-sts-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",
["Proto-Trans-New Guinea"] = "ngf-pro",
["Proto-Trique"] = "omq-tri-pro",
["Proto-Tsezian"] = "cau-tsz-pro",
["Proto-Tsimshianic"] = "nai-tsi-pro",
["Tiếng Tupi nguyên thủy"] = "tup-pro",
["Proto-Ubangian"] = "nic-ubg-pro",
["Proto-Upper Cross River"] = "nic-ucr-pro",
["Proto-Utian"] = "nai-utn-pro",
["Tiếng Ute-Aztec nguyên thủy"] = "azc-pro",
["Proto-Volta-Congo"] = "nic-vco-pro",
["Proto-Volta-Niger"] = "alv-von-pro",
["Tiếng Semit Tây nguyên thủy"] = "sem-wes-pro",
["Proto-Western Mande"] = "dmn-mdw-pro",
["Proto-Witotoan"] = "sai-wit-pro",
["Proto-Yeniseian"] = "qfa-yen-pro",
["Proto-Yupik"] = "ypk-pro",
["Proto-Zapotec"] = "omq-zpc-pro",
["Proto-Zapotecan"] = "omq-zap-pro",
["Proto-Zaza-Gorani"] = "ira-zgr-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",
["Puinave"] = "pui",
["Puiron"] = "sit-prn",
["Pukapukan"] = "pkp",
["Pulabu"] = "pup",
["Puluwat"] = "puw",
["Puma"] = "pum",
["Tiếng Pumpokol"] = "xpm",
["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",
["Tiếng Qimant"] = "ahg",
["Quebec Sign Language"] = "fcs",
["Querétaro Otomi"] = "otq",
["Quetzaltepec Mixe"] = "pxm",
["Queyu"] = "qvy",
["Quiavicuzas Zapotec"] = "zpj",
["Quileute"] = "qui",
["Quimbaya"] = "sai-qmb",
["Quinault"] = "qun",
["Quinigua"] = "nai-qng",
["Quinqui"] = "quq",
["Quioquitani-Quierí Zapotec"] = "ztq",
["Quiotepec Chinantec"] = "chq",
["Quitemo"] = "sai-qtm",
["Tiếng Quốc tế ngữ"] = "eo",
["Rabona"] = "sai-rab",
["Raga"] = "lml",
["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",
["Tiếng Ratagnon"] = "btn",
["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",
["Reli"] = "rei",
["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",
["Rincón Zapotec"] = "zar",
["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",
["Tiếng Rotuman"] = "rtm",
["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",
["Réunion Creole French"] = "rcf",
["Sa"] = "sax",
["Sa'a"] = "apb",
["Sa'ban"] = "snv",
["Sa'och"] = "scq",
["Saafi-Saafi"] = "sav",
["Saam"] = "raq",
["Saamia"] = "lsm",
["Saare"] = "uss",
["Saba"] = "saa",
["Tiếng Bisaya Sabah"] = "bsy",
["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",
["Tiếng Sambali"] = "xsb",
["Sambalpuri"] = "spv",
["Sambe"] = "xab",
["Samberigi"] = "ssx",
["Samburu"] = "saq",
["Tiếng Thát Mai"] = "smh",
["Tiếng Samo"] = "smq",
["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",
["Tiếng Zapotec San Juan Guelavía"] = "zab",
["San Juan Quiahije Chatino"] = "ctp-san",
["San Juan Teita Mixtec"] = "xtj",
["San Luís Temalacayuca Popoloca"] = "pps",
["San Marcos Tlalcoyalco Popoloca"] = "pls",
["Tiếng Triqui San Martín Itunyoso"] = "trq",
["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",
["Tiếng Sangir"] = "sxn",
["Sangisari"] = "sgr",
["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",
["Tiếng Sarikol"] = "srh",
["Sarli"] = "sdf",
["Sartang"] = "onp",
["Sarua"] = "swy",
["Sarudu"] = "sdu",
["Saruga"] = "sra",
["Tiếng Sasak"] = "sas",
["Sasaru"] = "sxs",
["Sassarese"] = "sdc",
["Satawalese"] = "stw",
["Sateré-Mawé"] = "mav",
["Sathmar Swabian"] = "gmw-stm",
["Saudi Arabian Sign Language"] = "sdl",
["Sauraseni Apabhramsa"] = "inc-sap",
["Saurashtra"] = "saz",
["Sauri"] = "srt",
["Sause"] = "sao",
["Sausi"] = "ssj",
["Savi"] = "sdg",
["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",
["Sechelt"] = "sec",
["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",
["Tiếng Sena"] = "seh",
["Senara Sénoufo"] = "seq",
["Senaya"] = "syn",
["Sene"] = "sej",
["Sengele"] = "szg",
["Senggi"] = "snu",
["Sengo"] = "spk",
["Sengseng"] = "ssz",
["Tiếng Senhaja de Srair"] = "sjs",
["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",
["Serer"] = "srr",
["Serili"] = "sve",
["Seroa"] = "kqu",
["Serrano"] = "ser",
["Seru"] = "szd",
["Serua"] = "srw",
["Serudung Murut"] = "srk",
["Serui-Laut"] = "seu",
["Seta"] = "stf",
["Setaman"] = "stm",
["Seti"] = "sbi",
["Severn Ojibwa"] = "ojs",
["Sewa Bay"] = "sew",
["Seychellois Creole"] = "crs",
["Sha"] = "scw",
["Shabak"] = "sdb",
["Shabo"] = "sbf",
["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",
["Tiếng Shebayo"] = "awd-she",
["Shehri"] = "shv",
["Shekkacho"] = "moy",
["Sheko"] = "she",
["Shelta"] = "sth",
["Shendu"] = "shl",
["Sheni"] = "scv",
["Sherbro"] = "bun",
["Sherdukpen"] = "sdp",
["Tiếng Kham Sheshi"] = "kip",
["Shi"] = "shr",
["Shihhi Arabic"] = "ssh",
["Shiki"] = "gua",
["Shilluk"] = "shk",
["Tiếng Shinasha"] = "bwo",
["Shipibo-Conibo"] = "shp",
["Shixing"] = "sxg",
["Shoo-Minda-Nye"] = "bcv",
["Shoshone"] = "shh",
["Shua"] = "shg",
["Shuar"] = "jiv",
["Shuba"] = "cbq",
["Tiếng Shughnan"] = "sgh",
["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",
["Sinaugoro"] = "snc",
["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",
["Sirenik"] = "ysr",
["Siri"] = "sir",
["Siriano"] = "sri",
["Sirionó"] = "srq",
["Sirmauri"] = "srx",
["Siroi"] = "ssd",
["Sissala"] = "sld",
["Tiếng Tứ Thổ"] = "sit-sit",
["Siuslaw"] = "sis",
["Sivandi"] = "siy",
["Siwai"] = "siw",
["Siwu"] = "akp",
["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",
["Songlai Chin"] = "csj",
["Songomeno"] = "soe",
["Songoora"] = "sod",
["Sonha"] = "soi",
["Sonia"] = "siq",
["Soninke"] = "snk",
["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 Efate"] = "erk",
["South Fali"] = "fal",
["South Giziga"] = "giz",
["South Lembata"] = "lmf",
["South Marquesan"] = "mqm",
["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",
["Tiếng Bạch Nam"] = "bfs",
["Southern Birifor"] = "biv",
["Southern Bobo"] = "bwq",
["Southern Bontoc"] = "obk",
["Southern Carrier"] = "caf",
["Southern Catanduanes Bicolano"] = "bln",
["Southern Dagaare"] = "dga",
["Southern East Cree"] = "crj",
["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",
["Southern Kurdish"] = "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",
["Tiếng Khương Nam"] = "qxs",
["Southern Rengma Naga"] = "nre",
["Southern Rincon Zapotec"] = "zsr",
["Southern Sama"] = "ssb",
["Southern Samo"] = "sbd",
["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",
["Squamish"] = "squ",
["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",
["Sulung"] = "suv",
["Suma"] = "sqm",
["Sumariup"] = "siv",
["Sumau"] = "six",
["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",
["Susu"] = "sus",
["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",
["Tiếng Tadyawan"] = "tdy",
["Tae'"] = "rob",
["Tafi"] = "tcd",
["Tafreshi"] = "xme-taf",
["Tagabawa"] = "bgs",
["Tagakaulu Kalagan"] = "klg",
["Tagbanwa"] = "tbw",
["Tagbu"] = "tbm",
["Tagdal"] = "tda",
["Tagish"] = "tgx",
["Tagwana Senoufo"] = "tgw",
["Tahltan"] = "tht",
["Tai"] = "taw",
["Tai Hang Tong"] = "thc",
["Tai Hongjin"] = "tiz",
["Tai Long"] = "thi",
["Tai Thanh"] = "tmm",
["Tai Ya"] = "cuu",
["Taiap"] = "gpn",
["Taikat"] = "aos",
["Tiếng Nga bồi Taimyr"] = "crp-tpr",
["Tainae"] = "ago",
["Tairuma"] = "uar",
["Taita"] = "dav",
["Tiếng Taivoan"] = "tvx",
["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",
["Tangoa"] = "tgp",
["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",
["Tiếng Tarantino"] = "roa-tar",
["Tarao"] = "tro",
["Taraon"] = "mhu",
["Tareng"] = "tgr",
["Tarjumo"] = "txj",
["Tarok"] = "yer",
["Tarpia"] = "tpf",
["Tartessian"] = "txr",
["Taruma"] = "tdm",
["Tasawaq"] = "twq",
["Tasmate"] = "tmt",
["Tiếng Tat"] = "ttt",
["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",
["Tiếng Tayma"] = "sem-tay",
["Tayo"] = "cks",
["Tiếng Taíno"] = "tnq",
["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",
["Tedim Chin"] = "ctd",
["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",
["Tengger"] = "tes",
["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",
["Ter Sami"] = "sjt",
["Tera"] = "ttr",
["Terebu"] = "trb",
["Terei"] = "buo",
["Tereno"] = "ter",
["Tereweng"] = "twg",
["Tiếng Teribe"] = "tfr",
["Terik"] = "tec",
["Termanu"] = "twu",
["Ternateño"] = "tmg",
["Tese"] = "keg",
["Teshenawa"] = "twc",
["Tetela"] = "tll",
["Tetelcingo Nahuatl"] = "nhg",
["Tetete"] = "teb",
["Tetserret"] = "tez",
["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",
["Thachanadan"] = "thn",
["Thado Chin"] = "tcz",
["Thai Sign Language"] = "tsq",
["Thaiphum Chin"] = "cth",
["Thakali"] = "ths",
["Thamudic"] = "sem-tha",
["Thangal Naga"] = "nki",
["Thangmi"] = "thf",
["Thao"] = "ssf",
["Tharaka"] = "thk",
["Tharrgari"] = "dhr",
["Thawa"] = "xtv",
["Thompson"] = "thp",
["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",
["Tigon Mbembe"] = "nza",
["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",
["Tiếng Tipai"] = "nai-tip",
["Tippera"] = "tpe",
["Tira"] = "tic",
["Tirahi"] = "tra",
["Tiranige Diga Dogon"] = "tde",
["Tircul"] = "pyx",
["Tiri"] = "cir",
["Tita"] = "tdq",
["Titan"] = "ttv",
["Tiv"] = "tiv",
["Tiwa"] = "lax",
["Tiếng Tiwi"] = "tiw",
["Tiéfo"] = "tiq",
["Tiéyaxo Bozo"] = "boz",
["Tjurruru"] = "tju",
["Tiếng Tepehua Tlachichilco"] = "tpt",
["Tiếng Me'phaa Tlacoapa"] = "tpl",
["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",
["Toma"] = "tod",
["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",
["Tiếng Tonkawa"] = "tqw",
["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",
["Transylvanian Saxon"] = "gmw-tsx",
["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",
["Tsez"] = "ddo",
["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",
["Tiếng Tunica"] = "tun",
["Tunisian Arabic"] = "aeb",
["Tiếng Berber Tunisia"] = "sds",
["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",
["Tiếng Turoyo"] = "tru",
["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",
["Tuwuli"] = "bov",
["Tuxináwa"] = "tux",
["Tuxá"] = "tud",
["Tuyuca"] = "tue",
["Twana"] = "twa",
["Twendi"] = "twn",
["Tiếng Tyap"] = "kcg",
["Tyaraity"] = "woa",
["Tyerrernotepanner"] = "xph",
["Tz'utujil"] = "tzj",
["Tzeltal"] = "tzh",
["Tiếng Tzotzil"] = "tzo",
["Tày Tac"] = "tyt",
["Tiếng Tây Bồi"] = "tas",
["Téén"] = "lor",
["Tübatulabal"] = "tub",
["Tiếng U"] = "uuu",
["Uab Meto"] = "aoz",
["Uamué"] = "uam",
["Uare"] = "ksj",
["Ubaghara"] = "byc",
["Ubang"] = "uba",
["Ubi"] = "ubi",
["Ubir"] = "ubr",
["Ucayali-Yurúa Ashéninka"] = "cpb",
["Uda"] = "uda",
["Tiếng Uduk"] = "udu",
["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",
["Tiếng Ulch"] = "ulc",
["Uldeme"] = "udl",
["Ulithian"] = "uli",
["Ullatan"] = "ull",
["Ulumanda'"] = "ulm",
["Ulwa"] = "ulw",
["Uma"] = "ppk",
["Uma' Lasan"] = "xky",
["Uma' Lung"] = "ulu",
["Umanakaina"] = "gdn",
["Umatilla"] = "uma",
["Umbindhamu"] = "umd",
["Umbu-Ungu"] = "ubu",
["Umbugarla"] = "umr",
["Tiếng Umbundu"] = "umb",
["Umbuygamu"] = "umg",
["Umeda"] = "upi",
["Umiida"] = "xud",
["Umiray Dumaget Agta"] = "due",
["Umon"] = "umm",
["Umotína"] = "umo",
["Umpila"] = "ump",
["Una"] = "mtg",
["Tiếng Unami"] = "unm",
["Unas"] = "art-una",
["Unde Kaili"] = "unz",
["Uneme"] = "une",
["Unggaranggu"] = "xun",
["Unggumi"] = "xgu",
["Unserdeutsch"] = "uln",
["Unua"] = "onu",
["Unubahe"] = "unu",
["Uokha"] = "uok",
["Upper Chehalis"] = "cjh",
["Upper Grand Valley Dani"] = "dna",
["Tiếng Thượng Kinabatangan"] = "dmg",
["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",
["Urali"] = "url",
["Urapmin"] = "urm",
["Urarina"] = "ura",
["Urat"] = "urt",
["Urhobo"] = "urh",
["Uri"] = "uvh",
["Urigina"] = "urg",
["Urim"] = "uri",
["Urimo"] = "urx",
["Uripiv-Wala-Rano-Atchin"] = "upv",
["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",
["Usui"] = "usi",
["Utarmbung"] = "omo",
["Ute"] = "ute",
["Utu"] = "utu",
["Tiếng Uvbie"] = "evh",
["Uwinymil"] = "aus-uwi",
["Uya"] = "usu",
["Uyajitaya"] = "duk",
["Uzekwe"] = "eze",
["Vaagri Booli"] = "vaa",
["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",
["Virgin Islands Creole"] = "vic",
["Vishavan"] = "vis",
["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",
["Tiếng Võro"] = "vro",
["Wa"] = "wbm",
["Wa'ema"] = "wag",
["Waama"] = "wwa",
["Waamwang"] = "wmn",
["Wab"] = "wab",
["Wabo"] = "wbb",
["Waboda"] = "kmx",
["Waci Gbe"] = "wci",
["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",
["Wagi"] = "fad",
["Wahau Kayan"] = "whu",
["Wahau Kenyah"] = "whk",
["Tiếng Wahgi"] = "wgi",
["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",
["Wancho"] = "nnp",
["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",
["Tiếng Wardaman"] = "wrr",
["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",
["Tiếng Wastek"] = "hus",
["Wasu"] = "wsu",
["Watakataui"] = "wtk",
["Watam"] = "wax",
["Wathaurong"] = "wth",
["Watiwa"] = "wtf",
["Watubela"] = "wah",
["Waube"] = "kop",
["Wauja"] = "wau",
["Wauyai"] = "wuy",
["Wawa"] = "www",
["Wawonii"] = "wow",
["Waxiang"] = "wxa",
["Wayanad Chetti"] = "ctt",
["Wayoró"] = "wyr",
["Wayumará"] = "sai-way",
["Wedau"] = "wed",
["Weh"] = "weh",
["Welaung"] = "weu",
["Weliki"] = "klh",
["Welsh Romani"] = "rmw",
["Wemale"] = "weo",
["Tiếng Wemba-Wemba"] = "xww",
["Weme Gbe"] = "wem",
["Wendat"] = "wdt",
["Weri"] = "wer",
["Wersing"] = "kvw",
["West Albay Bikol"] = "fbl",
["West Ambae"] = "nnd",
["West Central Banda"] = "bbp",
["Tiếng Tây Duyên hải Bajau"] = "bdr",
["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",
["Tiếng Mari Tây"] = "mrj",
["Western Mashan Hmong"] = "hmw",
["Western Meohang"] = "raf",
["Western Muria"] = "mut",
["Tiếng Tân Aram Tây"] = "amw",
["Western Ojibwa"] = "ojw",
["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",
["Tiếng Wiradjuri"] = "wrh",
["Wiraféd"] = "wir",
["Wirangu"] = "wgu",
["Wiru"] = "wiu",
["Wirö"] = "wpc",
["Wiwa"] = "mbp",
["Tiếng Wiyot"] = "wiy",
["Woccon"] = "xwc",
["Wogamusin"] = "wog",
["Wogeo"] = "woc",
["Woi"] = "wbw",
["Tiếng Woiwurrung"] = "wyi",
["Wojenaka"] = "jod",
["Wolane"] = "wle",
["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",
["Tiếng Xavante"] = "xav",
["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",
["Tiếng Yaaku"] = "muu",
["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",
["Yamphu"] = "ybi",
["Yan-nhangu"] = "jay",
["Yana"] = "ynn",
["Yanda"] = "yda",
["Yanda Dogon"] = "dym",
["Yandjibara"] = "xyb",
["Yandruwandha"] = "ynd",
["Yanesha'"] = "ame",
["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",
["Tiếng Yanyuwa"] = "jao",
["Tiếng Yao (châu Phi)"] = "yao",
["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",
["Yatee Zapotec"] = "zty",
["Tiếng Zapotec Yatzachi"] = "zav",
["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",
["Tiếng Yazghulom"] = "yah",
["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",
["Tiếng Creole Nghi Lan"] = "ycr",
["Yimas"] = "yee",
["Yimchungru Naga"] = "yim",
["Yinbaw Karen"] = "kvu",
["Yinchia"] = "yin",
["Tiếng Yindjibarndi"] = "yij",
["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",
["Yolmo"] = "scp",
["Yolngu Sign Language"] = "ygs",
["Yoloxochitl Mixtec"] = "xty",
["Yom"] = "pil",
["Yombe"] = "yom",
["Yopno"] = "yut",
["Yora"] = "mts",
["Yorta Yorta"] = "xyy",
["Tiếng Mixtec Yosondúa"] = "mpm",
["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",
["Yámana"] = "yag",
["Zaachila Zapotec"] = "ztx",
["Zabana"] = "kji",
["Zacatepec Chatino"] = "ctz",
["Zacatlán-Ahuacatlán-Tepetzintla Nahuatl"] = "nhi",
["Zakhring"] = "zkr",
["Zambian Sign Language"] = "zsl",
["Zan Gula"] = "zna",
["Zanaki"] = "zak",
["Zande"] = "zne",
["Zangskari"] = "zau",
["Zangwal"] = "zah",
["Tiếng Zapotec Zaniza"] = "zpw",
["Tiếng Zapotec"] = "zap",
["Zaramo"] = "zaj",
["Zari"] = "zaz",
["Zauzou"] = "zal",
["Tiếng Karen Zayein"] = "kxk",
["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",
["Tiếng Zapotec Zoogocho"] = "zpq",
["Zotung Chin"] = "czt",
["Zou"] = "zom",
["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-Hmao"] = "hmd",
["Tiếng Aari"] = "aiw",
["Tiếng Aasax"] = "aas",
["Tiếng Abaga"] = "abg",
["Tiếng Abai"] = "poz-abi",
["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 Aceh"] = "ace",
["Tiếng Achawa"] = "aca",
["Tiếng Acheron"] = "acz",
["Tiếng Acholi"] = "ach",
["Tiếng Adangme"] = "ada",
["Tiếng Adja"] = "ajg",
["Tiếng Adygea"] = "ady",
["Tiếng Adzera"] = "adz",
["Tiếng Afar"] = "aa",
["Tiếng Afrikaans"] = "af",
["Tiếng Agawam"] = "alg-aga",
["Tiếng Aghem"] = "agq",
["Tiếng Aghul"] = "agx",
["Tiếng Aghwan"] = "xag",
["Tiếng Ahom"] = "aho",
["Tiếng Ahtna"] = "aht",
["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 Akan"] = "ak",
["Tiếng Akawaio"] = "ake",
["Tiếng Akha"] = "ahk",
["Tiếng Akhvakh"] = "akv",
["Tiếng Akkad"] = "akk",
["Tiếng Aklanon"] = "akl",
["Tiếng Alaba-K’abeena"] = "alw",
["Tiếng Alabama"] = "akz",
["Tiếng Alagwa"] = "wbj",
["Tiếng Alak"] = "alk",
["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 Algonquin"] = "alq",
["Tiếng Algonquin nguyên thủy"] = "alg-pro",
["Tiếng Alsea"] = "aes",
["Tiếng Alutor"] = "alr",
["Tiếng Ama"] = "amm",
["Tiếng Amahuaca"] = "amc",
["Tiếng Amaimon"] = "ali",
["Tiếng Amarasi"] = "aaz",
["Tiếng Ambrak"] = "aag",
["Tiếng Amdang"] = "amj",
["Tiếng Amhara"] = "am",
["Tiếng Amis"] = "ami",
["Tiếng Amurdag"] = "amg",
["Tiếng Amuzgo"] = "amu",
["Tiếng Anal"] = "anm",
["Tiếng Andi"] = "ani",
["Tiếng Angika"] = "anp",
["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 Anuki"] = "aui",
["Tiếng Anyi"] = "any",
["Tiếng Apache Tây"] = "apw",
["Tiếng Aparaí"] = "apy",
["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 Araweté"] = "awt",
["Tiếng Archi"] = "aqc",
["Tiếng Arem"] = "aem",
["Tiếng Argobba"] = "agj",
["Tiếng Armenia"] = "hy",
["Tiếng Armenia cổ"] = "xcl",
["Tiếng Armenia trung đại"] = "axm",
["Tiếng Aromania"] = "rup",
["Tiếng Ashraaf"] = "cus-ash",
["Tiếng Askopan"] = "eiv",
["Tiếng Asli nguyên thủy"] = "mkh-asl-pro",
["Tiếng Assam"] = "as",
["Tiếng Assan"] = "xss",
["Tiếng Asturias"] = "ast",
["Tiếng Asur"] = "asr",
["Tiếng Atayal"] = "tay",
["Tiếng Athpariya"] = "aph",
["Tiếng Atikamekw"] = "atj",
["Tiếng Atong (Ấn Độ)"] = "aot",
["Tiếng Auhelawa"] = "kud",
["Tiếng Aukan"] = "djk",
["Tiếng Avar"] = "av",
["Tiếng Avesta"] = "ae",
["Tiếng Avokaya"] = "avu",
["Tiếng Awadh"] = "awa",
["Tiếng Awing"] = "azo",
["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 Babatana"] = "baa",
["Tiếng Babungo"] = "bav",
["Tiếng Babuza"] = "bzg",
["Tiếng Bactria"] = "xbc",
["Tiếng Badaga"] = "bfq",
["Tiếng Badanchi"] = "bau",
["Tiếng Badui"] = "bac",
["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 Bakhtiari"] = "bqi",
["Tiếng Bala"] = "tuw-bal",
["Tiếng Balanta-Ganja"] = "bjt",
["Tiếng Balanta-Kentohe"] = "ble",
["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 Banjar"] = "bjn",
["Tiếng Bantawa"] = "bap",
["Tiếng Bantu nguyên thủy"] = "bnt-pro",
["Tiếng Baoule"] = "bci",
["Tiếng Barai"] = "bbb",
["Tiếng Barakai"] = "baj",
["Tiếng Bari"] = "bfa",
["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 Batak Simalungun"] = "bts",
["Tiếng Batek"] = "btq",
["Tiếng Bats"] = "bbl",
["Tiếng Batuley"] = "bay",
["Tiếng Bayern"] = "bar",
["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 Berber Bắc Sahara"] = "mzb",
["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 Bhil"] = "bhb",
["Tiếng Bhil Dungra"] = "duh",
["Tiếng Bhnong"] = "mkh-bhn",
["Tiếng Bhojpur"] = "bho",
["Tiếng Bhumij"] = "aav-bhu",
["Tiếng Bidayuh Biatah"] = "bth",
["Tiếng Bih"] = "ibh",
["Tiếng Bihari"] = "bh",
["Tiếng Bilaspur"] = "kfs",
["Tiếng Bilen"] = "byn",
["Tiếng Birao"] = "brr",
["Tiếng Birhor"] = "biy",
["Tiếng Birjia"] = "bix",
["Tiếng Bishnupriya"] = "bpy",
["Tiếng Bislama"] = "bi",
["Tiếng Bisu"] = "bzi",
["Tiếng Bit"] = "bgk",
["Tiếng Blackfoot"] = "bla",
["Tiếng Blagar"] = "beu",
["Tiếng Blang"] = "blr",
["Tiếng Bodo (Ấn Độ)"] = "brx",
["Tiếng Bodo-Garo nguyên thủy"] = "tbq-bdg-pro",
["Tiếng Boghom"] = "bux",
["Tiếng Bokar"] = "sit-bok",
["Tiếng Bokobaru"] = "bus",
["Tiếng Bondo"] = "bfw",
["Tiếng Boon"] = "bnl",
["Tiếng Borôro"] = "bor",
["Tiếng Botlikh"] = "bph",
["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 Bru"] = "bru",
["Tiếng Bru Tây"] = "brv",
["Tiếng Brâu"] = "brb",
["Tiếng Budukh"] = "bdk",
["Tiếng Bughotu"] = "bgt",
["Tiếng Bugis"] = "bug",
["Tiếng Bukhara"] = "bhh",
["Tiếng Bulgar"] = "xbo",
["Tiếng Bulgari"] = "bg",
["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 Bách Tế"] = "pkc",
["Tiếng Bảo An"] = "peh",
["Tiếng Bắc Altai"] = "atv",
["Tiếng Bắc Amami Ōshima"] = "ryn",
["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 Mansi"] = "mns-nor",
["Tiếng Bắc Ndebele"] = "nd",
["Tiếng Bắc Nisu"] = "yiv",
["Tiếng Bắc Sami"] = "se",
["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ố Cam"] = "bbh",
["Tiếng Bố Lưu"] = "ply",
["Tiếng Bố Mang"] = "bvp",
["Tiếng Bố Y"] = "pcc",
["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 Canela"] = "ram",
["Tiếng Cao Câu Ly"] = "zkg",
["Tiếng Carib nguyên thủy"] = "sai-car-pro",
["Tiếng Carrier"] = "crx",
["Tiếng Catalan"] = "ca",
["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 Chakma"] = "ccp",
["Tiếng Chăm cổ"] = "ocm",
["Tiếng Chamalal"] = "cji",
["Tiếng Chamba"] = "cdh",
["Tiếng Chamicuro"] = "ccc",
["Tiếng Chamorro"] = "ch",
["Tiếng Chatino cao nguyên Tây"] = "ctp",
["Tiếng Chaura"] = "crv",
["Tiếng Chavacano"] = "cbk",
["Tiếng Chechen"] = "ce",
["Tiếng Chepang"] = "cdm",
["Tiếng Cherokee"] = "chr",
["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 Chinantec Ojitlán"] = "chj",
["Tiếng Chinantec Ozumacín"] = "chz",
["Tiếng Chinantec Tepinapa"] = "cte",
["Tiếng Chinook"] = "chh",
["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 Chong"] = "cog",
["Tiếng Chu Ru"] = "cje",
["Tiếng Chukot"] = "ckt",
["Tiếng Chulym"] = "clw",
["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 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 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 Corse"] = "co",
["Tiếng Cree"] = "cr",
["Tiếng Cree đồng bằng"] = "crk",
["Tiếng Creole Hà Lan Berbice"] = "brc",
["Tiếng Creole Jamaica"] = "jam",
["Tiếng Creole Louisiana"] = "lou",
["Tiếng Crow"] = "cro",
["Tiếng Cuman"] = "qwm",
["Tiếng Cupeño"] = "cup",
["Tiếng Cushit nguyên thủy"] = "cus-pro",
["Tiếng Càn-đà-la"] = "pgd",
["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ám"] = "gan",
["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 Dagbani"] = "dag",
["Tiếng Dahalik"] = "dlk",
["Tiếng Dahalo"] = "dal",
["Tiếng Dakota"] = "dak",
["Tiếng Dalmatia"] = "dlm",
["Tiếng Dambi"] = "dac",
["Tiếng Dan"] = "dnj",
["Tiếng Danau"] = "dnu",
["Tiếng Dangaléat"] = "daa",
["Tiếng Danu"] = "dnv",
["Tiếng Danuwar"] = "dhw",
["Tiếng Dargwa"] = "dar",
["Tiếng Dargwa nguyên thủy"] = "cau-drg-pro",
["Tiếng Daur"] = "dta",
["Tiếng Dawro"] = "dwr",
["Tiếng Degema"] = "deg",
["Tiếng Denesuline"] = "chp",
["Tiếng Desiya"] = "dso",
["Tiếng Dhanka"] = "dhn",
["Tiếng Dhivehi"] = "dv",
["Tiếng Dhodia"] = "dho",
["Tiếng Dibabawon"] = "mbd",
["Tiếng Digan"] = "rom",
["Tiếng Digan Tavringer"] = "rmu",
["Tiếng Dinka"] = "din",
["Tiếng Dirasha"] = "gdl",
["Tiếng Ditidaht"] = "dtd",
["Tiếng Dizi"] = "mdx",
["Tiếng Do Thái"] = "he",
["Tiếng Dogri"] = "doi",
["Tiếng Dogrib"] = "dgr",
["Tiếng Dolgan"] = "dlg",
["Tiếng Domari"] = "rmt",
["Tiếng Dongolawi"] = "kzh",
["Tiếng Dravida nguyên thủy"] = "dra-pro",
["Tiếng Dubla"] = "dub",
["Tiếng Dukha"] = "trk-dkh",
["Tiếng Duun"] = "dux",
["Tiếng Duy Ngô Nhĩ"] = "ug",
["Tiếng Duy Ngô Nhĩ cổ"] = "oui",
["Tiếng Dyirbal"] = "dbl",
["Tiếng Dzongkha"] = "dz",
["Tiếng Dzuun"] = "dnn",
["Tiếng Ebla"] = "xeb",
["Tiếng Ebrié"] = "ebr",
["Tiếng Ebughu"] = "ebg",
["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 Efai"] = "efa",
["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 Eotile"] = "eot",
["Tiếng Epie"] = "epi",
["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 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 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 Fon"] = "fon",
["Tiếng Fox"] = "sac",
["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 Gaddang"] = "gad",
["Tiếng Gael Scotland"] = "gd",
["Tiếng Gagauz"] = "gag",
["Tiếng Galati"] = "xga",
["Tiếng Galicia"] = "gl",
["Tiếng Galicia-Bồ Đào Nha"] = "roa-opt",
["Tiếng Gamit"] = "gbl",
["Tiếng Gamo"] = "gmv",
["Tiếng Ganza"] = "gza",
["Tiếng Garasia Adiwasi"] = "gas",
["Tiếng Garasia Rajput"] = "gra",
["Tiếng Garo"] = "grt",
["Tiếng Garre"] = "gex",
["Tiếng Gata'"] = "gaq",
["Tiếng Gawar-Bati"] = "gwt",
["Tiếng Gbe Saxwe"] = "sxw",
["Tiếng Gbe nguyên thủy"] = "alv-gbe-pro",
["Tiếng Gedeo"] = "drs",
["Tiếng German Tây nguyên thủy"] = "gmw-pro",
["Tiếng Scots trung đại"] = "gmw-msc",
["Tiếng German nguyên thủy"] = "gem-pro",
["Tiếng Geʽez"] = "gez",
["Tiếng Ghadames"] = "gha",
["Tiếng Ghomala'"] = "bbj",
["Tiếng Gia Rai"] = "jra",
["Tiếng Gikuyu"] = "ki",
["Tiếng Gilak"] = "glk",
["Tiếng Gimi (Goroka)"] = "gim",
["Tiếng Girirra"] = "gii",
["Tiếng Giẻ"] = "jeh",
["Tiếng Glosa"] = "igs",
["Tiếng Godoberi"] = "gdo",
["Tiếng Gofa"] = "gof",
["Tiếng Gone Dau"] = "goo",
["Tiếng Gorowa"] = "gow",
["Tiếng Goth"] = "got",
["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 Guaraní"] = "gn",
["Tiếng Guarani Mbya"] = "gun",
["Tiếng Guarayu"] = "gyr",
["Tiếng Gujarat"] = "gu",
["Tiếng Gulay"] = "gvl",
["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 Creole Haiti"] = "ht",
["Tiếng Hajong"] = "haj",
["Tiếng Halba"] = "hlb",
["Tiếng Halkomelem"] = "hur",
["Tiếng Hamer-Banna"] = "amf",
["Tiếng Hanunoo"] = "hnn",
["Tiếng Harari"] = "har",
["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 Heiltsuk"] = "hei",
["Tiếng Hellen nguyên thủy"] = "grk-pro",
["Tiếng Herero"] = "hz",
["Tiếng Higaonon"] = "mba",
["Tiếng Hiligaynon"] = "hil",
["Tiếng Hindi"] = "hi",
["Tiếng Hindi Fiji"] = "hif",
["Tiếng Hindko Bắc"] = "hno",
["Tiếng Hindustan Caribe"] = "hns",
["Tiếng Hiri Motu"] = "ho",
["Tiếng Hitti"] = "hit",
["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 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 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 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ạ Sorb"] = "dsb",
["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 Ibatan"] = "ivb",
["Tiếng Ibibio"] = "ibb",
["Tiếng Ibino"] = "ibn",
["Tiếng Ibuoro"] = "ibr",
["Tiếng Iceland"] = "is",
["Tiếng Ido"] = "io",
["Tiếng Ifè"] = "ife",
["Tiếng Igala"] = "igl",
["Tiếng Igbo"] = "ig",
["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 Inupiaq"] = "ik",
["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 Isan"] = "tts",
["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 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 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 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 Jiiddu"] = "jii",
["Tiếng Jru'"] = "lbo",
["Tiếng Juang"] = "jun",
["Tiếng Jumjum"] = "jum",
["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 Kabyle"] = "kab",
["Tiếng Kachin"] = "kac",
["Tiếng Kadu"] = "zkd",
["Tiếng Kafa"] = "kbr",
["Tiếng Kaingang"] = "kgp",
["Tiếng Kakabai"] = "kqf",
["Tiếng Kalam"] = "gwc",
["Tiếng Kalao"] = "kly",
["Tiếng Kalash"] = "kls",
["Tiếng Kalinga Limos"] = "kmk",
["Tiếng Kalmyk"] = "xal",
["Tiếng Kalo Phần Lan"] = "rmf",
["Tiếng Kamassia"] = "xas",
["Tiếng Kambaata"] = "ktb",
["Tiếng Kanakanavu"] = "xnb",
["Tiếng Kangean"] = "kkv",
["Tiếng Kannada"] = "kn",
["Tiếng Kannauj"] = "bjj",
["Tiếng Kanuri"] = "kr",
["Tiếng Kapampangan"] = "pam",
["Tiếng Kapingamarangi"] = "kpg",
["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 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 nguyên thủy"] = "kar-pro",
["Tiếng Kari'na"] = "car",
["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 Kavalan"] = "ckv",
["Tiếng Kavet"] = "krv",
["Tiếng Kawésqar"] = "alc",
["Tiếng Kayapó"] = "txu",
["Tiếng Kayort"] = "kyv",
["Tiếng Kazakh"] = "kk",
["Tiếng Kensiu"] = "kns",
["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 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 Khowar"] = "khw",
["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ün"] = "kkh",
["Tiếng Khùa"] = "xhv",
["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 Kickapoo"] = "kic",
["Tiếng Kikai"] = "kzg",
["Tiếng Kili"] = "tuw-kil",
["Tiếng Kim Môn"] = "mji",
["Tiếng Kimbundu"] = "kmb",
["Tiếng Kintaq"] = "knq",
["Tiếng Kiowa"] = "kio",
["Tiếng Kiribati"] = "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 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 Parkar"] = "kvx",
["Tiếng Koli Wadiyara"] = "kxp",
["Tiếng Komi cổ"] = "urj-koo",
["Tiếng Komi-Permyak"] = "koi",
["Tiếng Komi-Zyrian"] = "kpv",
["Tiếng Kongo"] = "kg",
["Tiếng Konkan"] = "kok",
["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 Koryak"] = "kpy",
["Tiếng Kosrae"] = "kos",
["Tiếng Kotava"] = "avk",
["Tiếng Kraol"] = "rka",
["Tiếng Krio"] = "kri",
["Tiếng Krung"] = "krr",
["Tiếng Krymchak"] = "jct",
["Tiếng Kryts"] = "kry",
["Tiếng Kudmal"] = "kyw",
["Tiếng Kui Dawik"] = "dwk",
["Tiếng Kukna"] = "kex",
["Tiếng Kullu"] = "kfx",
["Tiếng Kulon-Pazeh"] = "uun",
["Tiếng Kumbewaha"] = "xks",
["Tiếng Kumyk"] = "kum",
["Tiếng Kumzar"] = "zum",
["Tiếng Kundal Shahi"] = "shd",
["Tiếng Kunigami"] = "xug",
["Tiếng Kurmanji"] = "kmr",
["Tiếng Kurtokha"] = "xkz",
["Tiếng Kurumba Attapady"] = "pkr",
["Tiếng Kutch"] = "kfr",
["Tiếng Kuvi"] = "kxv",
["Tiếng Kuy"] = "kdt",
["Tiếng Kw'adza"] = "wka",
["Tiếng Kwak'wala"] = "kwk",
["Tiếng Kwanyama"] = "kj",
["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 Ladakh"] = "lbj",
["Tiếng Ladin"] = "lld",
["Tiếng Ladino"] = "lad",
["Tiếng Lahnda"] = "lah",
["Tiếng Lak"] = "lbe",
["Tiếng Lakota"] = "lkt",
["Tiếng Lambadi"] = "lmn",
["Tiếng Lamboya"] = "lmy",
["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 Laz"] = "lzz",
["Tiếng Lemnos"] = "xle",
["Tiếng Lepcha"] = "lep",
["Tiếng Leponti"] = "xlp",
["Tiếng Lezghi nguyên thủy"] = "cau-lzg-pro",
["Tiếng Lezgi"] = "lez",
["Tiếng Lhao Vo"] = "mhx",
["Tiếng Liabuku"] = "lix",
["Tiếng Libido"] = "liq",
["Tiếng Liguria"] = "lij",
["Tiếng Lillooet"] = "lil",
["Tiếng Limburg"] = "li",
["Tiếng Lingala"] = "ln",
["Tiếng Lishana Deni"] = "lsd",
["Tiếng Lishanid Noshan"] = "aij",
["Tiếng Lisu"] = "lis",
["Tiếng Litva"] = "lt",
["Tiếng Livonia"] = "liv",
["Tiếng Livvi"] = "olo",
["Tiếng Lojban"] = "jbo",
["Tiếng Lokono"] = "arw",
["Tiếng Lombard"] = "lmo",
["Tiếng Lou"] = "loj",
["Tiếng Luba-Katanga"] = "lu",
["Tiếng Luganda"] = "lg",
["Tiếng Lur Bắc"] = "lrc",
["Tiếng Lur Nam"] = "luz",
["Tiếng Lushootseed"] = "lut",
["Tiếng Luwi"] = "xlu",
["Tiếng Luxembourg"] = "lb",
["Tiếng Lydia"] = "xld",
["Tiếng Lyngngam"] = "lyg",
["Tiếng Lyydi"] = "lud",
["Tiếng Lào"] = "lo",
["Tiếng Lô Lô"] = "ii",
["Tiếng Lư Nhân"] = "sit-lrn",
["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 Mabang"] = "mde",
["Tiếng Macedoni"] = "mk",
["Tiếng Macedoni cổ đại"] = "xmk",
["Tiếng Macushi"] = "mbc",
["Tiếng Madura"] = "mad",
["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 Malagasy"] = "mg",
["Tiếng Malayalam"] = "ml",
["Tiếng Malta"] = "mt",
["Tiếng Mampruli"] = "maw",
["Tiếng Man"] = "gv",
["Tiếng Manda (Ấn Độ)"] = "mha",
["Tiếng Mandara"] = "tbf",
["Tiếng Mandinka"] = "mnk",
["Tiếng Mangas"] = "zns",
["Tiếng Manggarai"] = "mqy",
["Tiếng Mangghuer"] = "xgn-mgr",
["Tiếng Manipur"] = "mni",
["Tiếng Mankanya"] = "knf",
["Tiếng Mano"] = "mev",
["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 Marathi"] = "mr",
["Tiếng Mari Đông"] = "mhr",
["Tiếng Marma"] = "rmz",
["Tiếng Marshall"] = "mh",
["Tiếng Marwar"] = "mwr",
["Tiếng Mator"] = "mtm",
["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 Me'en"] = "mym",
["Tiếng Media cổ"] = "xme-old",
["Tiếng Medumba"] = "byv",
["Tiếng Mehri"] = "gdq",
["Tiếng Memon"] = "mby",
["Tiếng Mende"] = "men",
["Tiếng Meriam"] = "ulk",
["Tiếng Mi'kmaq"] = "mic",
["Tiếng Miami"] = "mia",
["Tiếng Mingrelia"] = "xmf",
["Tiếng Minriq"] = "mnq",
["Tiếng Mintil"] = "mzt",
["Tiếng Miranda"] = "mwl",
["Tiếng Mixtec Chayuco"] = "mih",
["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 Mlabri"] = "mra",
["Tiếng Mogholi"] = "mhj",
["Tiếng Moglena-Rumani"] = "ruq",
["Tiếng Mohawk"] = "moh",
["Tiếng Moken"] = "mwt",
["Tiếng Mokil"] = "mkj",
["Tiếng Moklen"] = "mkm",
["Tiếng Moksha"] = "mdf",
["Tiếng Mongghul"] = "xgn-mgl",
["Tiếng Mooré"] = "mos",
["Tiếng Mordvin nguyên thủy"] = "urj-mdv-pro",
["Tiếng Morokodo"] = "mgc",
["Tiếng Motu"] = "meu",
["Tiếng Mozarab"] = "mxi",
["Tiếng Muak Sa-aak"] = "ukk",
["Tiếng Munda nguyên thủy"] = "mun-pro",
["Tiếng Mundari"] = "unr",
["Tiếng Munji"] = "mnj",
["Tiếng Mursi"] = "muz",
["Tiếng Muscogee"] = "mus",
["Tiếng Muskogee nguyên thủy"] = "nai-mus-pro",
["Tiếng Mwotlap"] = "mlv",
["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 Brunei"] = "kxd",
["Tiếng Mã Lai Bắc Maluku"] = "max",
["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ô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 Naga Chothe"] = "nct",
["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 Kolami"] = "nit",
["Tiếng Nam Mansi"] = "mns-sou",
["Tiếng Nam Ndebele"] = "nr",
["Tiếng Nam Sami"] = "sma",
["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 Nanai"] = "gld",
["Tiếng Napoli"] = "nap",
["Tiếng Nauru"] = "na",
["Tiếng Navajo"] = "nv",
["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",
["Tiếng Nepal"] = "ne",
["Tiếng Newa"] = "new",
["Tiếng Nga"] = "ru",
["Tiếng Ngalum"] = "szb",
["Tiếng Nganasan"] = "nio",
["Tiếng Ngas"] = "anc",
["Tiếng Ngiemboon"] = "nnh",
["Tiếng Ngomba"] = "jgo",
["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 Niue"] = "niu",
["Tiếng Nivkh"] = "niv",
["Tiếng Nkari"] = "nkz",
["Tiếng Nkonya"] = "nko",
["Tiếng Nobiin"] = "fia",
["Tiếng Nogai"] = "nog",
["Tiếng Noreia"] = "nrc",
["Tiếng Norman"] = "nrf",
["Tiếng Novgorod cổ"] = "zle-ono",
["Tiếng Novial"] = "nov",
["Tiếng Nubaca"] = "baf",
["Tiếng Nubi"] = "kcn",
["Tiếng Nuer"] = "nus",
["Tiếng Nuu-chah-nulth"] = "nuk",
["Tiếng Nyah Kur"] = "cbn",
["Tiếng Nyaw"] = "nyw",
["Tiếng Nyeu"] = "nyl",
["Tiếng Nùng"] = "nut",
["Tiếng Nùng Vẻn"] = "enc",
["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 Oirat"] = "xwo",
["Tiếng Ojibwe"] = "oj",
["Tiếng Okanagan"] = "oka",
["Tiếng Okinawa"] = "ryu",
["Tiếng Okinoerabu"] = "okn",
["Tiếng Olukumi"] = "ulb",
["Tiếng Omaha-Ponca"] = "oma",
["Tiếng Omok"] = "omk",
["Tiếng Oriya"] = "or",
["Tiếng Oriya Adiwasi"] = "ort",
["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 Ossetia"] = "os",
["Tiếng Ossetia cổ"] = "oos",
["Tiếng Otomi Mezquital"] = "ote",
["Tiếng Otuke"] = "otu",
["Tiếng Pa Kô"] = "pac",
["Tiếng Pa'O"] = "blk",
["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 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 Pali"] = "pi",
["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 Papiamento"] = "pap",
["Tiếng Parauk"] = "prk",
["Tiếng Parthia"] = "xpr",
["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 Nam"] = "spx",
["Tiếng Piemonte"] = "pms",
["Tiếng Pilagá"] = "plg",
["Tiếng Pinyin"] = "pny",
["Tiếng Pipil"] = "ppl",
["Tiếng Pnar"] = "pbv",
["Tiếng Pohnpei"] = "pon",
["Tiếng Polabia"] = "pox",
["Tiếng Ponosakan"] = "pns",
["Tiếng Popoluca cao nguyên"] = "poi",
["Tiếng Potawatomi"] = "pot",
["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 Prasuni"] = "prn",
["Tiếng Pucikwar"] = "apq",
["Tiếng Punic"] = "xpu",
["Tiếng Punjab"] = "pa",
["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 Quan Thoại"] = "cmn",
["Tiếng Quapaw"] = "qua",
["Tiếng Quechua"] = "qu",
["Tiếng Quenya"] = "qya",
["Tiếng Quiripi"] = "qyp",
["Tiếng Quảng Đông"] = "yue",
["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 Raute"] = "rau",
["Tiếng Ravula"] = "yea",
["Tiếng Rawang"] = "raw",
["Tiếng Rejang"] = "rej",
["Tiếng Rendille"] = "rel",
["Tiếng Rohingya"] = "rhg",
["Tiếng Romagnol"] = "rgn",
["Tiếng Romansh"] = "rm",
["Tiếng Rukai"] = "dru",
["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"] = "xsa",
["Tiếng Sabüm"] = "sbo",
["Tiếng Sadri"] = "sck",
["Tiếng Saek"] = "skb",
["Tiếng Saho"] = "ssy",
["Tiếng Saisiyat"] = "xsy",
["Tiếng Sakizaya"] = "szy",
["Tiếng Salar"] = "slr",
["Tiếng Salish nguyên thủy"] = "sal-pro",
["Tiếng Sami Akkala"] = "sia",
["Tiếng Sami Inari"] = "smn",
["Tiếng Sami Kildin"] = "sjd",
["Tiếng Sami Skolt"] = "sms",
["Tiếng Sami Ume"] = "sju",
["Tiếng Sami nguyên thủy"] = "smi-pro",
["Tiếng Samoa"] = "sm",
["Tiếng Samogitia"] = "sgs",
["Tiếng Samoyed nguyên thủy"] = "syd-pro",
["Tiếng Samtao"] = "stu",
["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 Saxon cổ"] = "osx",
["Tiếng Scots"] = "sco",
["Tiếng Sebat Bet Gurage"] = "sgw",
["Tiếng Selkup"] = "sel",
["Tiếng Semai"] = "sea",
["Tiếng Semaq Beri"] = "szc",
["Tiếng Semelai"] = "sza",
["Tiếng Semit nguyên thủy"] = "sem-pro",
["Tiếng Semnam"] = "ssm",
["Tiếng Seneca"] = "see",
["Tiếng Senni Koyraboro"] = "ses",
["Tiếng Senoufo Nyarafolo"] = "sev",
["Tiếng Serbia-Croatia"] = "sh",
["Tiếng Seri"] = "sei",
["Tiếng Seze"] = "sze",
["Tiếng Shan"] = "shn",
["Tiếng Sherpa"] = "xsr",
["Tiếng Shina"] = "scl",
["Tiếng Shina Kohistan"] = "plk",
["Tiếng Sholaga"] = "sle",
["Tiếng Shompen"] = "sii",
["Tiếng Shona"] = "sn",
["Tiếng Shor"] = "cjs",
["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 Sindh"] = "sd",
["Tiếng Bidayuh Bau"] = "sne",
["Tiếng Sinhala"] = "si",
["Tiếng Sioux nguyên thủy"] = "sio-pro",
["Tiếng Siraya"] = "fos",
["Tiếng Sissano"] = "sso",
["Tiếng Siwi"] = "siz",
["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 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 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 Sranan Tongo"] = "srn",
["Tiếng Sumer"] = "sux",
["Tiếng Sunda"] = "su",
["Tiếng Sunda cổ"] = "osn",
["Tiếng Suri"] = "suq",
["Tiếng Surjapur"] = "sjp",
["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 Tagal Murut"] = "mvv",
["Tiếng Tagalog"] = "tl",
["Tiếng Tagoi"] = "tag",
["Tiếng Tahiti"] = "ty",
["Tiếng Tai Loi"] = "tlq",
["Tiếng Tai Tây Nam nguyên thủy"] = "tai-swe-pro",
["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 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 Tangut"] = "txg",
["Tiếng Tanimbili"] = "tbe",
["Tiếng Taos"] = "twf",
["Tiếng Tapirapé"] = "taf",
["Tiếng Tara Baka"] = "bdh",
["Tiếng Tariana"] = "tae",
["Tiếng Tarifit"] = "rif",
["Tiếng Tashelhit"] = "shi",
["Tiếng Tat-Do Thái"] = "jdt",
["Tiếng Tatar"] = "tt",
["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 Taz"] = "zhx-taz",
["Tiếng Telugu"] = "te",
["Tiếng Tem"] = "kdh",
["Tiếng Temiar"] = "tea",
["Tiếng Temoq"] = "tmo",
["Tiếng Ten'edn"] = "tnz",
["Tiếng Tenharim"] = "pah",
["Tiếng Tepehuan Đông Nam"] = "stp",
["Tiếng Teressa"] = "tef",
["Tiếng Ternate"] = "tft",
["Tiếng Tetum"] = "tet",
["Tiếng Thavưng"] = "thm",
["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 Song"] = "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ượ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 Tiruray"] = "tiy",
["Tiếng Tiên Ti"] = "qfa-xgx-xbi",
["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 Tonga"] = "to",
["Tiếng Tooro"] = "ttj",
["Tiếng Torwali"] = "trw",
["Tiếng Toto"] = "txo",
["Tiếng Tráng Tả Giang"] = "zzj",
["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 Mansi"] = "mns-cen",
["Tiếng Trung Nahuatl"] = "nhn",
["Tiếng Trung Nahuatl Huasteca"] = "nch",
["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 Đứ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 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 Tunni"] = "tqq",
["Tiếng Tupi"] = "tpn",
["Tiếng Tupi cổ"] = "tpw",
["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 Tuva"] = "tyv",
["Tiếng Tuvalu"] = "tvl",
["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 Do Thái Barzani"] = "bjf",
["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 Kavkaz nguyên thủy"] = "cau-nwc-pro",
["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 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 Chaima"] = "ciy",
["Tiếng Ubykh"] = "uby",
["Tiếng Udi"] = "udi",
["Tiếng Udihe"] = "ude",
["Tiếng Udmurt"] = "udm",
["Tiếng Ugarit"] = "uga",
["Tiếng Ugong"] = "ugo",
["Tiếng Ugria nguyên thủy"] = "urj-ugr-pro",
["Tiếng Ukraina"] = "uk",
["Tiếng Umbria"] = "xum",
["Tiếng Uneapa"] = "bbn",
["Tiếng Urak Lawoi'"] = "urk",
["Tiếng Ural nguyên thủy"] = "urj-pro",
["Tiếng Urartu"] = "xur",
["Tiếng Urdu"] = "ur",
["Tiếng Urubú-Kaapor"] = "urb",
["Tiếng Urum"] = "uum",
["Tiếng Ushojo"] = "ush",
["Tiếng Uzbek"] = "uz",
["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 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 Vot"] = "vot",
["Tiếng Vurës"] = "msn",
["Tiếng Waata"] = "ssn",
["Tiếng Waimaha"] = "bao",
["Tiếng Waiwai"] = "waw",
["Tiếng Wakhi"] = "wbl",
["Tiếng Wales"] = "cy",
["Tiếng Wallis"] = "wls",
["Tiếng Wallon"] = "wa",
["Tiếng Wambule"] = "wme",
["Tiếng Waneci"] = "wne",
["Tiếng War-Jaintia"] = "aml",
["Tiếng Waray"] = "war",
["Tiếng Warekena"] = "gae",
["Tiếng Warji"] = "wji",
["Tiếng Wayampi"] = "oym",
["Tiếng Wayana"] = "way",
["Tiếng Wayuu"] = "guc",
["Tiếng Wewaw"] = "wea",
["Tiếng Wobé"] = "wob",
["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 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 Yaeyama"] = "rys",
["Tiếng Yaghnob"] = "yai",
["Tiếng Yakan"] = "yka",
["Tiếng Yakima"] = "yak",
["Tiếng Yakkha"] = "ybh",
["Tiếng Yakut"] = "sah",
["Tiếng Yami"] = "tao",
["Tiếng Yao (Nam Mĩ)"] = "sai-yao",
["Tiếng Yap"] = "yap",
["Tiếng Yapunda"] = "yev",
["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 Yiwom"] = "gek",
["Tiếng Yogad"] = "yog",
["Tiếng Yola"] = "yol",
["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 Yoy"] = "yoy",
["Tiếng Yugh"] = "yug",
["Tiếng Yukaghir nguyên thủy"] = "qfa-yuk-pro",
["Tiếng Yup'ik"] = "esu",
["Tiếng Yuri"] = "sai-yri",
["Tiếng Yurok"] = "yur",
["Tiếng Zaghawa"] = "zag",
["Tiếng Zaiwa"] = "atb",
["Tiếng Zarma"] = "dje",
["Tiếng Zarphat"] = "zrp",
["Tiếng Zay"] = "zwa",
["Tiếng Zayse-Zergulla"] = "zay",
["Tiếng Zaza"] = "zza",
["Tiếng Zeeland"] = "zea",
["Tiếng Zenaga"] = "zen",
["Tiếng Zirenkel"] = "zrn",
["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 Ö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 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 Khanty"] = "kca-eas",
["Tiếng Đông Yugur"] = "yuy",
["Tiếng Đường Uông"] = "zhx-twa",
["Tiếng Độc Long"] = "duu",
["Tiếng Đức"] = "de",
["Tiếng Đức Alemanni"] = "gsw",
["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 Bắc Levant"] = "apc",
["Tiếng Ả Rập Hijazi"] = "acw",
["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 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",
["Tiếng Önge"] = "oon",
["Đa ngữ"] = "mul",
["ǀXam"] = "xam",
["ǁAni"] = "hnh",
["ǁGana"] = "gnk",
["ǁXegwi"] = "xeg",
["ǂHoan"] = "huc",
["ǃKung"] = "khi-kun",
["Tiếng Bắc Selkup"] = "sel-nor",
["Tiếng Nam Selkup"] = "sel-sou",
["Tiếng Selkup nguyên thủy"] = "sel-pro",
["Tiếng Slovak cổ"] = "zlw-osk",
["Proto-Central Naga"] = "sit-aao-pro",
["Tiếng Bạch nguyên thủy"] = "sit-bai-pro",
["Bangru"] = "sit-ban",
["Proto-Bodish"] = "sit-bdi-pro",
["Tiếng Tứ Xuyên"] = "zhx-sic",
["Tiếng Quảng Lâm"] = "aav-qal",
}
e5nv29eltmucsormda71qitvjl54q4t
𠋕
0
275572
2353549
2130161
2026-05-15T09:48:18Z
Kateru Zakuro
34522
2353549
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{langname|mul}}===
{{Han char|rn=9|rad=人|as=9|sn=11|canj=OMND|ids=⿰亻⿻𠦕人}}
==={{ĐM|further reading}}===
{{Han ref|kx=0112.071|dkj=00921|hdz=10186.130|uh=202D5}}
=={{langname|zh}}==
{{zh-see|𠋸|v}}
0xh4k2olxpicl6ro2b0dzbhrnr57d3e
𫢍
0
276582
2353547
2113824
2026-05-15T09:39:39Z
Kateru Zakuro
34522
2353547
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han character}}===
{{Han char|rn=9|rad=人|as=4|sn=6|ids=⿰斤人}}
===={{ĐM|references}}====
* {{Han ref|kx=|dkj=|dj=|hdz=|uh=2B88D}}
=={{langname|tyz}}==
==={{ĐM|noun}}===
{{tyz-noun}}
# {{tyz-Nom form of|cần|[[người]]}
#:{{ux|tyz|𫡱'''𫢍'''洞卢堯庄算<br>Soong '''gần '''toọng lo héo dẳng toan|Hai '''người '''trong dạ biết bao lo lắng nên mới tính toán.}}
==={{ĐM|ref}}===
* {{R:tyz:tdcnt}}
* {{R:tyz:Lương Bèn}}
=={{langname|za}}==
==={{ĐM|noun}}===
{{za-head|noun}}
# {{za-sawndip form of|gaenz}}
adho09pae869ayal7bkjok12jiguz7b
2353548
2353547
2026-05-15T09:39:58Z
Kateru Zakuro
34522
2353548
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han character}}===
{{Han char|rn=9|rad=人|as=4|sn=6|ids=⿰斤人}}
===={{ĐM|references}}====
* {{Han ref|kx=|dkj=|dj=|hdz=|uh=2B88D}}
=={{langname|tyz}}==
==={{ĐM|noun}}===
{{tyz-noun}}
# {{tyz-Nom form of|cần|[[người]]}}
#:{{ux|tyz|𫡱'''𫢍'''洞卢堯庄算<br>Soong '''gần '''toọng lo héo dẳng toan|Hai '''người '''trong dạ biết bao lo lắng nên mới tính toán.}}
==={{ĐM|ref}}===
* {{R:tyz:tdcnt}}
* {{R:tyz:Lương Bèn}}
=={{langname|za}}==
==={{ĐM|noun}}===
{{za-head|noun}}
# {{za-sawndip form of|gaenz}}
at90sb2lvzo5o1pquecusc4g8kwzveo
Mô đun:shortcut box
828
279305
2353496
2264575
2026-05-15T06:11:16Z
Kateru Zakuro
34522
2353496
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local parameters_module = "Module:parameters"
local template_parser_module = "Module:template parser"
local utilities_module = "Module:utilities"
local html_create = mw.html.create
local insert = table.insert
local ipairs = ipairs
local require = require
local tostring = tostring
--[==[
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 format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function get_namespace_shortcut(...)
get_namespace_shortcut = require(pages_module).get_namespace_shortcut
return get_namespace_shortcut(...)
end
local function get_template_invocation_name(...)
get_template_invocation_name = require(template_parser_module).getTemplateInvocationName
return get_template_invocation_name(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function track(...)
track = require(debug_track_module)
return track(...)
end
local function uses_hidden_category(...)
uses_hidden_category = require(maintenance_category_module).uses_hidden_category
return uses_hidden_category(...)
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 current_title
local function get_current_title()
current_title, get_current_title = mw.title.getCurrentTitle(), nil
return current_title
end
local is_documentation
local function get_is_documentation()
is_documentation, get_is_documentation = require(pages_module).is_documentation(current_title or get_current_title()), nil
return is_documentation
end
local target
local function get_target()
get_target = nil
-- If it's a documentation page, make the target point to the base page.
if is_documentation == nil and get_is_documentation() or is_documentation then
target = ((current_title or get_current_title()).basePageTitle or current_title).fullText -- Fallback is a failsafe, but shouldn't be needed.
return target
end
local namespace = (current_title or get_current_title()).namespace
-- Unless the page is a template or module, point to the current section with a fragment. Otherwise, just point to the current page.
if not (namespace == 10 or (namespace == 828 and current_title.contentModel == "Scribunto")) then
local current_section = require(pages_module).get_current_section()
if current_section ~= 0 then -- Section 0 is everything before the first heading (i.e. the top of the page).
local headings, i = {}, 0
for heading in require(template_parser_module).find_headings(current_title.content) do
i = i + 1
headings[i] = heading
if heading.section == current_section then
break
end
end
-- Once the current section has been found, validate headings in reverse order until a valid one is found.
while i ~= 0 do
local anchor = headings[i]:get_anchor()
if anchor ~= nil then
-- Add the fragment.
current_title.fragment = anchor:gsub("_", " ")
break
end
i = i - 1
end
end
end
target = current_title.fullText
return target
end
local function handle_shortcut(title, demo)
local namespace = title.namespace
local text = namespace == 0 and title.text or
namespace == 10 and get_template_invocation_name(title, "shortcut") or
get_namespace_shortcut(title) .. ":" .. title.text
local redlink, query = not title.content
if redlink then
query = {
action = "edit",
redlink = true,
preloadtext = not demo and "#REDIRECT [[" .. (target or get_target()) .. "]]" or nil
}
else
query = {
redirect = "no",
}
end
local tag = html_create("code"):wikitext((namespace == 10 and "{{[" or "[") .. tostring(title:fullUrl(query)) .. " ")
if redlink then
text = html_create("span")
:addClass("redlink")
:wikitext(text)
end
tag = tag:node(text):wikitext(namespace == 10 and "]}}" or "]")
if demo then
return tag
elseif redlink then
tag:addClass("attentionseeking")
return tag, "redlink"
end
-- Check the target is correct.
local redirect = title.redirectTarget
if redirect and redirect.fullText == (target or get_target()) then
return tag
end
-- If not, flag for attention.
tag:addClass("attentionseeking")
return tag, "not shortcut"
end
-- Takes `list`, an array of title objects, and returns a shortcut box.
function export.format_shortcuts(list, temp, nocat, demo)
if nocat then
track("shortcut box/nocat")
end
local div = html_create("div")
:addClass("noprint")
:addClass("plainlinks")
:addClass("shortcut-box")
:wikitext(("%s[[Wiktionary:Viết tắt|Viết tắt]]:"):format(
temp and "Temporary " or "",
temp and "s" or "S",
list[2] and "s" or ""
))
local redlink, not_shortcut
for _, shortcut in ipairs(list) do
div:tag("br")
local shortcut, cat = handle_shortcut(shortcut, demo)
div:node(shortcut)
if cat == "redlink" then
redlink = true
elseif cat == "not shortcut" then
not_shortcut = true
end
end
if nocat or uses_hidden_category(current_title or get_current_title()) then
return tostring(div)
end
local categories = {}
-- Don't categorize documentation pages as being pages with shortcuts.
if not (is_documentation == nil and get_is_documentation() or is_documentation) then
end
if redlink then
end
if not_shortcut then
end
return tostring(div) .. format_categories(categories, nil, "-", nil, true)
end
function export.shortcut_t(frame)
local boolean = {type = "boolean"}
local params = {
-- Namespace 10 is Template.
[1] = {required = true, type = "title", namespace = 10,
list = true, sublist = "comma without whitespace", flatten = true},
["demo"] = {type = "boolean", demo = true},
["nocat"] = boolean, -- To be removed: no use-case.
["temp"] = boolean,
}
local args = process_params(frame:getParent().args, params)
return export.format_shortcuts(args[1], args.temp, args.nocat, args.demo)
end
return export
0gecfwmoczckect4a9fndvz6lnt96pw
otuz
0
284640
2353542
2158544
2026-05-15T07:35:21Z
Kelly zhrm
58416
2353542
wikitext
text/x-wiki
=={{langname|az}}==
{{number box|az|30}}
==={{ĐM|etym}}===
Từ {{inh|az|trk-pro|*otuŕ}}.
==={{ĐM|pron}}===
* {{IPA4|az|[oˈtʰuz]}}
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-otuz.wav}}
==={{ĐM|numeral}}===
{{head|az|Số từ}}
# {{cln|az|Số đếm}} [[ba mươi|Ba mươi]].
=={{langname|gag}}==
==={{ĐM|etym}}===
{{inh|gag|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{hyphenation|gag|o|tuz}}
==={{ĐM|numeral}}===
{{head|gag|Số từ}}
# {{cln|gag|Số đếm}} [[ba mươi|Ba mươi]].
=={{langname|kdr}}==
==={{ĐM|etym}}===
Từ {{inh|kdr|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|numeral}}===
{{head|kdr|Số từ}}
# {{cln|kdr|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|ref}}===
* {{R:kdr:Baskakov}}
=={{langname|crh}}==
{{number box|crh|30}}
==={{ĐM|etym}}===
{{inh+|crh|trk-pro|*otuŕ|t=thirty}}.
==={{ĐM|pron}}===
* {{hyph|crh|o|tuz}}
==={{ĐM|numeral}}===
{{head|crh|Số từ}}
# {{cln|crh|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|further}}===
* {{R:crh:Luğatçıq}}
=={{langname|tr}}==
{{number box|tr|30}}
==={{ĐM|etym}}===
{{inh+|tr|ota|اوتوز|tr=otuz|t=ba mươi}}, từ {{inh|tr|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{IPA4|tr|/oˈtuz/|[o̞ˈt̪ʰuz̥]}}
* {{hyphenation|tr|o|tuz}}
* {{audio|tr|LL-Q256 (tur)-ToprakM-otuz.wav}}
==={{ĐM|numeral}}===
{{head|tr|Số từ}}
# {{cln|tr|Số đếm}} [[ba mươi|Ba mươi]].
===={{ĐM|rel}}====
* {{l|tr|otuzluk}}
=={{langname|tk}}==
{{number box|tk|30}}
==={{ĐM|etym}}===
Từ {{inh|tk|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|numeral}}===
{{head|tk|Số từ}}
# {{cln|tk|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|further}}===
* {{R:tk:Enedilim}}
* {{R:tk:webonary}}
21iwvcoh4n9y8jya1evzisxhzo1xw5s
2353543
2353542
2026-05-15T07:35:40Z
Kelly zhrm
58416
/* {{ĐM|etym}} */
2353543
wikitext
text/x-wiki
=={{langname|az}}==
{{number box|az|30}}
==={{ĐM|etym}}===
Từ {{inh|az|trk-pro|*otuŕ}}.
==={{ĐM|pron}}===
* {{IPA4|az|[oˈtʰuz]}}
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-otuz.wav}}
==={{ĐM|numeral}}===
{{head|az|Số từ}}
# {{cln|az|Số đếm}} [[ba mươi|Ba mươi]].
=={{langname|gag}}==
==={{ĐM|etym}}===
{{inh|gag|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{hyphenation|gag|o|tuz}}
==={{ĐM|numeral}}===
{{head|gag|Số từ}}
# {{cln|gag|Số đếm}} [[ba mươi|Ba mươi]].
=={{langname|kdr}}==
==={{ĐM|etym}}===
Từ {{inh|kdr|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|numeral}}===
{{head|kdr|Số từ}}
# {{cln|kdr|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|ref}}===
* {{R:kdr:Baskakov}}
=={{langname|crh}}==
{{number box|crh|30}}
==={{ĐM|etym}}===
{{inh+|crh|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{hyph|crh|o|tuz}}
==={{ĐM|numeral}}===
{{head|crh|Số từ}}
# {{cln|crh|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|further}}===
* {{R:crh:Luğatçıq}}
=={{langname|tr}}==
{{number box|tr|30}}
==={{ĐM|etym}}===
{{inh+|tr|ota|اوتوز|tr=otuz|t=ba mươi}}, từ {{inh|tr|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{IPA4|tr|/oˈtuz/|[o̞ˈt̪ʰuz̥]}}
* {{hyphenation|tr|o|tuz}}
* {{audio|tr|LL-Q256 (tur)-ToprakM-otuz.wav}}
==={{ĐM|numeral}}===
{{head|tr|Số từ}}
# {{cln|tr|Số đếm}} [[ba mươi|Ba mươi]].
===={{ĐM|rel}}====
* {{l|tr|otuzluk}}
=={{langname|tk}}==
{{number box|tk|30}}
==={{ĐM|etym}}===
Từ {{inh|tk|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|numeral}}===
{{head|tk|Số từ}}
# {{cln|tk|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|further}}===
* {{R:tk:Enedilim}}
* {{R:tk:webonary}}
ijha8rgdqtnl2z3uziuckjhx7cvfegb
2353545
2353543
2026-05-15T08:28:06Z
Hiyuune
50834
/* Tiếng Gagauz */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353545
wikitext
text/x-wiki
=={{langname|az}}==
{{number box|az|30}}
==={{ĐM|etym}}===
Từ {{inh|az|trk-pro|*otuŕ}}.
==={{ĐM|pron}}===
* {{IPA4|az|[oˈtʰuz]}}
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-otuz.wav}}
==={{ĐM|numeral}}===
{{head|az|Số từ}}
# {{cln|az|Số đếm}} [[ba mươi|Ba mươi]].
=={{langname|gag}}==
==={{ĐM|etym}}===
Từ {{inh|gag|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{hyphenation|gag|o|tuz}}
==={{ĐM|numeral}}===
{{head|gag|Số từ}}
# {{cln|gag|Số đếm}} [[ba mươi|Ba mươi]].
=={{langname|kdr}}==
==={{ĐM|etym}}===
Từ {{inh|kdr|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|numeral}}===
{{head|kdr|Số từ}}
# {{cln|kdr|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|ref}}===
* {{R:kdr:Baskakov}}
=={{langname|crh}}==
{{number box|crh|30}}
==={{ĐM|etym}}===
{{inh+|crh|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{hyph|crh|o|tuz}}
==={{ĐM|numeral}}===
{{head|crh|Số từ}}
# {{cln|crh|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|further}}===
* {{R:crh:Luğatçıq}}
=={{langname|tr}}==
{{number box|tr|30}}
==={{ĐM|etym}}===
{{inh+|tr|ota|اوتوز|tr=otuz|t=ba mươi}}, từ {{inh|tr|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|pron}}===
* {{IPA4|tr|/oˈtuz/|[o̞ˈt̪ʰuz̥]}}
* {{hyphenation|tr|o|tuz}}
* {{audio|tr|LL-Q256 (tur)-ToprakM-otuz.wav}}
==={{ĐM|numeral}}===
{{head|tr|Số từ}}
# {{cln|tr|Số đếm}} [[ba mươi|Ba mươi]].
===={{ĐM|rel}}====
* {{l|tr|otuzluk}}
=={{langname|tk}}==
{{number box|tk|30}}
==={{ĐM|etym}}===
Từ {{inh|tk|trk-pro|*otuŕ|t=ba mươi}}.
==={{ĐM|numeral}}===
{{head|tk|Số từ}}
# {{cln|tk|Số đếm}} [[ba mươi|Ba mươi]].
==={{ĐM|further}}===
* {{R:tk:Enedilim}}
* {{R:tk:webonary}}
tfbf2kw0qzsxg2groetwxj25687jd7g
on iki
0
288435
2353526
2117896
2026-05-15T07:19:56Z
Kelly zhrm
58416
2353526
wikitext
text/x-wiki
=={{langname|az}}==
{{az-variant|он ики}}
{{number box|az|12}}
==={{ĐM|pron}}===
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-on iki.wav}}
==={{ĐM|numeral}}===
{{head|az|Số từ}}
# {{cln|az|Số đếm}} [[mười hai|Mười hai]].
=={{langname|tr}}==
{{number box|tr|12}}
==={{ĐM|pron}}===
* {{audio|tr|LL-Q256 (tur)-ToprakM-on iki.wav}}
==={{ĐM|numeral}}===
{{head|tr|Số từ}}
# {{cln|tr|Số đếm}} [[mười hai|Mười hai]].
=={{langname|tk}}==
{{number box|tk|12}}
==={{ĐM|numeral}}===
{{head|tk|Số từ}}
# [[mười hai|Mười hai]].
nigswqcqz9yp9aldcgh4tvmrshcrhyw
avstraliyalik
0
291120
2353519
2126689
2026-05-15T07:02:32Z
Kelly zhrm
58416
2353519
wikitext
text/x-wiki
=={{langname|uz}}==
==={{ĐM|etym}}===
Từ ghép giữa {{suf|uz|Avstraliya|lik}}.
==={{ĐM|n}}===
{{uz-noun}}
# [[người Úc|Người Úc]].
{{c|uz|Quốc tịch}}
hl3f0aw7n9bbfluf4eopcqo732nexqc
üçüncü
0
296282
2353522
2139891
2026-05-15T07:12:29Z
Kelly zhrm
58416
2353522
wikitext
text/x-wiki
=={{langname|az}}==
{{az-variant|үчүнҹү|اۆچۆنجۆ}}
{{ordinalbox|az|2nd|3rd|4th|ikinci|dördüncü|card=üç}}
==={{ĐM|etym}}===
Về mặt hình thái học {{suffix|az|üç|inci|alt2=üncü}}. Cùng gốc với {{cog|kk|үшінші}}, {{cog|otk|𐰇𐰲𐰨|tr=üčünč}}, {{cog|tr|üçüncü}}, {{cog|tk|üçünji}}.
==={{ĐM|pron}}===
* {{IPA4|az|[yt͡ʃynˈd͡ʒy]|[yt͡synˈd͡zy]}}
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-üçüncü.wav}}
==={{ĐM|adj}}===
{{head|az|Số từ}}
# {{cln|az|Số thứ tự}} [[thứ ba|Thứ ba]].
=={{langname|tr}}==
{{number box|tr|3}}
==={{ĐM|etym}}===
{{inh+|tr|ota|اوچنجی|tr=üçüncü}}, từ {{inh|tr|trk-pro|*üč}}. {{surf|tr|üç|-üncü}}
==={{ĐM|pron}}===
* {{tr-IPA}}
* {{audio|tr|LL-Q256_(tur)-ToprakM-üçüncü.wav}}
* {{hyphenation|tr|ü|çün|cü}}
==={{ĐM|adj}}===
{{head|tr|Tính từ}}
# {{cln|tr|Số thứ tự}} [[thứ ba|Thứ ba]].
#: {{alti|tr|3'üncü|3.}}
==={{ĐM|further}}===
* {{R:tr:TDK}}
tjwhqakmq5pxl8xig2e5obypdd2qf1j
2353523
2353522
2026-05-15T07:12:57Z
Kelly zhrm
58416
/* {{ĐM|adj}} */
2353523
wikitext
text/x-wiki
=={{langname|az}}==
{{az-variant|үчүнҹү|اۆچۆنجۆ}}
{{ordinalbox|az|2nd|3rd|4th|ikinci|dördüncü|card=üç}}
==={{ĐM|etym}}===
Về mặt hình thái học {{suffix|az|üç|inci|alt2=üncü}}. Cùng gốc với {{cog|kk|үшінші}}, {{cog|otk|𐰇𐰲𐰨|tr=üčünč}}, {{cog|tr|üçüncü}}, {{cog|tk|üçünji}}.
==={{ĐM|pron}}===
* {{IPA4|az|[yt͡ʃynˈd͡ʒy]|[yt͡synˈd͡zy]}}
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-üçüncü.wav}}
==={{ĐM|numeral}}===
{{head|az|Số từ}}
# {{cln|az|Số thứ tự}} [[thứ ba|Thứ ba]].
=={{langname|tr}}==
{{number box|tr|3}}
==={{ĐM|etym}}===
{{inh+|tr|ota|اوچنجی|tr=üçüncü}}, từ {{inh|tr|trk-pro|*üč}}. {{surf|tr|üç|-üncü}}
==={{ĐM|pron}}===
* {{tr-IPA}}
* {{audio|tr|LL-Q256_(tur)-ToprakM-üçüncü.wav}}
* {{hyphenation|tr|ü|çün|cü}}
==={{ĐM|adj}}===
{{head|tr|Tính từ}}
# {{cln|tr|Số thứ tự}} [[thứ ba|Thứ ba]].
#: {{alti|tr|3'üncü|3.}}
==={{ĐM|further}}===
* {{R:tr:TDK}}
grq4dyll16omwmeh2p9om3daig0e3qu
Ivory Coast
0
305678
2353559
2161467
2026-05-15T11:08:22Z
Kateru Zakuro
34522
2353559
wikitext
text/x-wiki
=={{langname|en}}==
==={{ĐM|etymology}}===
{{calque|en|fr|Côte d'Ivoire}}.
==={{ĐM|pronunciation}}===
* {{IPA4|en|/ˈaɪvəɹi ˈkoʊst/}}
* {{audio|en|En-us-Ivory Coast.ogg|a=US}}
* {{audio|en|LL-Q1860 (eng)-Soundguys-Ivory Coast.wav|a=UK}}
==={{ĐM|proper noun}}===
{{en-proper noun|def=~|head=[[ivory|Ivory]] [[coast|Coast]]}}
# [[Bờ Biển Ngà]].
===={{ĐM|usage notes}}====
* Xem ghi chú sử dụng tại [[Côte d'Ivoire]].
===={{ĐM|derived terms}}====
{{col|en|Ivorian}}
2cfc04i44kos5u0rnbi45jw3qm2xk4o
Thể loại:en:Quốc gia
14
305680
2353565
2269724
2026-05-15T11:40:56Z
TheHighFighter2
42988
TheHighFighter2 đã đổi [[Thể loại:Quốc gia/Tiếng Anh]] thành [[Thể loại:en:Quốc gia]] (đã tắt đổi hướng)
2269724
wikitext
text/x-wiki
[[Thể loại:Tổ chức chính trị/Tiếng Anh]]
[[Thể loại:Danh sách chủ đề thuộc nhóm tên gọi/Tiếng Anh]]
[[Thể loại:Quốc gia|A]]
1n7y7cc75dyez34r3dgb44u49pvmwij
2353566
2353565
2026-05-15T11:41:27Z
TheHighFighter2
42988
/* */
2353566
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:en:Quốc gia của châu Phi
14
305682
2353560
2161504
2026-05-15T11:10:27Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Thể loại:Quốc gia châu Phi/Tiếng Anh]] thành [[Thể loại:en:Quốc gia của châu Phi]] (đã tắt đổi hướng)
2161504
wikitext
text/x-wiki
[[Thể loại:Quốc gia châu Phi|A]]
[[Thể loại:Quốc gia/Tiếng Anh]]
2vu47pafp66q9kinirj594zxeveiy1e
2353561
2353560
2026-05-15T11:12:25Z
Kateru Zakuro
34522
2353561
wikitext
text/x-wiki
{{auto cat}}
[[Thể loại:Quốc gia/Tiếng Anh]]
abewq47w31vrn5jycx46gmhvvvic258
2353562
2353561
2026-05-15T11:12:43Z
Kateru Zakuro
34522
Đã lùi lại sửa đổi [[Special:Diff/2353561|2353561]] của [[Special:Contributions/Kateru Zakuro|Kateru Zakuro]] ([[User talk:Kateru Zakuro|thảo luận]])
2353562
wikitext
text/x-wiki
[[Thể loại:Quốc gia châu Phi|A]]
[[Thể loại:Quốc gia/Tiếng Anh]]
2vu47pafp66q9kinirj594zxeveiy1e
2353564
2353562
2026-05-15T11:33:56Z
TheHighFighter2
42988
/* */
2353564
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Mô đun:category tree/topic/Places
828
324859
2353563
2351397
2026-05-15T11:33:20Z
TheHighFighter2
42988
2353563
Scribunto
text/plain
local labels = {}
local handlers = {}
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local string_utilities_module = "Module:string utilities"
local m_locations = require("Module:place/locations")
local m_placetypes = require("Module:place/placetypes")
local placetype_data = m_placetypes.placetype_data
local internal_error = m_locations.internal_error
local dump = mw.dumpObject
local insert = table.insert
local concat = table.concat
local is_callable = require("Module:fun").is_callable
--[==[ intro:
This module is part of the category tree code and contains code to generate the descriptions of place-related categories
such as [[Category:de:Hokkaido Prefecture, Japan]], [[Category:es:Cities in France]],
[[Category:pt:Municipalities of Tocantins, Brazil]], etc.). Note that this module doesn't actually create the
categories; that must be done separately, with the text "{{tl|auto cat}}" as the definition of the category. (This
process should automatically happen periodically for non-empty categories, because they will appear in
[[Special:WantedCategories]] and a bot will periodically examine that list and create any needed category.)
There are two ways that category descriptions are specified: (1) by manually adding an entry to the `labels` table,
keyed by the label (the category minus the language code) with a value consisting of a Lua table specifying the
description text and the category's parents; (2) through handlers (pieces of Lua code) added to the `handlers` list,
which recognize labels of a specific type (e.g. `Cities in France`) and generate the appropriate specification for that
label on-the-fly.
See [[Module:place]] for an introduction to the terminology associated with places along with a list of all the relevant
modules, along with for more specific information on types of toponyms and placetypes and how their categorization
works.
]==]
local function lcfirst(label)
return mw.getContentLanguage():lcfirst(label)
end
local function gsub_literally(str, from, to)
local m_strutils = require(string_utilities_module)
return (str:gsub(m_strutils.pattern_escape(from), m_strutils.replacement_escape(to)))
end
local class_to_bare_category_parent = {
["polity"] = "tổ chức chính trị",
["subpolity"] = "political divisions",
["settlement"] = "settlements",
["non-admin settlement"] = "settlements",
["capital"] = "capital cities",
["natural feature"] = "đặc điểm tự nhiên",
["man-made structure"] = "man-made structures",
["geographic region"] = "geographic and cultural areas",
}
local class_is_political_division = {
["polity"] = true, -- strictly false but there are placetypes ambiguous between polity and subpolity
["subpolity"] = true,
["settlement"] = true,
["non-admin settlement"] = false,
["capital"] = true,
["natural feature"] = false,
["man-made structure"] = false,
["geographic region"] = false,
["generic place"] = false,
}
local capital_cat_to_placetype = {}
for placetype, capital_cat in pairs(m_placetypes.placetype_to_capital_cat) do
capital_cat_to_placetype[capital_cat] = placetype
end
-- Handler for bare categories for all types of capitals. This needs to precede the handler for bare placetype
-- categories as some of the types of capitals exist as placetypes as well.
insert(handlers, function(label)
label = lcfirst(label)
local capital_placetype = capital_cat_to_placetype[label]
if capital_placetype then
local pl_placetype = m_placetypes.pluralize_placetype(capital_placetype)
local linkdesc = m_placetypes.get_placetype_display_form(pl_placetype, "top-level")
if linkdesc == nil then
internal_error("Unrecognized placetype %s when processing label %s", capital_placetype, label)
end
if linkdesc == false then
mw.log(("Display form for pl_placetype %s is false, can't categorize"):format(dump(pl_placetype)))
return nil
end
return {
type = "chủ đề thuộc nhóm tên gọi",
topic = label,
description = "{{{langname}}} names of [[capital]]s of " .. linkdesc .. ".",
parents = {"capital cities"},
}
end
end)
-- Handler for bare placetype categories. FIXME: Add wpcat= and commonscat= info. Previously we had it for various
-- so-called "generic" placetypes, but sometimes the categories were wrong.
insert(handlers, function(label)
for _, canon_label in ipairs { lcfirst(label), label } do
local ptdesc, ptdata = m_placetypes.get_placetype_display_form(canon_label, "top-level", "return full")
if ptdesc then
local from_category_props = {
from_category = true,
no_split_qualifiers = true,
}
local bare_category_parent = m_placetypes.get_equiv_placetype_prop(canon_label, function(pt)
local bare_category_parent = m_placetypes.get_placetype_prop(pt, "bare_category_parent")
if bare_category_parent then
return bare_category_parent
end
local class = m_placetypes.get_placetype_prop(pt, "class")
if class then
if class_to_bare_category_parent[class] == nil then
internal_error("Saw unknown category class %s derived from placetype %s",
class, canon_label)
end
return class_to_bare_category_parent[class]
end
end, from_category_props)
if not bare_category_parent then
internal_error("Saw placetype %s without a `class` or `bare_category_parent` setting, either " ..
"directly or through a fallback", canon_label)
end
local addl_bare_category_parents = m_placetypes.get_equiv_placetype_prop(canon_label, function(pt)
return m_placetypes.get_placetype_prop(pt, "addl_bare_category_parents")
end, from_category_props)
local bare_category_breadcrumb = m_placetypes.get_equiv_placetype_prop(canon_label, function(pt)
return m_placetypes.get_placetype_prop(pt, "bare_category_breadcrumb")
end, from_category_props)
if type(bare_category_parent) == "string" and bare_category_breadcrumb then
bare_category_parent = {name = bare_category_parent, sort = bare_category_breadcrumb}
end
local parents = {bare_category_parent}
if addl_bare_category_parents then
m_table.extend(parents, addl_bare_category_parents)
end
return {
type = "chủ đề thuộc nhóm tên gọi",
topic = canon_label,
description = "{{{langname}}} " .. ptdesc .. ".",
breadcrumb = bare_category_breadcrumb,
parents = parents,
}
elseif ptdesc == false then
mw.log(("Display form for canon_label %s is false, can't categorize"):format(dump(canon_label)))
end
end
end)
local function fetch_primary_placetype(key, spec)
local placetype = spec.placetype
if type(placetype) == "table" then
placetype = placetype[1]
end
if not placetype then
internal_error("No placetype specified or defaulted for key %s, spec %s", key, spec)
end
return placetype
end
--[==[
Construct an appropriately linked location based on the full or elliptical placename, preceded by `"the "`` if
appropriate. Specifically:
Fetch the full and elliptical_placenames. If they are the same, just link to the placename directly. Otherwise, check if
the full placename exists; if so link to it. Otherwise, if the elliptical placename exists, link to it but display it as
the full placename. Finally, if neither full placename nor elliptical placename exists, fall back to linking to the full
placename. That way, we prefer full placenames to elliptical placenames if both or neither exist as Wiktionary entries,
but if only one exists, we link to that one rather than have a red link.
]==]
local function construct_linked_location(group, key, spec)
local full_placename, elliptical_placename = m_locations.key_to_placename(group, key)
local linked_placename
if elliptical_placename ~= full_placename then
local full_placename_title = mw.title.new(full_placename)
if full_placename_title and full_placename_title.exists then
linked_placename = m_locations.construct_linked_placename(spec, full_placename)
else
local elliptical_placename_title = mw.title.new(elliptical_placename)
if elliptical_placename_title and elliptical_placename_title.exists then
linked_placename = m_locations.construct_linked_placename(spec, elliptical_placename, full_placename)
end
end
end
return linked_placename or m_locations.construct_linked_placename(spec, full_placename)
end
--[==[
Construct the description of a location, including its container trail either to the end or until we encounter a
`no_include_container_in_desc` setting. For example, for the city of [[Birmingham]], the description will read
`"[[Birmingham]], a [[city]] in the [[West Midlands]] (which is a [[county]] of [[England]], which is a
[[constituent country]] of the [[United Kingdom]], which is a [[country]] in [[Europe]])"`. FIXME: Possibly we should
adopt the way city descriptions used to read, which was similar to `"the city of [[Birmingham]], in the county of the
[[West Midlands]], in the [[constituent country]] of [[England]], in the [[country]] of the [[United Kingdom]], in
[[Europe]]"`.
]==]
local function construct_location_desc(group, key, spec)
local parts = {}
local function ins(txt)
insert(parts, txt)
end
ins(construct_linked_location(group, key, spec))
local iteration = 0
local need_closing_paren = false
local containers = {{group = group, key = key, spec = spec}}
local container_iterator = m_locations.iterate_containers(group, key, spec)
while true do
iteration = iteration + 1
local include_container_in_desc = false
for _, container in ipairs(containers) do
if not container.spec.no_include_container_in_desc then
include_container_in_desc = true
break
end
end
if not include_container_in_desc then
break
end
local next_containers = container_iterator()
if not next_containers then
break
end
local is_former = nil
for _, container in ipairs(containers) do
local this_is_former = container.spec.is_former_place
if is_former == nil then
is_former = this_is_former
elseif is_former ~= this_is_former then
internal_error("When processing container trail of key %s, found a mixture of former and non-former " ..
"containers: %s", key, containers)
end
end
if #containers > 1 then
local placetypes = {}
local prepositions = {}
for _, container in ipairs(containers) do
local container_type = fetch_primary_placetype(container.key, container.spec)
m_table.insertIfNot(placetypes, m_placetypes.pluralize_placetype(container_type))
m_table.insertIfNot(prepositions, m_placetypes.get_placetype_entry_preposition(container_type))
end
if iteration == 1 then
ins(", ")
elseif iteration == 2 then
ins(" (which are ")
need_closing_paren = true
else
ins(", which are ")
end
if is_former then
ins("former ")
end
ins(m_table.serialCommaJoin(placetypes))
ins(" ")
ins(concat(prepositions, "/"))
else
if iteration == 1 then
ins(", ")
elseif iteration == 2 then
ins(" (which is ")
need_closing_paren = true
else
ins(", which is ")
end
local container_type = fetch_primary_placetype(containers[1].key, containers[1].spec)
if is_former then
ins("a former ")
else
ins(m_placetypes.get_placetype_article(container_type))
ins(" ")
end
ins(container_type)
ins(" ")
ins(m_placetypes.get_placetype_entry_preposition(container_type))
end
ins(" ")
first_container = false
containers = next_containers
local container_locations = {}
for _, container in ipairs(containers) do
insert(container_locations, construct_linked_location(container.group, container.key,
container.spec))
end
ins(m_table.serialCommaJoin(container_locations))
end
if need_closing_paren then
ins(")")
end
return concat(parts)
end
-- Fetch or construct the description of the location specified by `key`. If the `keydesc` property is specified,
-- use it directly but substitute any occurrence of `+++` with the auto-constructed location description, which
-- mentions the placename corresponding to the key, its placetype and container, and repeats the description up
-- the container trail until either there are no more containers or (more usually) the `no_include_container_in_desc`
-- setting is found (which is set on all continents and continent-level regions).
local function fetch_or_construct_location_desc(group, key, spec)
local val = spec.keydesc
if is_callable(val) then
val = val(group, key, spec)
spec.keydesc = val
end
val = val or "+++"
if val:find("%+%+%+") then
val = gsub_literally(val, "+++", construct_location_desc(group, key, spec))
end
return val
end
local function normalize_cat_as(cat_as, div)
if type(cat_as) ~= "table" or cat_as.type then
cat_as = {cat_as}
end
local ret_cat_as = {}
for _, pt_cat_as in ipairs(cat_as) do
if type(pt_cat_as) == "string" then
pt_cat_as = {type = pt_cat_as}
end
insert(ret_cat_as, {type = pt_cat_as.type, prep = pt_cat_as.prep or div.prep or "của"})
end
return ret_cat_as
end
-- Find the specified plural placetype among the divs for a given known location. Return a list of cat_as specs, where
-- each spec is of the form {type = "PLURAL_PLACETYPE", prep = "PREP"} indicating the plural placetype to use when
-- categorizing and the preposition to follow.
local function find_placetype_cat_as(divs, pl_placetype)
if divs then
if type(divs) ~= "table" then
divs = {divs}
end
for _, div in ipairs(divs) do
if type(div) == "string" then
div = {type = div}
end
if div.type == pl_placetype then
local cat_as = div.cat_as or div.type
return normalize_cat_as(cat_as, div)
end
end
end
return nil
end
-- Handler for bare placename categories for known locations in `locations` in [[Module:place/locations]].
insert(handlers, function(label)
for _, canon_label in ipairs { label, lcfirst(label) } do
local group, spec = m_locations.find_canonical_key(canon_label)
if group then
-- wp= defaults to true (Wikipedia article matches location's full placename)
local wp = spec.wp
if wp == nil then
wp = true
end
-- wpcat= defaults to wp= (if Wikipedia article has its own name, Wikipedia category and Commons category
-- generally follow)
local wpcat = spec.wpcat
if wpcat == nil then
wpcat = wp
end
-- commonscat= defaults to wpcat= (if Wikipedia category has its own name, Commons category generally
-- follows)
local commonscat = spec.commonscat
if commonscat == nil then
commonscat = wpcat
end
local parents = {}
local bare_label_parents = spec.overriding_bare_label_parents
local container_iterator = m_locations.iterate_containers(group, canon_label, spec)
local containers = container_iterator()
if not bare_label_parents then
bare_label_parents = {"+++"}
end
local full_location_placename, elliptical_location_placename = m_locations.key_to_placename(group, canon_label)
local full_container_placename
if containers then
full_container_placename, _ = m_locations.key_to_placename(containers[1].group, containers[1].key)
end
local inserted_containers = false
for _, parent in ipairs(bare_label_parents) do
if parent == "+++" then
parent = "PL_PLACETYPE PREP CONTAINER"
end
if parent:find("CONTAINER") then
if not containers then
internal_error("Parent category %s needs the container of %s but no containers specified: %s",
parent, canon_label, spec)
end
local location_type = fetch_primary_placetype(canon_label, spec)
local pl_location_type = m_placetypes.pluralize_placetype(location_type)
for _, container in ipairs(containers) do
local per_container_parent = parent
local cat_as_list
if per_container_parent:find("PL_PLACETYPE") then
if spec.bare_category_parent_type then
cat_as_list = normalize_cat_as(spec.bare_category_parent_type, spec)
else
cat_as_list = find_placetype_cat_as(container.spec.divs, pl_location_type) or
find_placetype_cat_as(container.spec.addl_divs, pl_location_type)
end
end
if not cat_as_list then
local canon_placetype, ptdata, ptmatch = m_placetypes.get_placetype_data(location_type, "from category")
if not canon_placetype or not (ptdata.generic_before_non_cities or ptdata.generic_before_cities) then
internal_error("Unable to locate plural location type %s among the divs or addl_divs " ..
"for container key %s spec %s, and the location type is either not in placetype_data or " ..
"not identified as a generic placetype", pl_location_type, container.key, container.spec)
end
cat_as_list = {{type = pl_location_type, prep =
m_placetypes.get_placetype_entry_preposition(location_type)}}
end
local prefixed_key = m_placetypes.get_prefixed_key(container.key, container.spec)
per_container_parent = gsub_literally(per_container_parent, "CONTAINER", prefixed_key)
for _, cat_as in ipairs(cat_as_list) do
local per_container_per_placetype_parent = per_container_parent
per_container_per_placetype_parent = gsub_literally(per_container_per_placetype_parent, "PL_PLACETYPE",
cat_as.type)
per_container_per_placetype_parent = gsub_literally(per_container_per_placetype_parent, "PREP",
cat_as.prep)
m_table.insertIfNot(parents, per_container_per_placetype_parent)
end
end
inserted_containers = true
else
m_table.insertIfNot(parents, parent)
end
end
if not inserted_containers and containers then
-- If we didn't insert the containers above in some form, insert them now as bare categories. Note that
-- this may be different categories from the container categories inserted above.
for _, container in ipairs(containers) do
m_table.insertIfNot(parents, container.key)
end
end
if spec.addl_parents then
for _, parent in ipairs(spec.addl_parents) do
m_table.insertIfNot(parents, parent)
end
end
local function format_boxval(val, specname)
if val == true then
val = "%l"
end
if type(val) == "string" then
val = gsub_literally(val, "%l", full_location_placename)
val = gsub_literally(val, "%e", elliptical_location_placename)
if val:find("%%c") then
if not full_container_placename then
internal_error("Wikipedia/Commons spec %s = %s has %%c in it but key %s has no " ..
"containers: %s", specname, val, canon_label, spec)
end
val = gsub_literally(val, "%c", full_container_placename)
end
end
return val
end
local description = spec.fulldesc or (
"{{{langname}}} terms related to the people, culture, or territory of " ..
fetch_or_construct_location_desc(group, canon_label, spec) .. ".")
local full_placename, _ = m_locations.key_to_placename(group, canon_label)
return {
type = "chủ đề",
description = description,
breadcrumb = full_placename,
parents = parents,
wp = format_boxval(wp, "wp"),
wpcat = format_boxval(wpcat, "wpcat"),
commonscat = format_boxval(commonscat, "commonscat"),
}
end
end
end)
local function find_canonical_key_from_place(place, canon_label)
local has_the = false
local key
if place:find("^ ") then
key = place:gsub("^ ", "")
has_the = true
else
key = place
end
local group, spec = m_locations.find_canonical_key(key)
if group then
local requires_the = spec.the or false
if has_the ~= requires_the then
if has_the then
mw.log(("Mismatch in category name '%s', has 'the' in the category when it should not"):format(
canon_label))
else
mw.log(("Mismatch in category name '%s', should have 'the' in the category but does not"):
format(canon_label))
end
return nil
end
return group, key, spec
end
return nil
end
-- Handler for generic placetypes (those whose categories are added through category generation handlers or through
-- explicit category specs in the placetype data) for known locations in [[Module:place/locations]]. All such
-- placetypes have either a `generic_before_non_cities` setting (meaning they can occur before non-city locations) or
-- `generic_before_cities` setting (meaning they can occur before cities), or both. Examples of such categories are
-- "cities in the Bahamas" or "rivers in Western Australia, Australia", or (for city locations)
-- "neighbourhoods of Hong Kong" or "places in Melbourne".
insert(handlers, function(label)
for _, canon_label in ipairs { lcfirst(label), label } do
local placetype, in_of, place = canon_label:match("^([A-Za-z%- ]-) (của) (.*)$")
if not placetype then
placetype, in_of, place = canon_label:match("^([A-Za-z%- ]-) (của) (.*)$")
end
if placetype then
local normalized_placetype = placetype == "neighbourhoods" and "neighborhoods" or placetype
local canon_placetype, ptdata, ptmatch = m_placetypes.get_placetype_data(normalized_placetype, "from category")
if canon_placetype and (ptdata.generic_before_non_cities or ptdata.generic_before_cities) then
local group, key, spec = find_canonical_key_from_place(place, canon_label)
if group then
-- Check whether the location uses British spelling, but also check all containers, because
-- it's too hard to keep in sync the `british_spelling` setting for locations at all different
-- levels (e.g. cities of various countries, first and second level administrative division, etc.),
-- so we just set it at top level on the country.
local uses_british_spelling = spec.british_spelling
if uses_british_spelling == nil then
for containers in m_locations.iterate_containers(group, key, spec) do
local must_outer_break = false
for _, container in ipairs(containers) do
if container.spec.british_spelling ~= nil then
uses_british_spelling = container.spec.british_spelling
must_outer_break = true
break
end
end
if must_outer_break then
break
end
end
end
local allow_cat = true
if placetype == "neighborhoods" and uses_british_spelling or
placetype == "neighbourhoods" and not uses_british_spelling then
mw.log(("Mismatch in spelling of placetype '%s' in category '%s', should be '%s'"):format(
placetype, canon_label, uses_british_spelling and "neighbourhoods" or "neighborhoods"))
allow_cat = false
end
if spec.is_former_place and placetype ~= "địa danh" then
allow_cat = false
end
local expected_prep
if spec.is_city then
expected_prep = ptdata.generic_before_cities
else
expected_prep = ptdata.generic_before_non_cities
end
if not expected_prep then
allow_cat = false
end
if allow_cat then
if expected_prep ~= in_of then
mw.log(("Mismatch in category name '%s', has '%s' when it should have '%s'"):format(
canon_label, in_of, expected_prep))
return nil
end
local linkdesc = m_placetypes.get_placetype_display_form(placetype,
spec.is_city and "city" or "noncity", "return full")
if linkdesc == false then
mw.log(("Display form for placetype %s is false, can't categorize"):format(dump(placetype)))
return nil
end
if not linkdesc then
internal_error("Unrecognized placetype %s when processing key %s, data %s, label %s",
placetype, key, spec, canon_label)
end
desc = linkdesc .. " " .. in_of .. " " .. fetch_or_construct_location_desc(group, key, spec)
desc = "{{{langname}}} " .. desc .. "."
local parents = {}
insert(parents, key)
if spec.no_container_parent then
-- top-level country, constituent country, continent or the like
insert(parents, {name = normalized_placetype, sort = key})
if spec.placetype == "quốc gia" or m_table.contains(spec.placetype, "quốc gia") then
local category_class = m_placetypes.get_equiv_placetype_prop(normalized_placetype,
function(pt) return m_placetypes.get_placetype_prop(pt, "class") end, {
from_category = true,
no_split_qualifiers = true,
})
if not category_class then
internal_error("Saw placetype %s that is either unknown or has no `class` " ..
"setting in `placetype_data`", normalized_placetype)
end
if class_is_political_division[category_class] == nil then
internal_error("Saw unknown category class %s derived from placetype %s",
category_class, normalized_placetype)
end
if class_is_political_division[category_class] then
insert(parents, "đơn vị hành chính theo quốc gia cụ thể")
end
end
else
local container_iterator = m_locations.iterate_containers(group, key, spec)
local next_containers = container_iterator()
if next_containers then
for _, container in ipairs(next_containers) do
local container_prep
if container.spec.is_city then
container_prep = ptdata.generic_before_cities
else
container_prep = ptdata.generic_before_non_cities
end
if not container_prep then
internal_error("For container key %s spec %s defines is_city = %s but " ..
"there is no corresponding `generic_before_*` setting in the " ..
"placedata for placetype %s", container.key, container.spec,
container.spec.is_city, placetype)
end
insert(parents, {
name = placetype .. " " .. container_prep .. " " .. m_placetypes.get_prefixed_key(
container.key, container.spec),
sort = key
})
end
else
-- unrecognized countries or the like
insert(parents, {name = normalized_placetype, sort = key})
end
end
return {
type = "chủ đề thuộc nhóm tên gọi",
topic = canon_label,
description = desc,
breadcrumb = placetype,
parents = parents,
}
end
end
end
end
end
end)
-- Handler for "state capitals of the United States", "provincial capitals of Canada", etc. This must precede the next
-- handler for specific political and misc (non-political) divisions of polities and subpolities, such as
-- "provinces of the Philippines", because "departmental capitals" is listed in cat_as for French prefectures and so
-- will trigger an error if that handler runs before this one.
insert(handlers, function(label)
label = lcfirst(label)
local capital_cat, place = label:match("^([a-z%- ]- capitals) of (.*)$")
-- Make sure we recognize the type of capital.
if place and capital_cat_to_placetype[capital_cat] then
local placetype = capital_cat_to_placetype[capital_cat]
local pl_placetype = m_placetypes.pluralize_placetype(placetype)
-- Locate the container, fetch its known political divisions, and make sure the placetype corresponding to the
-- type of capital is among the list.
local group, key, spec = find_canonical_key_from_place(place, canon_label)
if group and (spec.divs or spec.addl_divs) then
local saw_match = false
local variant_matches = {}
local divlists = {}
if spec.divs then
insert(divlists, spec.divs)
end
if spec.addl_divs then
insert(divlists, spec.addl_divs)
end
for _, divlist in ipairs(divlists) do
if type(divlist) ~= "table" then
divlist = {divlist}
end
for _, div in ipairs(divlist) do
if type(div) == "string" then
div = {type = div}
end
-- HACK. Currently if we don't find a match for the placetype, we map e.g. 'autonomous region'
-- -> 'regional capitals' and 'union territory' -> 'territorial capitals'. When encountering a
-- political division like 'autonomous region' or 'union territory', chop off everything up
-- through a space to make things match. To make this clearer, we record all such
-- "variant match" cases, and down below we insert a note into the category text indicating that
-- such "variant matches" are included among the category.
if pl_placetype == div.type or pl_placetype == div.type:gsub("^.* ", "") then
saw_match = true
if pl_placetype ~= div.type then
insert(variant_matches, div.type)
end
end
end
end
if saw_match then
-- Everything checks out, construct the category description.
local placetype_desc = m_placetypes.get_placetype_display_form(pl_placetype,
placetype.is_city and "city" or "noncity")
if placetype_desc == false then
mw.log(("Display form for pl_placetype %s is false, can't categorize"):format(dump(pl_placetype)))
return nil
end
if not placetype_desc then
internal_error("Unrecognized plural placetype %s, generated as the plural of %s, which " ..
"was found as the placetype of capital placetype %s in label %s", pl_placetype,
placetype, capital_cat, label)
end
local variant_match_text = ""
if variant_matches[1] then
local real_variant_match_descs = {}
for i, variant_match in ipairs(variant_matches) do
local variant_match_desc = m_placetypes.get_placetype_display_form(variant_match,
placetype.is_city and "city" or "noncity")
if variant_match_desc == nil then
internal_error("Unrecognized variant match plural placetype %s, coming from " ..
"place key %s, data %s in label %s", variant_match, key, spec, label)
end
if variant_match_desc then
-- skip those for which the description is `false`, like `ABBREVIATION_OF states`
-- in the United States divs.
insert(real_variant_match_descs, variant_match_desc)
end
end
if real_variant_match_descs[1] then
variant_match_text = " (bao gồm " .. m_table.serialCommaJoin(real_variant_match_descs)
.. ")"
end
end
local desc = "Tên gọi {{{langname}}} về thủ đô của " .. placetype_desc .. variant_match_text ..
" trong " .. fetch_or_construct_location_desc(group, key, spec) .. "."
local full_placename, _ = m_locations.key_to_placename(group, key)
local parents = {}
if spec.no_container_parent then
-- top-level country, constituent country, continent or the like
insert(parents, {name = capital_cat, sort = key})
else
local container_iterator = m_locations.iterate_containers(group, key, spec)
local next_containers = container_iterator()
if next_containers then
for _, container in ipairs(next_containers) do
insert(parents, {
name = capital_cat .. " của " .. m_placetypes.get_prefixed_key(
container.key, container.spec),
sort = key
})
end
else
-- unrecognized countries or the like
insert(parents, {name = capital_cat, sort = key})
end
end
insert(parents, key)
return {
type = "chủ đề thuộc nhóm tên gọi",
topic = label,
description = desc,
breadcrumb = full_placename,
parents = parents,
}
end
end
end
end)
local overriding_category_descriptions = {
["autonomous cities of Spain"] = "the [[w:Autonomous communities of Spain#Autonomous_cities|autonomous cities of Spain]]",
["regions of Greece"] = "the regions ([[periphery|peripheries]]) of [[Greece]]",
["regions of North Macedonia"] = "the regions ([[periphery|peripheries]]) of [[North Macedonia]]",
["subprefectures of Japan"] = "[[subprefecture]]s of [[Japan]]ese [[prefecture]]s",
}
-- Handler for specific political and misc (non-political) divisions of locations (polities, subpolities, cities, etc.),
-- such as "provinces of the Philippines", "counties of Wales", "municipalities of Tocantins, Brazil",
-- "boroughs of New York City", etc. This does not handle categories for generic placetypes (cities, rivers, etc.) of
-- locations, which are handled by different handlers above.
insert(handlers, function(label)
-- The label comes with an initial capitalization but we have to check both lowercase-initial and capital-initial
-- versions of the placetype to handle e.g. [[:Category:en:Indian reserves of Canada]].
for _, canon_label in ipairs { label, lcfirst(label) } do
for _, minimal_placetype in ipairs { true, false } do
local match_quantifier = minimal_placetype and "-" or "+"
-- Some categories have two "of"s in them, and depending on the category, it's correct to do either a greedy
-- ([[:Category:en:Abbreviations of states of the United States]], with placetype `abbreviations of states`)
-- or non-greedy ([[:Category:en:Provinces of the Democratic Republic of the Congo]], with placetype
-- `provinces`) match. We can't know in advance which is correct so we try both possibilities, doing the
-- non-greedy one first as it seems more common (there are many locations with "of" in them, but currently
-- only `abbreviations of states` occurs with a following location).
local placetype, in_of, place = canon_label:match("^([A-Za-z%- ]" .. match_quantifier .. ") (của) (.*)$")
if not placetype then
placetype, in_of, place = canon_label:match("^([A-Za-z%- ]" .. match_quantifier .. ") (ở) (.*)$")
end
if placetype then
local group, key, spec = find_canonical_key_from_place(place, canon_label)
if group then
local function find_placetype(divs)
if divs then
if type(divs) ~= "table" then
divs = {divs}
end
for _, div in ipairs(divs) do
if type(div) == "string" then
div = {type = div}
end
local cat_as = div.cat_as or div.type
if type(cat_as) ~= "table" then
cat_as = {cat_as}
end
for _, pt_cat_as in ipairs(cat_as) do
if type(pt_cat_as) == "string" then
pt_cat_as = {type = pt_cat_as}
end
if placetype == pt_cat_as.type then
local div_parent = pt_cat_as.container_parent_type
if div_parent == nil then -- allow false
div_parent = div.container_parent_type
end
if div_parent == nil then
div_parent = placetype
end
return div_parent, pt_cat_as.prep or div.prep or "của"
end
end
end
end
return nil
end
local div_parent, div_prep = find_placetype(spec.divs)
if div_parent == nil then -- allow false
div_parent, div_prep = find_placetype(spec.addl_divs)
end
if div_parent == nil then -- allow false
div_parent, div_prep = find_placetype(spec.addl_divs_for_categorization)
end
if div_parent ~= nil then
if div_prep ~= in_of then
mw.log(("Mismatch in category name '%s', has '%s' when it should have '%s'"):format(
canon_label, in_of, div_prep))
return nil
end
local linkdesc = m_placetypes.get_placetype_display_form(placetype, spec.is_city and "city" or "noncity",
"return full")
if linkdesc == false then
mw.log(("Display form for placetype %s is false, can't categorize"):format(dump(placetype)))
return nil
end
if not linkdesc then
internal_error("Unrecognized placetype %s when processing key %s, data %s, label %s",
placetype, key, spec, canon_label)
end
local desc = overriding_category_descriptions[canon_label]
if not desc then
desc = linkdesc .. " " .. in_of .. " " .. fetch_or_construct_location_desc(group, key, spec)
end
desc = desc .. " {{{langname}}}."
local parents = {}
insert(parents, key)
if div_parent then -- div_parent may be `false`
if spec.no_container_parent then
-- top-level country, constituent country, continent or the like
insert(parents, {name = placetype, sort = " " .. key})
if spec.placetype == "quốc gia" or m_table.contains(spec.placetype, "quốc gia") then
insert(parents, "đơn vị hành chính theo quốc gia cụ thể")
end
else
local container_iterator = m_locations.iterate_containers(group, key, spec)
local next_containers = container_iterator()
if next_containers then
for _, container in ipairs(next_containers) do
insert(parents, {
name = div_parent .. " " .. in_of .. " " .. m_placetypes.get_prefixed_key(
container.key, container.spec),
sort = key
})
end
else
-- unrecognized countries or the like
insert(parents, {name = placetype, sort = " " .. key})
end
end
end
return {
type = "chủ đề thuộc nhóm tên gọi",
topic = canon_label,
description = desc,
breadcrumb = placetype,
parents = parents,
}
end
end
end
end
end
end)
labels["ngoại danh"] = {
type = "chủ đề thuộc nhóm tên gọi",
-- special-cased description
description = "{{{langname}}} [[exonym]]s.",
parents = {"địa danh"},
}
labels["đơn vị hành chính theo quốc gia cụ thể"] = {
type = "chủ đề phân nhóm",
description = "{{{langname}}} categories for political divisions of specific countries.",
parents = {"địa danh"},
}
-- Misc. FIXME: Remove the need for this.
labels["nomes of Ancient Egypt"] = {
type = "chủ đề thuộc nhóm tên gọi",
-- special-cased description
description = "{{{langname}}} names of the [[nome]]s of [[Ancient Egypt]].",
breadcrumb = "nomes",
parents = {"Ancient Egypt"},
}
-- Sui generis place categories (mostly cross-jurisdictional subcontinental/transcontinental regions)
-- FIXME: Everything here has been moved from [[Module:category tree/topic/Earth]]. Most should be removed.
labels["Atlantic Ocean"] = {
type = "related-to",
description = "default with the",
parents = {"Earth"},
}
labels["British Isles"] = {
type = "related-to",
description = "=the people, culture, or territory of [[Great Britain]], [[Ireland]], and other nearby islands",
parents = {"Europe", "islands"},
}
labels["European Union"] = {
type = "related-to",
description = "default with the",
parents = {"Europe"},
}
labels["Gascony"] = {
type = "related-to",
description = "default",
parents = {"Occitania, France"},
}
labels["Indian subcontinent"] = {
type = "related-to",
description = "default with the",
parents = {"South Asia"},
}
labels["Bengal"] = {
type = "related-to",
description = "{{{langname}}} terms related to the people, culture, or territory of [[Bengal]].",
parents = {"Indian subcontinent"},
}
labels["Kashmir"] = {
type = "related-to",
description = "{{{langname}}} terms related to the people, culture, or territory of [[Kashmir]].",
parents = {"Indian subcontinent"},
}
labels["Kashmir, India"] = {
type = "related-to",
description = "{{{langname}}} names of places in {{w|Kashmir, India}}.",
parents = {"India", "Kashmir"},
}
labels["Korea"] = {
type = "related-to",
description = "=the people, culture, or territory of [[Korea]]",
parents = {"Asia"},
}
labels["Languedoc"] = {
type = "related-to",
description = "default",
parents = {"Occitania, France"},
}
labels["Lapland"] = {
type = "related-to",
description = "=[[Lapland]], a region in northernmost Europe",
parents = {"Europe", "Finland", "Norway", "Russia", "Sweden"},
}
labels["Middle East"] = {
type = "related-to",
description = "default with the",
parents = {"Africa", "Asia"},
}
labels["Netherlands Antilles"] = {
type = "related-to",
description = "=the people, culture, or territory of the [[Netherlands Antilles]]",
parents = {"Netherlands", "North America"},
}
labels["Overseas France"] = {
type = "related-to",
description = "={{w|Overseas France}} ({{m|fr||France d'outre-mer}})",
parents = {"France"},
}
labels["Provence"] = {
type = "related-to",
description = "default",
parents = {"Provence-Alpes-Côte d'Azur, France"},
}
labels["Polish People's Republic"] = {
type = "related-to",
description = "default",
parents = {"Poland"},
}
labels["South Asia"] = {
type = "related-to",
description = "default",
parents = {"Eurasia", "Asia"},
}
labels["quốc gia của châu Á"] = {
type = "chủ đề thuộc nhóm tên gọi",
description = "default",
breadcrumb = "Quốc gia",
parents = {"Châu Á", "Quốc gia"},
}
labels["quốc gia của châu Âu"] = {
type = "chủ đề thuộc nhóm tên gọi",
description = "default",
breadcrumb = "Quốc gia",
parents = {"Châu Âu", "Quốc gia"},
}
labels["quốc gia của châu Phi"] = {
type = "chủ đề thuộc nhóm tên gọi",
description = "default",
breadcrumb = "Quốc gia",
parents = {"Châu Phi", "Quốc gia"},
}
return {LABELS = labels, HANDLERS = handlers}
bksup0ofe6p84dr0we5x1fj36u0lgz5
Wiktionary:Twinkle
4
337207
2353370
2285380
2026-05-15T01:34:36Z
Kateru Zakuro
34522
2353370
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
[[Hình:Ảnh chụp màn hình Twinkle.jpg|thumb|Ảnh chụp màn hình tính năng yêu cầu khoá trang của Twinkle]]
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn
</syntaxhighlight>
<!--;Cài đặt thuộc tính Twinkle: Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được. KHÔNG ỔN ĐỊNH, ẨN -->
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: Như đã nói ở đầu trang, đây là một phiên bản ''không ổn định nhưng đủ dùng''. Bạn '''CHỈ NÊN''' sử dụng các chức năng ổn định được liệt kê ở trên. Tôi sẽ không hỗ trợ khi bạn gặp lỗi khi sử dụng chức năng khác.
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
p1ol8lx18d40509gvp9l1xbvwfgej2t
2353372
2353370
2026-05-15T01:35:47Z
Kateru Zakuro
34522
2353372
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
[[Hình:Ảnh chụp màn hình Twinkle.jpg|thumb|Ảnh chụp màn hình tính năng yêu cầu khoá trang của Twinkle]]
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn,
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: Như đã nói ở đầu trang, đây là một phiên bản ''không ổn định nhưng đủ dùng''. Bạn '''CHỈ NÊN''' sử dụng các chức năng ổn định được liệt kê ở trên. Tôi sẽ không hỗ trợ khi bạn gặp lỗi khi sử dụng chức năng khác.
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
9hikcfnesjchnar3seps908dmpc98o4
2353375
2353372
2026-05-15T01:37:20Z
Kateru Zakuro
34522
2353375
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
[[Hình:Ảnh chụp màn hình Twinkle.jpg|thumb|Ảnh chụp màn hình tính năng yêu cầu khoá trang của Twinkle]]
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn, bạn chỉ cần đánh dấu vào ô "Twinkle" trong mục "Tuỳ chọn", thẻ "Tiện ích" trong mục [[Special:Preferences#mw-prefsection-gadgets|'''Tuỳ chọn''']]. (Nhớ nhấn nút "Lưu tuỳ chọn" ở dưới cùng của trang!) Sau khi cài đặt, bạn phải chắc rằng [[WP:BYPASS|đã làm sạch bộ nhớ đệm của trình duyệt]] bằng "Shift+F5".
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: Như đã nói ở đầu trang, đây là một phiên bản ''không ổn định nhưng đủ dùng''. Bạn '''CHỈ NÊN''' sử dụng các chức năng ổn định được liệt kê ở trên. Tôi sẽ không hỗ trợ khi bạn gặp lỗi khi sử dụng chức năng khác.
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
7qsayj5vo1j1zejziqafe3ho4atk1ae
2353377
2353375
2026-05-15T01:37:54Z
Kateru Zakuro
34522
2353377
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
[[Hình:Ảnh chụp màn hình Twinkle.jpg|thumb|Ảnh chụp màn hình tính năng yêu cầu khoá trang của Twinkle]]
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn, bạn chỉ cần đánh dấu vào ô "Twinkle" trong mục "Tuỳ chọn", thẻ "Tiện ích" trong mục [[Special:Preferences#mw-prefsection-gadgets|'''Tuỳ chọn''']]. (Nhớ nhấn nút "Lưu tuỳ chọn" ở dưới cùng của trang!) Sau khi cài đặt, bạn phải chắc rằng [[WP:BYPASS|đã làm sạch bộ nhớ đệm của trình duyệt]] bằng "Shift+F5".
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: Như đã nói ở đầu trang, đây là một phiên bản ''không ổn định nhưng đủ dùng''. Bạn '''CHỈ NÊN''' sử dụng các chức năng ổn định được liệt kê ở trên. Tôi sẽ không hỗ trợ khi bạn gặp lỗi khi sử dụng chức năng khác.
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
ross1ehyiytyaqaml8fz4zzft3fdcqi
2353380
2353377
2026-05-15T01:38:52Z
Kateru Zakuro
34522
2353380
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
[[Hình:Ảnh chụp màn hình Twinkle.jpg|thumb|Ảnh chụp màn hình tính năng yêu cầu khoá trang của Twinkle]]
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn, bạn chỉ cần đánh dấu vào ô "Twinkle" trong mục "Tuỳ chọn", thẻ "Tiện ích" trong mục [[Special:Preferences#mw-prefsection-gadgets|'''Tuỳ chọn''']]. (Nhớ nhấn nút "Lưu tuỳ chọn" ở dưới cùng của trang!) Sau khi cài đặt, bạn phải chắc rằng [[w:Trợ giúp:Xóa bộ nhớ đệm|đã làm sạch bộ nhớ đệm của trình duyệt]] bằng "Shift+F5".
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: Như đã nói ở đầu trang, đây là một phiên bản ''không ổn định nhưng đủ dùng''. Bạn '''CHỈ NÊN''' sử dụng các chức năng ổn định được liệt kê ở trên. Tôi sẽ không hỗ trợ khi bạn gặp lỗi khi sử dụng chức năng khác.
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
0iwfkfn1b5dly0tgxwu51uarvgs5mpp
2353386
2353380
2026-05-15T01:40:59Z
Kateru Zakuro
34522
2353386
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
{{shortcut|WT:TW}}
[[File:Police man Twinkle Head.svg|100px|right|]]
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn, bạn chỉ cần đánh dấu vào ô "Twinkle" trong mục "Tuỳ chọn", thẻ "Tiện ích" trong mục [[Special:Preferences#mw-prefsection-gadgets|'''Tuỳ chọn''']]. (Nhớ nhấn nút "Lưu tuỳ chọn" ở dưới cùng của trang!) Sau khi cài đặt, bạn phải chắc rằng [[w:Trợ giúp:Xóa bộ nhớ đệm|đã làm sạch bộ nhớ đệm của trình duyệt]] bằng "Shift+F5".
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: Như đã nói ở đầu trang, đây là một phiên bản ''không ổn định nhưng đủ dùng''. Bạn '''CHỈ NÊN''' sử dụng các chức năng ổn định được liệt kê ở trên. Tôi sẽ không hỗ trợ khi bạn gặp lỗi khi sử dụng chức năng khác.
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
glwxd7ce5lx8rnfciem8p5l5me6v19h
2353391
2353386
2026-05-15T01:42:36Z
Kateru Zakuro
34522
2353391
wikitext
text/x-wiki
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
{{shortcut|WT:TW}}
[[File:Police man Twinkle Head.svg|100px|right|]]
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn, bạn chỉ cần đánh dấu vào ô "Twinkle" trong mục "Tuỳ chọn", thẻ "Tiện ích" trong mục [[Special:Preferences#mw-prefsection-gadgets|'''Tuỳ chọn''']]. (Nhớ nhấn nút "Lưu tuỳ chọn" ở dưới cùng của trang!) Sau khi cài đặt, bạn phải chắc rằng [[w:Trợ giúp:Xóa bộ nhớ đệm|đã làm sạch bộ nhớ đệm của trình duyệt]] bằng "Shift+F5".
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
<!--;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: -->
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
722hycatc4jwdmjdlurq32xxyvusv6w
2353392
2353391
2026-05-15T01:43:50Z
Kateru Zakuro
34522
2353392
wikitext
text/x-wiki
{{Trang thông tin|shortcut=WT:TW}}
{{Mbox|type=speedy|image=[[File:OOjs UI icon alert-destructive.svg|40px]]|text='''Cảnh báo: Bạn chịu hoàn toàn trách nhiệm với các tác vụ bạn thực hiện''' khi sử dụng công cụ Twinkle. Bạn phải '''hiểu rõ [[Wiktionary:Quy định và hướng dẫn|các quy định của Wiktionary]]''' và tuân thủ theo đúng các quy định đó khi sử dụng công cụ này, nếu không, bạn có thể sẽ mất quyền truy cập vào công cụ hoặc tệ hơn là bị [[Wiktionary:Quy định cấm thành viên|'''cấm sửa đổi''']]}}
[[File:Police man Twinkle Head.svg|100px|right|]]
'''Twinkle''' là một bộ các chương trình [[JavaScript]] cho phép các thành viên có tài khoản có thể sử dụng một số tuỳ chọn để hỗ trợ thực hiện các tác vụ thông thường trong việc bảo quản Wikipedia, và cũng giúp chống lại các hành vi [[Wiktionary:Phá hoại|phá hoại]]. Công cụ này hỗ trợ 3 kiểu lùi sửa và bao gồm đầy đủ các hàm đề nghị xoá nhanh, cảnh báo thành viên và hoan nghênh thành viên mới, đặt biển bảo trì, báo cáo phá hoại bán tự động và một số tính năng khác.
Phiên bản Twinkle trên Wiktionary tiếng Việt do thành viên [[User:Kateru Zakuro|Kateru Zakuro]] nhập từ phiên bản Wikipedia tiếng Anh về và cấu hình lại cho phù hợp với dự án (tuy nhiên, nó ''không đầy đủ'' như Twinkle của Wikipedia tiếng Việt). Để sử dụng, bạn cần phải có quyền thành viên tự xác nhận.
Twinkle do [[:w:en:User:AzaToth|AzaToth]] phát triển từ script lùi sửa dựa theo các ý tưởng trong bộ sưu tập các script của [[:w:en:User:Aaron Schulz|Aaron Schulz]]. Nó đã phát triển nhanh chóng thành một công cụ với nhiều ứng dụng hơn các phiên bản ban đầu và được hàng ngàn thành viên Wikipedia sử dụng trong nhiều phiên bản ngôn ngữ.
Các công cụ trong bộ này bao gồm "Friendly" trước đây do [[:w:en:User:Ioeth|Ioeth]] phát triển.
== Sơ lược ==
<div style="border: 1px green solid; padding: 5px 10px">
;Cài đặt {{anchor|Cài đặt}}: Để kích hoạt Twinkle trên tài khoản của bạn, bạn chỉ cần đánh dấu vào ô "Twinkle" trong mục "Tuỳ chọn", thẻ "Tiện ích" trong mục [[Special:Preferences#mw-prefsection-gadgets|'''Tuỳ chọn''']]. (Nhớ nhấn nút "Lưu tuỳ chọn" ở dưới cùng của trang!) Sau khi cài đặt, bạn phải chắc rằng [[w:Trợ giúp:Xóa bộ nhớ đệm|đã làm sạch bộ nhớ đệm của trình duyệt]] bằng "Shift+F5".
;Cài đặt thuộc tính Twinkle:
Để sử dụng các công cụ của Twinkle, bạn có thể đi đến [[Wiktionary:Twinkle/Preferences|trang tuỳ chọn]]. Chọn các mục mà bạn quan tâm và nhấn vào "Lưu tuỳ chọn" ở cuối trang. Sau đó làm sạch bộ nhớ đệm để tác vụ thay đổi có thể sử dụng được.
;Phiên bản Twinkle này làm được gì:
* Lùi sửa (rollback) 3 kiểu
* Chào mừng thành viên mới
* Cảnh báo
* Báo cáo phá hoại ([[WT:TNCBQV]])
* Yêu cầu khóa trang (sẽ chuyển lên [[WT:TNCBQV]])
* Gắn bảng bảo trì
* Gắn biển xóa nhanh
;Cần trợ giúp: Có nhiều thông tin hữu ích về Twinkle tại [[:w:vi:WP:TW/DOC|trang thông tin]]. Nếu thắc mắc của bạn chưa được giải đáp thoả mãn, bạn có thể thảo luận tại [[User talk:Kateru Zakuro|trang thảo luận của tôi]]
<!--;Báo cáo lỗi hoặc yêu cầu các thuộc tính khác: -->
;Chú ý: Twinkle không thể hoạt động trên [[Internet Explorer]] phiên bản 8 hoặc trước đó. Nếu bạn sử dụng Windows Vista hoặc Windows 7, bạn có thể nâng cấp lên Internet Explorer 9 để có thể sử dụng Twinkle. Nếu bạn sử dụng Windows XP hoặc phiên bản trước đó, hãy thử cài đặt một trình duyệt internet khác, vì Twinkle có các chức năng tích hợp trên các trình duyệt mới hơn. Twinkle cũng hoạt động trên trình duyệt web Android.<!-- at least, I know it does on the Samsung Galaxy Tab 10.1 and 8.9 -->
;Tôi sử dụng giao diện di động: Hãy sao chép đoạn này và Dán vào [[Special:MyPage/minerva.js]] của bạn để kích hoạt Twinkle trên giao diện di động.
<syntaxhighlight lang='js'>
mw.loader.load('//vi.wikipedia.org/w/index.php?title=User:Plantaest/TwinkleMobile.js&action=raw&ctype=text/javascript');
// [[User:Plantaest/TwinkleMobile]] by [[:vi:User:Plantaest]]
</syntaxhighlight>
</div>
duw94ecsadl4xto5tnizjmqkl87qt7k
gani
0
342349
2353476
2312143
2026-05-15T05:59:38Z
Hiyuune
50834
/* Biến đổi âm */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353476
wikitext
text/x-wiki
=={{langname|pl}}==
==={{ĐM|pron}}===
{{pl-pr}}
==={{ĐM|v}}===
{{head|pl|Biến thể hình thái động từ}}
# {{inflection of|pl|ganić||pres|ở|3s}}
=={{langname|pt}}==
==={{ĐM|v}}===
{{head|pt|Biến thể hình thái động từ}}
# {{pt-verb form of|ganir}}
=={{langname|gl}}==
==={{ĐM|verb}}===
{{head|gl|Biến thể hình thái động từ}}
# {{gl-reinteg-verb form of|ganir}}
=={{langname|kpg}}==
==={{ĐM|n}}===
{{head|kpg|Danh từ}}
# {{nhãn|kpg|anatomy}} [[dương vật|Dương vật]]
#: {{synonym|kpg|belu|q=slang}}
=={{langname|lv}}==
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=m}}
# {{infl of|lv|gans||nom//voc|p}}
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=f}}
# {{infl of|lv|gane||acc//ins|s}}
=={{langname|vo}}==
==={{ĐM|n}}===
{{head|vo|Biến thể hình thái danh từ}}
# {{inflection of|vo|gan||acc|s}}
=={{langname|cy}}==
==={{ĐM|v}}===
{{head|cy|Động từ được biến đổi âm}}
# {{soft mutation of|cy|cani}}
==={{ĐM|mutation}}===
{{cy-mut|cani}}
=={{langname|yog}}==
==={{ĐM|pronoun}}===
{{head|yog|Đại từ|head=ganí}}
# {{lb|yog|nghi vấn}} [[cái gì|Cái gì]].
8rp3ijsf556rnxfwc287dqliop34d0q
2353477
2353476
2026-05-15T05:59:57Z
Hiyuune
50834
/* Tiếng Wales */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353477
wikitext
text/x-wiki
=={{langname|pl}}==
==={{ĐM|pron}}===
{{pl-pr}}
==={{ĐM|v}}===
{{head|pl|Biến thể hình thái động từ}}
# {{inflection of|pl|ganić||pres|ở|3s}}
=={{langname|pt}}==
==={{ĐM|v}}===
{{head|pt|Biến thể hình thái động từ}}
# {{pt-verb form of|ganir}}
=={{langname|gl}}==
==={{ĐM|verb}}===
{{head|gl|Biến thể hình thái động từ}}
# {{gl-reinteg-verb form of|ganir}}
=={{langname|kpg}}==
==={{ĐM|n}}===
{{head|kpg|Danh từ}}
# {{nhãn|kpg|anatomy}} [[dương vật|Dương vật]]
#: {{synonym|kpg|belu|q=slang}}
=={{langname|lv}}==
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=m}}
# {{infl of|lv|gans||nom//voc|p}}
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=f}}
# {{infl of|lv|gane||acc//ins|s}}
=={{langname|vo}}==
==={{ĐM|n}}===
{{head|vo|Biến thể hình thái danh từ}}
# {{inflection of|vo|gan||acc|s}}
=={{langname|cy}}==
==={{ĐM|pron}}===
* {{IPA4|cy|/ˈɡanɪ/|a=cy-N}}
* {{IPA4|cy|/ˈɡaːni/|/ˈɡani/|a=cy-S}}
==={{ĐM|v}}===
{{head|cy|Động từ được biến đổi âm}}
# {{soft mutation of|cy|cani}}
==={{ĐM|mutation}}===
{{cy-mut|cani}}
=={{langname|yog}}==
==={{ĐM|pronoun}}===
{{head|yog|Đại từ|head=ganí}}
# {{lb|yog|nghi vấn}} [[cái gì|Cái gì]].
3qqx01gy7peditx22k7ia3wfu6oedt3
2353481
2353477
2026-05-15T06:02:37Z
Hiyuune
50834
/* Danh từ */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353481
wikitext
text/x-wiki
=={{langname|pl}}==
==={{ĐM|pron}}===
{{pl-pr}}
==={{ĐM|v}}===
{{head|pl|Biến thể hình thái động từ}}
# {{inflection of|pl|ganić||pres|ở|3s}}
=={{langname|pt}}==
==={{ĐM|v}}===
{{head|pt|Biến thể hình thái động từ}}
# {{pt-verb form of|ganir}}
=={{langname|gl}}==
==={{ĐM|verb}}===
{{head|gl|Biến thể hình thái động từ}}
# {{gl-reinteg-verb form of|ganir}}
=={{langname|kpg}}==
==={{ĐM|n}}===
{{head|kpg|Danh từ}}
# {{nhãn|kpg|anatomy}} [[dương vật|Dương vật]]
#: {{synonym|kpg|belu|q=slang}}
=={{langname|lv}}==
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=m}}
# {{infl of|lv|gans||nom//voc|p}}
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=f}}
# {{infl of|lv|gane||acc//ins|s}}
=={{langname|sw}}==
==={{ĐM|pron}}===
* {{audio|sw|Sw-ke-gani.flac|a=Kenya}}
==={{ĐM|adj}}===
{{sw-adj|inv}}
# [[cái gì|Cái gì]].
===={{ĐM|drv}}====
* {{l|sw|habari gani}}
* {{l|sw|kiasi gani}}
=={{langname|vo}}==
==={{ĐM|n}}===
{{head|vo|Biến thể hình thái danh từ}}
# {{inflection of|vo|gan||acc|s}}
=={{langname|cy}}==
==={{ĐM|pron}}===
* {{IPA4|cy|/ˈɡanɪ/|a=cy-N}}
* {{IPA4|cy|/ˈɡaːni/|/ˈɡani/|a=cy-S}}
==={{ĐM|v}}===
{{head|cy|Động từ được biến đổi âm}}
# {{soft mutation of|cy|cani}}
==={{ĐM|mutation}}===
{{cy-mut|cani}}
=={{langname|yog}}==
==={{ĐM|pronoun}}===
{{head|yog|Đại từ|head=ganí}}
# {{lb|yog|nghi vấn}} [[cái gì|Cái gì]].
lv2sf6kw0to0ysinbe5tzndreg660q8
2353483
2353481
2026-05-15T06:03:03Z
Hiyuune
50834
/* Tiếng Kapingamarangi */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353483
wikitext
text/x-wiki
=={{langname|pl}}==
==={{ĐM|pron}}===
{{pl-pr}}
==={{ĐM|v}}===
{{head|pl|Biến thể hình thái động từ}}
# {{inflection of|pl|ganić||pres|ở|3s}}
=={{langname|pt}}==
==={{ĐM|v}}===
{{head|pt|Biến thể hình thái động từ}}
# {{pt-verb form of|ganir}}
=={{langname|gl}}==
==={{ĐM|verb}}===
{{head|gl|Biến thể hình thái động từ}}
# {{gl-reinteg-verb form of|ganir}}
=={{langname|kpg}}==
==={{ĐM|n}}===
{{head|kpg|Danh từ}}
# {{nhãn|kpg|anatomy}} [[dương vật|Dương vật]]
#: {{synonym|kpg|belu|q=từ lóng}}
=={{langname|lv}}==
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=m}}
# {{infl of|lv|gans||nom//voc|p}}
==={{ĐM|n}}===
{{head|lv|Biến thể hình thái danh từ|g=f}}
# {{infl of|lv|gane||acc//ins|s}}
=={{langname|sw}}==
==={{ĐM|pron}}===
* {{audio|sw|Sw-ke-gani.flac|a=Kenya}}
==={{ĐM|adj}}===
{{sw-adj|inv}}
# [[cái gì|Cái gì]].
===={{ĐM|drv}}====
* {{l|sw|habari gani}}
* {{l|sw|kiasi gani}}
=={{langname|vo}}==
==={{ĐM|n}}===
{{head|vo|Biến thể hình thái danh từ}}
# {{inflection of|vo|gan||acc|s}}
=={{langname|cy}}==
==={{ĐM|pron}}===
* {{IPA4|cy|/ˈɡanɪ/|a=cy-N}}
* {{IPA4|cy|/ˈɡaːni/|/ˈɡani/|a=cy-S}}
==={{ĐM|v}}===
{{head|cy|Động từ được biến đổi âm}}
# {{soft mutation of|cy|cani}}
==={{ĐM|mutation}}===
{{cy-mut|cani}}
=={{langname|yog}}==
==={{ĐM|pronoun}}===
{{head|yog|Đại từ|head=ganí}}
# {{lb|yog|nghi vấn}} [[cái gì|Cái gì]].
0dp9y0tucoz7un93zafpdafidiov0bf
Bản mẫu:db-meta
10
360056
2353298
2353023
2026-05-14T18:09:41Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-meta]] thành [[Bản mẫu:db-meta]]
2272001
wikitext
text/x-wiki
{{#ifeq: {{{raw|}}} | yes<!--
If raw=yes, include a short deletion message with no message box-->
| <b>{{ucfirst:{{{1}}}}}.</b> <!--
-->{{#if: {{{2|}}} | <i>{{{2}}}</i> }}<!--
-->{{#ifeq:{{{criterion}}}| NA
|
| <b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b>
}}<!--
-->{{#if: {{{rationale|}}}
|  <span style="color:var(--color-destructive,red); font-weight:bold;">{{{rationale}}}</span>
}}<!--
If raw != yes, then include the full deletion template with message box -->
|{{mbox
| class = mbox-db
| type = speedy
| image = none
| style = font-size:95%;
| text =
<b><i>{{ucfirst:{{if empty|{{{pagetype_override|}}}|{{pagetype}}}}}} {{#if:{{{bot|}}}|được đánh dấu bởi [[User:{{{bot}}}|{{{bot}}}]]}} này được đề nghị [[Wiktionary:Quy định xóa trang|xóa nhanh]]</i>{{{1}}}.</b> {{#if:{{{2|}}}|<i>{{{2}}}</i>. }}{{#ifeq:{{{criterion}}}|NA||<b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b>}}<span id="delete-reason" style="display:none">{{urlencode:{{#ifeq:{{{criterion}}}|NA||[[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|{{uc:{{{criterion}}}}}]]:}} {{{summary|}}}}}</span><span id="delete-criterion" style="display:none">{{uc:{{{criterion}}}}}</span>{{#if:{{{rationale|}}}| <span style="color:var(--color-destructive,red); font-weight:bold;">{{{rationale}}}</span>}}
<p class="verbose">Nếu {{if empty|{{{pagetype_override|}}}|{{pagetype}}}} này không thuộc các tiêu chí xóa nhanh, {{#ifeq:{{{self}}}|yes|vui lòng xóa thông báo này đi.<br /></p>|hoặc bạn có ý định sửa đổi nó, vui lòng xóa thông báo này đi, nhưng '''đừng xóa thông báo này khỏi các trang do bạn tự tạo ra'''. Nếu bạn đã tạo trang này và không đồng ý với lý do xóa, bạn có thể nhấn vào nút bên dưới và để lại tin nhắn giải thích lý do tại sao bạn cho rằng không nên xóa trang này. Bạn có thể {{talk other|kiểm tra lại sau để xem|[[{{TALKPAGENAME}}|truy cập trang thảo luận]] để kiểm tra xem}} bạn đã nhận được phản hồi cho tin nhắn của mình chưa.
</p>
<!-- "Contest this speedy deletion" button -->
{{#tag: inputbox |
type=commenttitle
default=Phản đối đề nghị xóa trang
preload=Template:Hangon preload {{#switch:{{uc:{{{criterion|NA}}}}}|G3|G10|G11|G12|G14|A1|A2|A3|A7|A9|A10|A11|R3|F1|F2|F3|F4|F5|F6|F7|F8|F9|F11|C1={{uc:{{{criterion}}}}}|#default=generic}}
hidden=yes
page={{#titleparts:{{TALKPAGENAME}}|255}}
buttonlabel=Phản đối đề nghị xóa trang
break=no
editintro=Template:Hangon preload editintro
}}
<p class="verbose">Xin lưu ý rằng {{pagetype}} này có thể bị xóa bất cứ lúc nào nếu trang thuộc các tiêu chí xóa nhanh, hoặc lời giải thích {{talk other|thêm bên dưới thông báo này|trên trang thảo luận}} không được đưa ra nhanh chóng. {{main other|Nếu trang bị đề nghị xóa là một mục từ vì nội dung có chất lượng kém, mời bạn giúp [{{fullurl:{{FULLPAGENAME}}|action=edit}} cải thiện].|}}</p><!--
-->{{#ifeq:{{{help}}}|off||
<!--
-- Text for the warning message to substitute on user talk pages --
-->{{#if: {{{temp|}}}
|
<!--:<small>'''''Người đề nghị''': Xin hãy cân nhắc đặt [[Trợ giúp:Bản mẫu|bản mẫu]]:''</small>
:<small><code>''<nowiki>{{subst:</nowiki>[[Template:{{{temp}}}|{{{temp}}}]]<nowiki>|</nowiki>{{FULLPAGENAME}}<nowiki>|header=1</nowiki>{{{temp2|}}}<nowiki>}} </nowiki>{{#ifeq:{{{sig|x}}}|x|<nowiki>~~~~</nowiki>}}''</code></small>
:''<small>vào trang thảo luận của tác giả.</small>''-->
<!--
-->}}}}<!--
Add notice about using the talk page, or a notice for administrators if the talk page exists -->
{{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}||{{#ifexist:{{TALKPAGENAME}}|{{Hang on/notice3}}|<div class="verbose">{{Hang on/notice2}}</div>}}}}}}
<!--Space for other notes -->
{{#if:{{{notes|}}}|{{{notes}}}<br />}}<!--
-- Message for admins --
--><small><span class="sysop-show">''Bảo quản viên: Kiểm tra [[Special:Whatlinkshere/{{FULLPAGENAME}}|liên kết]], [[{{TALKPAGENAME}}|thảo luận]], [{{fullurl:{{FULLPAGENAME}}|action=history}} lịch sử] ([{{fullurl:{{FULLPAGENAME}}|diff=0}} khác biệt cuối]), và [{{fullurl:Special:Log|page={{FULLPAGENAMEE}}}} nhật trình] trước khi [{{fullurl:{{FULLPAGENAME}}|wpReason={{urlencode:{{#ifeq:{{{criterion}}}|NA||[[WP:CSD#{{uc:{{{criterion}}}}}|{{uc:{{{criterion}}}}}]]:}} {{{summary|}}}}}&action=delete}} xóa]{{#if:{{{bot|}}}|, vì trang này được gắn thẻ bởi một [[Wiktionary:Bot|bot]]}}{{#if:{{{anote|}}}|{{{anote}}}|.}} {{#ifeq:{{{self}}}|yes||Cân nhắc [[google:{{urlencode:{{PAGENAME}}}}|kiểm tra Google]].}}''<br/></span>Trang này được [{{fullurl:{{FULLPAGENAME}}|diff=cur}} sửa đổi lần cuối] {{#if: {{REVISIONUSER}} | vào [[{{ns:2}}:{{REVISIONUSER2}}|{{REVISIONUSER2}}]] <small>{{Toolbar|1=[[Special:Contributions/{{REVISIONUSER2}}|đóng góp]]|2=[[Special:Log/{{REVISIONUSER2}}|nhật trình]]}}</small> }} vào {{#time:H:i, j F Y (e)|{{REVISIONTIMESTAMP}}}} ([{{fullurl:{{FULLPAGENAME}}|action=purge}} làm mới<!--{{Time ago|{{REVISIONTIMESTAMP}}}}-->])</small><!--
-->}}<!--
-- End main mbox code, start courtesy blanking notices and div blanking tag --
-->{{#if: {{{blanked|}}} | {{mbox|image=none|text= {{{blanked-text|Trang này đã [[Wiktionary:Quy định xóa trang#Courtesy blanking|bị tẩy trống vì vấn đề văn minh]].}}}}} |}}{{#if: {{{pleaseblank|}}} | {{mbox|type=delete|text=<big>{{red|Vui lòng tẩy trống trang này để nó chỉ chứa mẫu xóa.}}</big>}} |}}{{#if: {{{divblank|}}} | <div id="AttackPage" style="display:none"><!--do not close this div tag; it is there to ensure that any content remaining on the page does not display --> |}}
}}<!-- End if statement for "raw" parameter-->__NOINDEX__<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
flpi4r3do6dwvyb046nrvjnazqsp1mz
2353329
2353298
2026-05-14T18:29:07Z
Kateru Zakuro
34522
2353329
wikitext
text/x-wiki
{{#ifeq: {{{raw|}}} | yes<!--
If raw=yes, include a short deletion message with no message box-->
| <b>{{ucfirst:{{{1}}}}}.</b> <!--
-->{{#if: {{{2|}}} | <i>{{{2}}}</i> }}<!--
-->{{#ifeq:{{{criterion}}}| NA
|
| <b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b>
}}<!--
-->{{#if: {{{rationale|}}}
|  <span style="color:var(--color-destructive,red); font-weight:bold;">{{{rationale}}}</span>
}}<!--
If raw != yes, then include the full deletion template with message box -->
|{{mbox
| class = mbox-db
| type = speedy
| image = none
| style = font-size:95%;
| text =
<b><i>{{ucfirst:{{if empty|{{{pagetype_override|}}}|{{pagetype}}}}}} {{#if:{{{bot|}}}|được đánh dấu bởi [[User:{{{bot}}}|{{{bot}}}]]}} này được đề nghị [[Wiktionary:Quy định xóa trang|xóa nhanh]]</i>{{{1}}}.</b> {{#if:{{{2|}}}|<i>{{{2}}}</i>. }}{{#ifeq:{{{criterion}}}|NA||<b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b>}}<span id="delete-reason" style="display:none">{{urlencode:{{#ifeq:{{{criterion}}}|NA||[[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|{{uc:{{{criterion}}}}}]]:}} {{{summary|}}}}}</span><span id="delete-criterion" style="display:none">{{uc:{{{criterion}}}}}</span>{{#if:{{{rationale|}}}| <span style="color:var(--color-destructive,red); font-weight:bold;">{{{rationale}}}</span>}}
<p class="verbose">Nếu {{if empty|{{{pagetype_override|}}}|{{pagetype}}}} này không thuộc các tiêu chí xóa nhanh, {{#ifeq:{{{self}}}|yes|vui lòng xóa thông báo này đi.<br /></p>|hoặc bạn có ý định sửa đổi nó, vui lòng xóa thông báo này đi, nhưng '''đừng xóa thông báo này khỏi các trang do bạn tự tạo ra'''. Nếu bạn đã tạo trang này và không đồng ý với lý do xóa, bạn có thể nhấn vào nút bên dưới và để lại tin nhắn giải thích lý do tại sao bạn cho rằng không nên xóa trang này. Bạn có thể {{talk other|kiểm tra lại sau để xem|[[{{TALKPAGENAME}}|truy cập trang thảo luận]] để kiểm tra xem}} bạn đã nhận được phản hồi cho tin nhắn của mình chưa.
</p>
<!-- "Contest this speedy deletion" button -->
{{#tag: inputbox |
type=commenttitle
default=Phản đối đề nghị xóa trang
preload=Template:Hangon preload {{#switch:{{uc:{{{criterion|NA}}}}}|G3|G10|G11|G12|G14|A1|A2|A3|A7|A9|A10|A11|R3|F1|F2|F3|F4|F5|F6|F7|F8|F9|F11|C1={{uc:{{{criterion}}}}}|#default=generic}}
hidden=yes
page={{#titleparts:{{TALKPAGENAME}}|255}}
buttonlabel=Phản đối đề nghị xóa trang
break=no
editintro=Template:Hangon preload editintro
}}
<p class="verbose">Xin lưu ý rằng {{pagetype}} này có thể bị xóa bất cứ lúc nào nếu trang thuộc các tiêu chí xóa nhanh, hoặc lời giải thích {{talk other|thêm bên dưới thông báo này|trên trang thảo luận}} không được đưa ra nhanh chóng. {{main other|Nếu trang bị đề nghị xóa là một mục từ vì nội dung có chất lượng kém, mời bạn giúp [{{fullurl:{{FULLPAGENAME}}|action=edit}} cải thiện].|}}</p><!--
-->{{#ifeq:{{{help}}}|off||
<!--
-- Text for the warning message to substitute on user talk pages --
-->{{#if: {{{temp|}}}
|
<!--:<small>'''''Người đề nghị''': Xin hãy cân nhắc đặt [[Trợ giúp:Bản mẫu|bản mẫu]]:''</small>
:<small><code>''<nowiki>{{subst:</nowiki>[[Template:{{{temp}}}|{{{temp}}}]]<nowiki>|</nowiki>{{FULLPAGENAME}}<nowiki>|header=1</nowiki>{{{temp2|}}}<nowiki>}} </nowiki>{{#ifeq:{{{sig|x}}}|x|<nowiki>~~~~</nowiki>}}''</code></small>
:''<small>vào trang thảo luận của tác giả.</small>''-->
<!--
-->}}}}<!--
Add notice about using the talk page, or a notice for administrators if the talk page exists -->
{{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}||{{#ifexist:{{TALKPAGENAME}}|{{Hang on/notice3}}|<div class="verbose">{{Hang on/notice2}}</div>}}}}}}
<!--Space for other notes -->
{{#if:{{{notes|}}}|{{{notes}}}<br />}}<!--
-- Message for admins --
--><small><span class="sysop-show">''Bảo quản viên: Kiểm tra [[Special:Whatlinkshere/{{FULLPAGENAME}}|liên kết]], [[{{TALKPAGENAME}}|thảo luận]], [{{fullurl:{{FULLPAGENAME}}|action=history}} lịch sử] ([{{fullurl:{{FULLPAGENAME}}|diff=0}} khác biệt cuối]), và [{{fullurl:Special:Log|page={{FULLPAGENAMEE}}}} nhật trình] trước khi [{{fullurl:{{FULLPAGENAME}}|wpReason={{urlencode:{{#ifeq:{{{criterion}}}|NA||[[WP:CSD#{{uc:{{{criterion}}}}}|{{uc:{{{criterion}}}}}]]:}} {{{summary|}}}}}&action=delete}} xóa]{{#if:{{{bot|}}}|, vì trang này được gắn thẻ bởi một [[Wiktionary:Bot|bot]]}}{{#if:{{{anote|}}}|{{{anote}}}|.}} {{#ifeq:{{{self}}}|yes||Cân nhắc [[google:{{urlencode:{{PAGENAME}}}}|kiểm tra Google]].}}''<br/></span>Trang này được [{{fullurl:{{FULLPAGENAME}}|diff=cur}} sửa đổi lần cuối] {{#if: {{REVISIONUSER}} | vào [[{{ns:2}}:{{REVISIONUSER2}}|{{REVISIONUSER2}}]] <small>{{Toolbar|1=[[Special:Contributions/{{REVISIONUSER2}}|đóng góp]]|2=[[Special:Log/{{REVISIONUSER2}}|nhật trình]]}}</small> }} vào {{#time:H:i, j F "năm" Y (e)|{{REVISIONTIMESTAMP}}}} ([{{fullurl:{{FULLPAGENAME}}|action=purge}} làm mới<!--{{Time ago|{{REVISIONTIMESTAMP}}}}-->])</small><!--
-->}}<!--
-- End main mbox code, start courtesy blanking notices and div blanking tag --
-->{{#if: {{{blanked|}}} | {{mbox|image=none|text= {{{blanked-text|Trang này đã [[Wiktionary:Quy định xóa trang#Courtesy blanking|bị tẩy trống vì vấn đề văn minh]].}}}}} |}}{{#if: {{{pleaseblank|}}} | {{mbox|type=delete|text=<big>{{red|Vui lòng tẩy trống trang này để nó chỉ chứa mẫu xóa.}}</big>}} |}}{{#if: {{{divblank|}}} | <div id="AttackPage" style="display:none"><!--do not close this div tag; it is there to ensure that any content remaining on the page does not display --> |}}
}}<!-- End if statement for "raw" parameter-->__NOINDEX__<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
dgpmfs37yl73y5ein1quty1b89lvjlf
2353335
2353329
2026-05-14T18:38:53Z
Kateru Zakuro
34522
2353335
wikitext
text/x-wiki
{{#ifeq: {{{raw|}}} | yes<!--
If raw=yes, include a short deletion message with no message box-->
| <b>{{ucfirst:{{{1}}}}}.</b> <!--
-->{{#if: {{{2|}}} | <i>{{{2}}}</i> }}<!--
-->{{#ifeq:{{{criterion}}}| NA
|
| <b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b>
}}<!--
-->{{#if: {{{rationale|}}}
|  <span style="color:var(--color-destructive,red); font-weight:bold;">{{{rationale}}}</span>
}}<!--
If raw != yes, then include the full deletion template with message box -->
|{{mbox
| class = mbox-db
| type = speedy
| image = none
| style = font-size:95%;
| text =
<b><i>{{ucfirst:{{if empty|{{{pagetype_override|}}}|{{pagetype}}}}}} {{#if:{{{bot|}}}|được đánh dấu bởi [[User:{{{bot}}}|{{{bot}}}]]}} này được đề nghị [[Wiktionary:Quy định xóa trang|xóa nhanh]]</i>{{{1}}}.</b> {{#if:{{{2|}}}|<i>{{{2}}}</i>. }}{{#ifeq:{{{criterion}}}|NA||<b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b>}}<span id="delete-reason" style="display:none">{{urlencode:{{#ifeq:{{{criterion}}}|NA||[[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|{{uc:{{{criterion}}}}}]]:}} {{{summary|}}}}}</span><span id="delete-criterion" style="display:none">{{uc:{{{criterion}}}}}</span>{{#if:{{{rationale|}}}| <span style="color:var(--color-destructive,red); font-weight:bold;">{{{rationale}}}</span>}}
<p class="verbose">Nếu {{if empty|{{{pagetype_override|}}}|{{pagetype}}}} này không thuộc các tiêu chí xóa nhanh, {{#ifeq:{{{self}}}|yes|vui lòng xóa thông báo này đi.<br /></p>|hoặc bạn có ý định sửa đổi nó, vui lòng xóa thông báo này đi, nhưng '''đừng xóa thông báo này khỏi các trang do bạn tự tạo ra'''. Nếu bạn đã tạo trang này và không đồng ý với lý do xóa, bạn có thể nhấn vào nút bên dưới và để lại tin nhắn giải thích lý do tại sao bạn cho rằng không nên xóa trang này. Bạn có thể {{talk other|kiểm tra lại sau để xem|[[{{TALKPAGENAME}}|truy cập trang thảo luận]] để kiểm tra xem}} bạn đã nhận được phản hồi cho tin nhắn của mình chưa.
</p>
<!-- "Contest this speedy deletion" button -->
{{#tag: inputbox |
type=commenttitle
default=Phản đối đề nghị xóa trang
preload=Template:Hangon preload {{#switch:{{uc:{{{criterion|NA}}}}}|G3|G10|G11|G12|G14|A1|A2|A3|A7|A9|A10|A11|R3|F1|F2|F3|F4|F5|F6|F7|F8|F9|F11|C1={{uc:{{{criterion}}}}}|#default=generic}}
hidden=yes
page={{#titleparts:{{TALKPAGENAME}}|255}}
buttonlabel=Phản đối đề nghị xóa trang
break=no
editintro=Template:Hangon preload editintro
}}
<p class="verbose">Xin lưu ý rằng {{pagetype}} này có thể bị xóa bất cứ lúc nào nếu trang thuộc các tiêu chí xóa nhanh, hoặc lời giải thích {{talk other|thêm bên dưới thông báo này|trên trang thảo luận}} không được đưa ra nhanh chóng. {{main other|Nếu trang bị đề nghị xóa là một mục từ vì nội dung có chất lượng kém, mời bạn giúp [{{fullurl:{{FULLPAGENAME}}|action=edit}} cải thiện].|}}</p><!--
-->{{#ifeq:{{{help}}}|off||
<!--
-- Text for the warning message to substitute on user talk pages --
-->{{#if: {{{temp|}}}
|
<!--:<small>'''''Người đề nghị''': Xin hãy cân nhắc đặt [[Trợ giúp:Bản mẫu|bản mẫu]]:''</small>
:<small><code>''<nowiki>{{subst:</nowiki>[[Template:{{{temp}}}|{{{temp}}}]]<nowiki>|</nowiki>{{FULLPAGENAME}}<nowiki>|header=1</nowiki>{{{temp2|}}}<nowiki>}} </nowiki>{{#ifeq:{{{sig|x}}}|x|<nowiki>~~~~</nowiki>}}''</code></small>
:''<small>vào trang thảo luận của tác giả.</small>''-->
<!--
-->}}}}<!--
Add notice about using the talk page, or a notice for administrators if the talk page exists -->
{{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}||{{#ifexist:{{TALKPAGENAME}}|{{Hang on/notice3}}|<div class="verbose">{{Hang on/notice2}}</div>}}}}}}
<!--Space for other notes -->
{{#if:{{{notes|}}}|{{{notes}}}<br />}}<!--
-- Message for admins --
--><small><span class="sysop-show">''Bảo quản viên: Kiểm tra [[Special:Whatlinkshere/{{FULLPAGENAME}}|liên kết]], [[{{TALKPAGENAME}}|thảo luận]], [{{fullurl:{{FULLPAGENAME}}|action=history}} lịch sử] ([{{fullurl:{{FULLPAGENAME}}|diff=0}} khác biệt cuối]), và [{{fullurl:Special:Log|page={{FULLPAGENAMEE}}}} nhật trình] trước khi [{{fullurl:{{FULLPAGENAME}}|wpReason={{urlencode:{{#ifeq:{{{criterion}}}|NA||[[WT:XN#{{uc:{{{criterion}}}}}|{{uc:{{{criterion}}}}}]]:}} {{{summary|}}}}}&action=delete}} xóa]{{#if:{{{bot|}}}|, vì trang này được gắn thẻ bởi một [[Wiktionary:Bot|bot]]}}{{#if:{{{anote|}}}|{{{anote}}}|.}} {{#ifeq:{{{self}}}|yes||Cân nhắc [[google:{{urlencode:{{PAGENAME}}}}|kiểm tra Google]].}}''<br/></span>Trang này được [{{fullurl:{{FULLPAGENAME}}|diff=cur}} sửa đổi lần cuối] {{#if: {{REVISIONUSER}} | vào [[{{ns:2}}:{{REVISIONUSER2}}|{{REVISIONUSER2}}]] <small>{{Toolbar|1=[[Special:Contributions/{{REVISIONUSER2}}|đóng góp]]|2=[[Special:Log/{{REVISIONUSER2}}|nhật trình]]}}</small> }} vào {{#time:H:i, j F "năm" Y (e)|{{REVISIONTIMESTAMP}}}} ([{{fullurl:{{FULLPAGENAME}}|action=purge}} làm mới<!--{{Time ago|{{REVISIONTIMESTAMP}}}}-->])</small><!--
-->}}<!--
-- End main mbox code, start courtesy blanking notices and div blanking tag --
-->{{#if: {{{blanked|}}} | {{mbox|image=none|text= {{{blanked-text|Trang này đã [[Wiktionary:Quy định xóa trang#Courtesy blanking|bị tẩy trống vì vấn đề văn minh]].}}}}} |}}{{#if: {{{pleaseblank|}}} | {{mbox|type=delete|text=<big>{{red|Vui lòng tẩy trống trang này để nó chỉ chứa mẫu xóa.}}</big>}} |}}{{#if: {{{divblank|}}} | <div id="AttackPage" style="display:none"><!--do not close this div tag; it is there to ensure that any content remaining on the page does not display --> |}}
}}<!-- End if statement for "raw" parameter-->__NOINDEX__<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
gc3c2wsgrkdl1q6azdrdlm0v6wkn2yb
Bản mẫu:db-c1
10
360100
2353250
2353031
2026-05-14T17:34:05Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c1]] thành [[Bản mẫu:db-c1]] (đã tắt đổi hướng)
2353030
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{user other|{{error|C1 không áp dụng cho các trang trong không gian tên thành viên}}|{{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C1
|1= vì mang nội dung vớ vẩn, không có ý nghĩa, linh tinh, vô nghĩa rõ ràng
|2=
|temp=Db-nonsense-notice
|summary={{{summary|Nội dung không có ý nghĩa/linh tinh}}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
1itzq5nsv5fycyq5o2zjbxqik0xdxxy
2353323
2353250
2026-05-14T18:16:18Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353323
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{user other|{{error|C1 không áp dụng cho các trang trong không gian tên thành viên}}|{{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C1
|1= vì mang nội dung vớ vẩn, không có ý nghĩa, linh tinh, vô nghĩa rõ ràng
|2=
|temp=Db-nonsense-notice
|summary={{{summary|Nội dung không có ý nghĩa/linh tinh}}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
j2ocd1g9ugn1cnailhf3qj4r71gudnv
Bản mẫu:db-c2
10
360101
2353252
2353068
2026-05-14T17:35:08Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c2]] thành [[Bản mẫu:db-c2]] (đã tắt đổi hướng)
2353068
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{user other|{{error|C2 không áp dụng cho các trang trong không gian tên thành viên}}|{{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C2
|1= vì là một trang thử nghiệm{{#if:{{{reason|}}}| ({{{reason}}})}}
|2=
|summary=Trang thử nghiệm
|temp=Db-test-notice
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
1o1d5e1sulkn0zfd1n5875tew7ghlvh
2353309
2353252
2026-05-14T18:14:39Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353309
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{user other|{{error|C2 không áp dụng cho các trang trong không gian tên thành viên}}|{{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C2
|1= vì là một trang thử nghiệm{{#if:{{{reason|}}}| ({{{reason}}})}}
|2=
|summary=Trang thử nghiệm
|temp=Db-test-notice
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
lsh6u2d4b8ufwzla6sevzggguy9ulez
Bản mẫu:db-c3
10
360106
2353253
2353063
2026-05-14T17:35:28Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c3]] thành [[Bản mẫu:db-c3]] (đã tắt đổi hướng)
2353063
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=G3
|1= {{{1|vì có nội dung [[Wiktionary:Phá hoại|phá hoại]] hoặc lừa bịp trắng trợn}}}
|2={{{2|}}}
|summary={{{summary|[[Wiktionary:Phá hoại|Phá hoại]] hoặc lừa bịp}}}
|temp={{{temp|Db-vandalism-notice}}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
lfhdkqkkvdqhgb5qj9ybjdi4afz97m4
2353315
2353253
2026-05-14T18:15:21Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353315
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=G3
|1= {{{1|vì có nội dung [[Wiktionary:Phá hoại|phá hoại]] hoặc lừa bịp trắng trợn}}}
|2={{{2|}}}
|summary={{{summary|[[Wiktionary:Phá hoại|Phá hoại]] hoặc lừa bịp}}}
|temp={{{temp|Db-vandalism-notice}}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
2edkve29qt0n75veecjf8wj2h7n6diw
直
0
360162
2353457
2300493
2026-05-15T05:48:50Z
Hiyuune
50834
/* Từ phái sinh */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353457
wikitext
text/x-wiki
{{also|真}}
{{character info}}
{{character info|0xFAA8}}
{{character info|0x2F940}}
=={{langname|mul}}==
{{stroke order|type=canimate}}
<div style="float:right;">{{stroke order|type=janimate}}</div>
<!--{{stroke order|type=tanimate}}-->
{{stroke order|strokes=8|type=jbw}}
==={{ĐM|han}}===
{{CJKV-forms|直|直|直|直}}
{{Han char|rn=109|rad=目|as=03|sn=8|four=40716|canj=JBMM|ids=⿱十⿴𠀃三<small>(GH)</small>,⿱𠂇⿴𠀃三<small>(TV)</small>,⿱𠂇⿺𠃊目<small>(JK)</small>}}
===={{section|derived characters}}====
* {{lang|mul|sc=Hani|[[值]]/[[値]], [[埴]], [[徝]], [[㥀]], [[㨁]], [[淔]], [[植]], [[殖]], [[犆]], [[禃]], [[䐈]], [[稙]], [[真]], [[惪]], [[悳]], [[嗭]], [[矗]], [[置]]}}
{{col-top|1|Các ký tự dẫn xuất}}
* <big>{{lang|mul|[[𠶗]], [[𰌈]], [[𡥰]], [[𡸜]], [[𢃜]], [[𢏶]], [[𱡤]]}}, {{lang|mul|[[𤊧]], [[𫌁]], [[𡖻]], [[𨁷]], [[𫒦]], [[𥊣]], [[𫗾]], [[𫤁]], [[𤣡]]}}</big>
* <big>{{lang|mul|[[𱐱]]}}, {{lang|mul|[[𬑚]], [[𱲿]]}}, {{lang|mul|[[𪧡]], [[𧡚]], [[𰥺]]}}, {{lang|mul|[[𭅨]], [[𥊢]], [[𭅬]]}}</big>
* <big>{{lang|mul|[[𡌴]], [[𫹦]], [[𡸽]], [[𣇣]], [[𠁆]], [[𠍜]], [[𥮖]], [[𦋘]], [[𰗁]]}}, {{lang|mul|[[𪠋]], [[𭼔]], [[𱁍]]}}, {{lang|mul|[[𰊧]], [[𨼡]], [[𢕀]], [[𥛄]], [[𣤳]]}}</big>
{{col-bottom}}
===={{ĐM|ref}}====
{{Han ref|kx=0800.050|dkj=23136|dj=1215.010|hdz=10061.070|uh=76F4|ud=30452|bh=AABD|bd=43709}}
{{Han ref|uh=FAA8}}
{{Han ref|uh=2F940}}
4k5j2eg9nbizl7emhxjskfxgydzqqnj
2353458
2353457
2026-05-15T05:49:01Z
Hiyuune
50834
/* Ký tự phái sinh */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353458
wikitext
text/x-wiki
{{also|真}}
{{character info}}
{{character info|0xFAA8}}
{{character info|0x2F940}}
=={{langname|mul}}==
{{stroke order|type=canimate}}
<div style="float:right;">{{stroke order|type=janimate}}</div>
<!--{{stroke order|type=tanimate}}-->
{{stroke order|strokes=8|type=jbw}}
==={{ĐM|han}}===
{{CJKV-forms|直|直|直|直}}
{{Han char|rn=109|rad=目|as=03|sn=8|four=40716|canj=JBMM|ids=⿱十⿴𠀃三<small>(GH)</small>,⿱𠂇⿴𠀃三<small>(TV)</small>,⿱𠂇⿺𠃊目<small>(JK)</small>}}
===={{section|derived characters}}====
* {{lang|mul|sc=Hani|[[值]]/[[値]], [[埴]], [[徝]], [[㥀]], [[㨁]], [[淔]], [[植]], [[殖]], [[犆]], [[禃]], [[䐈]], [[稙]], [[真]], [[惪]], [[悳]], [[嗭]], [[矗]], [[置]]}}
{{col-top|1|Các ký tự phái sinh}}
* <big>{{lang|mul|[[𠶗]], [[𰌈]], [[𡥰]], [[𡸜]], [[𢃜]], [[𢏶]], [[𱡤]]}}, {{lang|mul|[[𤊧]], [[𫌁]], [[𡖻]], [[𨁷]], [[𫒦]], [[𥊣]], [[𫗾]], [[𫤁]], [[𤣡]]}}</big>
* <big>{{lang|mul|[[𱐱]]}}, {{lang|mul|[[𬑚]], [[𱲿]]}}, {{lang|mul|[[𪧡]], [[𧡚]], [[𰥺]]}}, {{lang|mul|[[𭅨]], [[𥊢]], [[𭅬]]}}</big>
* <big>{{lang|mul|[[𡌴]], [[𫹦]], [[𡸽]], [[𣇣]], [[𠁆]], [[𠍜]], [[𥮖]], [[𦋘]], [[𰗁]]}}, {{lang|mul|[[𪠋]], [[𭼔]], [[𱁍]]}}, {{lang|mul|[[𰊧]], [[𨼡]], [[𢕀]], [[𥛄]], [[𣤳]]}}</big>
{{col-bottom}}
===={{ĐM|ref}}====
{{Han ref|kx=0800.050|dkj=23136|dj=1215.010|hdz=10061.070|uh=76F4|ud=30452|bh=AABD|bd=43709}}
{{Han ref|uh=FAA8}}
{{Han ref|uh=2F940}}
gnyzn8o3hjg7tqtq00s4jdmtrey5tz7
Bản mẫu:db-c4
10
360178
2353254
2353075
2026-05-14T17:36:40Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c4]] thành [[Bản mẫu:db-c4]] (đã tắt đổi hướng)
2353075
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C4
|1= vì mang nội dung trang [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} đã bị xóa] theo [[Wiktionary:Quy định xóa trang|quy định xóa trang]], không được viết lại đáng kể sau yêu cầu xóa{{#if:{{{1|{{{xfd|{{{page|}}}}}}}}}|. Xem ''[[{{{1|{{{xfd|{{{page|}}}}}}}}}|thảo luận trước đây]]''}}{{#if:{{{reason|}}}|.<br />{{in5}}''Lý do bổ sung của người đề nghị:'' {{{reason}}}}}
|2=
|temp=Db-repost-notice
|notes=
|summary=Mang nội dung trang đã bị [[Wiktionary:Quy định xóa trang|xóa]] theo thảo luận trước đây, [[{{#if:{{{1|{{{xfd|{{{page|}}}}}}}}}|{{{1|{{{xfd|{{{page|}}}}}}}}}|WT:XFD}}]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
51v5s9kxp3vxtg04onqrkm60zeuxpms
2353314
2353254
2026-05-14T18:15:14Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353314
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C4
|1= vì mang nội dung trang [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} đã bị xóa] theo [[Wiktionary:Quy định xóa trang|quy định xóa trang]], không được viết lại đáng kể sau yêu cầu xóa{{#if:{{{1|{{{xfd|{{{page|}}}}}}}}}|. Xem ''[[{{{1|{{{xfd|{{{page|}}}}}}}}}|thảo luận trước đây]]''}}{{#if:{{{reason|}}}|.<br />{{in5}}''Lý do bổ sung của người đề nghị:'' {{{reason}}}}}
|2=
|temp=Db-repost-notice
|notes=
|summary=Mang nội dung trang đã bị [[Wiktionary:Quy định xóa trang|xóa]] theo thảo luận trước đây, [[{{#if:{{{1|{{{xfd|{{{page|}}}}}}}}}|{{{1|{{{xfd|{{{page|}}}}}}}}}|WT:XFD}}]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{Tài liệu}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
qpdy08brg7u6hk8w6hm1c05qf0stlm1
Bản mẫu:db-c5
10
360193
2353255
2353080
2026-05-14T17:36:53Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c5]] thành [[Bản mẫu:db-c5]] (đã tắt đổi hướng)
2353080
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C5
|1= vì do thành viên bị [[Wiktionary:Quy định cấm thành viên|cấm]] hoặc cấm chỉ {{#if:{{{user|{{{1|}}}}}}|([[User:{{{user|{{{1}}}}}}|{{{user|{{{1}}}}}}]]<!--
-->)}} tạo ra
|summary=Do thành viên bị [[Wiktionary:Quy định cấm thành viên|cấm]] hoặc cấm chỉ {{#if:{{{user|{{{1|}}}}}}|([[User:{{{user|{{{1}}}}}}|{{{user|{{{1}}}}}}]])|}} tạo ra
|notes=
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
qkqs9g00a0shjw7i0v38v0zh6wzi5gs
2353313
2353255
2026-05-14T18:15:07Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353313
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C5
|1= vì do thành viên bị [[Wiktionary:Quy định cấm thành viên|cấm]] hoặc cấm chỉ {{#if:{{{user|{{{1|}}}}}}|([[User:{{{user|{{{1}}}}}}|{{{user|{{{1}}}}}}]]<!--
-->)}} tạo ra
|summary=Do thành viên bị [[Wiktionary:Quy định cấm thành viên|cấm]] hoặc cấm chỉ {{#if:{{{user|{{{1|}}}}}}|([[User:{{{user|{{{1}}}}}}|{{{user|{{{1}}}}}}]])|}} tạo ra
|notes=
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
12ukf9hdeft49r8r1ruzwfswp9lj68u
Bản mẫu:db-c6
10
360199
2353256
2353087
2026-05-14T17:37:08Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c6]] thành [[Bản mẫu:db-c6]] (đã tắt đổi hướng)
2353087
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C6
|1={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  để phục vụ công tác bảo trì không gây tranh cãi như tạm thời xóa để trộn lịch sử, đảo ngược đổi hướng, di chuyển và xóa theo yêu cầu xóa trang}}
|2={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|Công tác bảo trì này không gây tranh cãi}}
|notes=
|summary={{#if:{{{summary|}}}|{{{summary}}}|{{{rationale|{{{wording|{{{reason|{{{1|Xóa để phục vụ công tác bảo trì không gây tranh cãi}}}}}}}}}}}}}}
|self=yes
|temp={{{temp|}}}
|temp2={{{temp2|}}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
kqauwf3aujrofa3jc2drlisayss6on6
2353303
2353256
2026-05-14T18:13:56Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353303
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C6
|1={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  để phục vụ công tác bảo trì không gây tranh cãi như tạm thời xóa để trộn lịch sử, đảo ngược đổi hướng, di chuyển và xóa theo yêu cầu xóa trang}}
|2={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|Công tác bảo trì này không gây tranh cãi}}
|notes=
|summary={{#if:{{{summary|}}}|{{{summary}}}|{{{rationale|{{{wording|{{{reason|{{{1|Xóa để phục vụ công tác bảo trì không gây tranh cãi}}}}}}}}}}}}}}
|self=yes
|temp={{{temp|}}}
|temp2={{{temp2|}}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
a4u0igngxnqovvcwg89y1v6h1ilyuuh
Bản mẫu:db-c7
10
360208
2353257
2353100
2026-05-14T17:37:23Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c7]] thành [[Bản mẫu:db-c7]] (đã tắt đổi hướng)
2353100
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|{{{reason|}}}}}}|1|0}}|
{{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C7
|1= vì tác giả có đóng góp đáng kể duy nhất yêu cầu xóa {{#switch:{{NAMESPACE}}|{{ns:2}}|{{ns:14}}|{{TALKSPACE}}=|hay tẩy trống}}{{#if:{{{rationale|{{{reason|}}}}}}|. {{color|darkred|Với lý do: {{{rationale|{{{reason|}}}}}}}}|}}
|self=yes
|summary=Tác giả yêu cầu xóa {{#switch:{{NAMESPACE}}|{{ns:2}}|{{ns:14}}|{{TALKSPACE}}=|hay tẩy trống}}
}}
|<span style="color:red; font-weight:bold; font-size:120%;">Vui lòng dùng tham số <code>rationale</code> để giải thích lý do tại sao trang thảo luận thành viên này nên bị xóa. (Ví dụ <code>{{Db-c7|rationale= }}</code>.) Thanks!</span>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
sky41g462j09256vwuvjfclx7exekpt
2353312
2353257
2026-05-14T18:15:00Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353312
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|{{{reason|}}}}}}|1|0}}|
{{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C7
|1= vì tác giả có đóng góp đáng kể duy nhất yêu cầu xóa {{#switch:{{NAMESPACE}}|{{ns:2}}|{{ns:14}}|{{TALKSPACE}}=|hay tẩy trống}}{{#if:{{{rationale|{{{reason|}}}}}}|. {{color|darkred|Với lý do: {{{rationale|{{{reason|}}}}}}}}|}}
|self=yes
|summary=Tác giả yêu cầu xóa {{#switch:{{NAMESPACE}}|{{ns:2}}|{{ns:14}}|{{TALKSPACE}}=|hay tẩy trống}}
}}
|<span style="color:red; font-weight:bold; font-size:120%;">Vui lòng dùng tham số <code>rationale</code> để giải thích lý do tại sao trang thảo luận thành viên này nên bị xóa. (Ví dụ <code>{{Db-c7|rationale= }}</code>.) Thanks!</span>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
srqo3lnssrs0qgdpmfluwye5douo4fh
Bản mẫu:db-c8
10
360217
2353258
2353102
2026-05-14T17:37:36Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c8]] thành [[Bản mẫu:db-c8]] (đã tắt đổi hướng)
2353102
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|rationale={{{reason|{{{rationale|}}}}}}
|criterion=C8
|temp={{{temp|}}}
|self=yes
|1= vì {{#if:{{{1|}}}|{{{1}}}|trang liên quan đến trang khác}} đã bị xóa hoặc không tồn tại
|2={{{does_not_include|}}}
|notes={{#if:{{{1|}}}|{{{notes|}}}|}}
|summary={{#if:{{{summary|}}}
|{{{summary}}}
|{{#switch:{{NAMESPACE}}
|#default = Trang liên quan đến trang khác đã bị xóa hoặc không tồn tại
}}
}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{Documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
fezldgbw7ckwbf8zblsyv4rq3chy9wu
2353305
2353258
2026-05-14T18:14:10Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353305
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|rationale={{{reason|{{{rationale|}}}}}}
|criterion=C8
|temp={{{temp|}}}
|self=yes
|1= vì {{#if:{{{1|}}}|{{{1}}}|trang liên quan đến trang khác}} đã bị xóa hoặc không tồn tại
|2={{{does_not_include|}}}
|notes={{#if:{{{1|}}}|{{{notes|}}}|}}
|summary={{#if:{{{summary|}}}
|{{{summary}}}
|{{#switch:{{NAMESPACE}}
|#default = Trang liên quan đến trang khác đã bị xóa hoặc không tồn tại
}}
}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{Documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
33kz65c9vni2ulhtq1z0ibkp4yj13au
Bản mẫu:db-c9
10
360227
2353259
2272203
2026-05-14T17:37:50Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c9]] thành [[Bản mẫu:db-c9]] (đã tắt đổi hướng)
2272203
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C9
|1= với lý do: Nội dung quảng cáo, spam
|2=
|temp=db-spam-notice
|summary=Nội dung quảng cáo, spam
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
ko2rjgjo9gfmu7o0hikwuoibifd58mp
2353306
2353259
2026-05-14T18:14:17Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353306
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C9
|1= với lý do: Nội dung quảng cáo, spam
|2=
|temp=db-spam-notice
|summary=Nội dung quảng cáo, spam
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7ke0sra6qyjwp7bm4lr6ipn9iryil0h
Bản mẫu:db-c10
10
360231
2353260
2353107
2026-05-14T17:38:05Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c10]] thành [[Bản mẫu:db-c10]] (đã tắt đổi hướng)
2353107
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C10
|1= vì {{#if:{{{rationale|}}}|{{{rationale|}}}|có [[Wiktionary:Quy_định_và_hướng_dẫn#Quy_định_cộng_đồng|nội dung tấn công cá nhân]]}}
|2=
|anote=
|temp={{#ifeq:{{{org|no}}}|yes|db-attackorg-notice|db-attack-notice}}
|summary={{#if:{{{summary|}}}|{{{summary|}}}|Trang có [[Wiktionary:Quy_định_và_hướng_dẫn#Quy_định_cộng_đồng|nội dung tấn công cá nhân]]}}
<includeonly>|pleaseblank={{#ifexpr: {{REVISIONSIZE}} > 35 | yes}}
|blanked={{#ifeq: {{lc:{{{blanked|}}}}} | no | | yes }}
|divblank={{#ifeq: {{lc:{{{divblank|}}}}} | no | | yes }}</includeonly>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{#if:{{{demo|}}} | true | {{{nocat|}}} }}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
36zzfyhjqeg3dzydyh299tbva5ch8d4
2353310
2353260
2026-05-14T18:14:46Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353310
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C10
|1= vì {{#if:{{{rationale|}}}|{{{rationale|}}}|có [[Wiktionary:Quy_định_và_hướng_dẫn#Quy_định_cộng_đồng|nội dung tấn công cá nhân]]}}
|2=
|anote=
|temp={{#ifeq:{{{org|no}}}|yes|db-attackorg-notice|db-attack-notice}}
|summary={{#if:{{{summary|}}}|{{{summary|}}}|Trang có [[Wiktionary:Quy_định_và_hướng_dẫn#Quy_định_cộng_đồng|nội dung tấn công cá nhân]]}}
<includeonly>|pleaseblank={{#ifexpr: {{REVISIONSIZE}} > 35 | yes}}
|blanked={{#ifeq: {{lc:{{{blanked|}}}}} | no | | yes }}
|divblank={{#ifeq: {{lc:{{{divblank|}}}}} | no | | yes }}</includeonly>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{#if:{{{demo|}}} | true | {{{nocat|}}} }}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5wjcvcu2a8lfyyfiryn9bps789wp9zq
Bản mẫu:db-c11
10
360233
2353261
2353124
2026-05-14T17:38:17Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c11]] thành [[Bản mẫu:db-c11]] (đã tắt đổi hướng)
2353124
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C11
|1=  vì nội dung rõ ràng là quảng cáo, spam{{#if:{{{1|{{{xfd|{{{page|}}}}}}}}}|. Xem ''[[{{{1|{{{xfd|{{{page|}}}}}}}}}|thảo luận trước đây]]''}}{{#if:{{{reason|}}}|.<br />{{in5}}''Lý do bổ sung của người yêu cầu:''</b> {{{reason}}}<b>}}
|2=
|temp=db-spam-notice
|summary=Trang rõ ràng là quảng cáo, spam
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
hnzimruzm79hwhtjal0tu27azc0umlt
2353319
2353261
2026-05-14T18:15:49Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353319
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C11
|1=  vì nội dung rõ ràng là quảng cáo, spam{{#if:{{{1|{{{xfd|{{{page|}}}}}}}}}|. Xem ''[[{{{1|{{{xfd|{{{page|}}}}}}}}}|thảo luận trước đây]]''}}{{#if:{{{reason|}}}|.<br />{{in5}}''Lý do bổ sung của người yêu cầu:''</b> {{{reason}}}<b>}}
|2=
|temp=db-spam-notice
|summary=Trang rõ ràng là quảng cáo, spam
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
</noinclude>
64i62ly3t07bqcfo7c7ioo2gmxb6p0j
MediaWiki:Gadget-twinklespeedy.js
8
363649
2353233
2352969
2026-05-14T16:55:50Z
Kateru Zakuro
34522
Cập nhật 2026
2353233
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinklespeedy.js: CSD module
****************************************
* Mode of invocation: Tab ("CSD")
* Active on: Non-special, existing pages
*
* NOTE FOR DEVELOPERS:
* If adding a new criterion, add it to the appropriate places at the top of
* twinkleconfig.js. Also check out the default values of the CSD preferences
* in twinkle.js, and add your new criterion to those if you think it would be
* good.
*/
Twinkle.speedy = function twinklespeedy() {
// Disable on:
// * special pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
return;
}
Twinkle.addPortletLink(Twinkle.speedy.callback, 'Xóa nhanh', 'tw-csd', Morebits.userIsSysop ? 'Xóa trang theo WT:XN' : 'Đề nghị xóa nhanh theo WT:XN');
};
Twinkle.speedy.data = [
{
list: 'customRationale',
label: 'Tiêu chí tùy chọn' + (Morebits.userIsSysop ? ' (lý do xóa tùy chọn)' : ' sử dụng bản mẫu {{db}}'),
code: 'db',
db: 'reason',
tooltip: 'Tên bản mẫu {{db}} là viết tắt của "xóa bởi vì" (delete because). Trang sắp bị xóa phải được áp dụng tối thiểu một trong các tiêu chí xóa nhanh với lý do hợp lý. Lưu ý đây không phải là tiêu chí "chung cho tất cả trường hợp" khi bạn không thể tìm thấy bất kỳ tiêu chí xóa nhanh nào phù hợp.',
subgroup: {
name: 'reason_1',
type: 'input',
label: 'Lý do:',
size: 60
},
hideWhenMultiple: true
},
{
list: 'talkList',
label: 'C8: Trang thảo luận của trang không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'talk',
tooltip: 'Tiêu chí này không bao gồm bất kỳ trang nào hữu ích cho dự án - cụ thể là các trang thảo luận của người dùng, trang lưu trữ trang thảo luận và các trang thảo luận của các tập tin đang tồn tại ở Wikimedia Commons.'
},
{
list: 'articleList',
label: 'MT1: Không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến.',
code: 'mt1',
db: 'nocontext',
tooltip: 'Tiêu chí này áp dụng cho các mục từ "thiếu ngữ cảnh cần thiết" để nhận diện.'
},
{
list: 'articleList',
label: 'MT2: Mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
code: 'mt2',
db: 'foreign',
tooltip: 'Tiêu chí này áp dụng cho các mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
subgroup: {
name: 'foreign_source',
type: 'input',
label: 'Liên kết Interwiki đến mục từ trên wiki ngoại ngữ:',
tooltip: 'Ví dụ: fr:Bonjour'
}
},
{
list: 'articleList',
label: 'MT3: Không có nội dung thực',
code: 'mt3',
db: 'nocontent',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ không có nội dung thực (ví dụ, mục từ chỉ gồm các liên kết, thể loại, phần "Xem thêm" và một câu lặp lại tiêu đề).'
},
{
list: 'articleList',
label: 'MT7: Mục từ chưa đủ tiêu chuẩn rõ ràng',
code: 'mt7',
db: 'mt7',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ rõ ràng chưa đủ tiêu chuẩn để được đưa vào Wiktionary',
hideWhenSingle: true
},
{
list: 'articleList',
label: 'MT10: Mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn',
code: 'mt10',
db: 'mt10',
tooltip: 'Tiêu chí này áp dụng cho các mục từ có nội dung được sao chép từ một mục từ đã tồn tại trước đó.',
subgroup: {
name: 'mt10_article',
type: 'input',
label: 'Tên mục từ bị sao chép:'
}
},
{
list: 'categoryList',
label: 'TL1: Thể loại trống hoặc không cần thiết',
code: 'tl1',
db: 'catempty',
tooltip: 'Tiêu chí này áp dụng cho các thể loại trống hoặc không cần thiết. Các thể loại bảo quản (ví dụ như Thể loại:Chờ xóa) không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM1: Bản mẫu/Mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary',
code: 'bm1',
db: 'bm1',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM2: Bản mẫu/Mô đun không thể được sử dụng hữu ích theo bất kỳ cách nào hoặc theo biểu quyết đồng thuận',
code: 'bm2',
db: 'bm2',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun không được sử dụng hữu ích. Quản trị viên cần phải xem xét kỹ lưỡng bản mẫu/mô đun có thật sự hữu ích với Wiktionary hay không trước khi xóa nhanh. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh. Nếu không thể xóa nhanh, bản mẫu/mô đun nên được đưa ra thảo luận tìm đồng thuận để quyết định xóa hay giữ. Tiêu chí này sẽ có hiệu lực nếu biểu quyết đồng thuận có kết quả là xóa.',
subgroup: {
name: 'bm2_rationale',
type: 'input',
label: 'Lý do (nếu có):',
size: 60
}
},
{
list: 'userList',
label: 'TV1: Thành viên yêu cầu xóa',
code: 'tv1',
db: 'userreq',
tooltip: 'Thành viên có quyền được yêu cầu xóa các trang thành viên và trang con của mình (nhưng không phải là các trang thảo luận thành viên) theo yêu cầu cá nhân.',
subgroup: mw.config.get('wgNamespaceNumber') === 3 && !mw.config.get('wgTitle').includes('/') ? {
name: 'userreq_rationale',
type: 'input',
label: 'Lý do bắt buộc để giải thích lý do tại sao nên xóa trang thảo luận của người dùng này:',
tooltip: 'Các trang thảo luận của người dùng chỉ bị xóa trong những trường hợp đặc biệt nghiêm trọng.',
size: 60
} : null,
hideSubgroupWhenMultiple: true
},
{
list: 'userList',
code: 'tv2',
label: 'TV2: Tên thành viên chưa đăng ký',
db: 'nouser',
tooltip: 'Tiêu chí này áp dụng cho các trang thành viên chưa đăng ký/không tồn tại.'
},
{
list: 'generalList',
label: 'C1: Vô nghĩa rõ ràng',
code: 'c1',
db: 'nonsense',
tooltip: 'Tiêu chí này áp dụng với những trang chứa các đoạn văn bản hoàn toàn không mạch lạc hoặc vô nghĩa, và cả nội dung lẫn lịch sử trang đều không chứa nội dung gì có ý nghĩa.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C2: Trang thử nghiệm',
code: 'c2',
db: 'test',
tooltip: 'Tiêu chí này áp dụng với những trang được tạo ra nhằm thử nghiệm chức năng sửa đổi hoặc những chức năng khác của Wiktionary. Tiêu chí không áp dụng với những trang con của chỗ thử Wiktionary được tạo ra cho mục đích thử nghiệm.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C3. Hoàn toàn là phá hoại hoặc lừa bịp rõ ràng',
code: 'c3',
db: 'vandalism',
tooltip: 'Tiêu chí này áp dụng với những trang tung thông tin sai lệch, tin vịt (thông tin lừa bịp) rõ ràng, và các trang đổi hướng được tạo ra sau khi đổi tên những trang bị phá hoại tiêu đề về trang có tên đúng.'
},
{
list: 'generalList',
label: 'C4: Trang được tạo lại với nội dung của một trang đã từng bị xoá theo biểu quyết',
code: 'c4',
db: 'repost',
tooltip: 'Tiêu chí này áp dụng với những bản sao y hệt, dù đã được đổi sang tiêu đề mới, của một trang đã từng bị xoá theo kết quả của lần biểu quyết xoá gần đây nhất.',
subgroup: {
name: 'repost_xfd',
type: 'input',
label: 'Trang diễn ra cuộc thảo luận xóa:',
tooltip: 'Phải bắt đầu với tiền tố "Wiktionary:"',
size: 60
}
},
{
list: 'generalList',
label: 'C5: Trang do thành viên bị cấm tạo ra',
code: 'c5',
db: 'banned',
tooltip: 'Tiêu chí này áp dụng với những trang do các thành viên bị cấm tạo ra mà vi phạm lệnh cấm.',
subgroup: {
name: 'banned_user',
type: 'input',
label: 'Tên thành viên bị cấm (nếu có):',
tooltip: 'Không bắt đầu bằng tiền tố "User:" hoặc "Thành viên:"'
}
},
{
list: 'generalList',
label: 'C6: Xóa để thực hiện các tác vụ bảo trì kĩ thuật',
code: 'c6',
db: 'c6',
tooltip: 'Tiêu chí này áp dụng với các tác vụ xóa để thực hiện công tác bảo trì kĩ thuật.',
subgroup: {
name: 'c6_rationale',
type: 'input',
label: 'Lý do:',
size: 60
}
},
{
list: 'generalList',
label: 'C7: Người viết/Tác giả yêu cầu xóa',
code: 'c7',
db: 'author',
tooltip: 'Tiêu chí này áp dụng trong trường hợp chính tác giả yêu cầu xoá (một cách có thiện chí) và đây phải là tác giả đóng góp nội dung chủ yếu của trang.',
subgroup: {
name: 'author_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
tooltip: 'Liên kết đến nơi mà tác giả yêu cầu xóa.',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C8: Trang liên quan đến một trang khác không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'c8',
tooltip: 'Những trường hợp áp dụng tiêu chí này bao gồm trang thảo luận không có trang nội dung tương ứng, trang con nhưng không có trang cha mẹ bên ngoài, trang tập tin không chứa tập tin tương ứng, trang đổi hướng tới trang đích không hợp lệ, chẳng hạn như trang đích không tồn tại, trang đổi hướng bị lặp vòng, hoặc đổi hướng đến trang có tên nằm trong danh sách đen tiêu đề trang, thông báo sửa đổi không sử dụng thuộc về những trang không tồn tại hoặc bị xoá và khoá khả năng tạo mới, và các thể loại được thêm tự động nhờ các bản mẫu đã bị xoá hoặc bị đổi hướng.',
subgroup: {
name: 'c8_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C10: Trang có nội dung tấn công cá nhân',
code: 'c10',
db: 'attack',
tooltip: 'Các ví dụ của các "trang có nội dung tấn công" có thể bao gồm phỉ báng, đe dọa pháp lý, thông tin hoàn toàn với ý định quấy rối hoặc đe dọa một cá nhân hay người đang sống, có giọng điệu hoàn toàn tiêu cực và không có nguồn gốc. Những trang này nên được xóa nhanh khi không có bất cứ phiên bản sửa đổi trang nào thể hiện thái độ trung lập để lùi sửa.'
},
{
list: 'generalList',
label: 'C11: Quảng cáo, quảng bá cho một công ty, sản phẩm, dịch vụ hay cá nhân',
code: 'c11',
db: 'spam',
tooltip: 'Tiêu chí này áp dụng với những mục từ chỉ có một mục đích duy nhất là quảng cáo cho một công ty, sản phẩm, dịch vụ hay cá nhân và cần được viết lại nếu muốn đáp ứng yêu cầu bách khoa.'
},
{
list: 'generalList',
label: 'C12: Vi phạm bản quyền',
code: 'c12',
db: 'copyvio',
tooltip: 'Tiêu chí này áp dụng với các trang vi phạm bản quyền rõ ràng',
subgroup: [
{
name: 'copyvio_url',
type: 'input',
label: 'URL (nếu có):',
tooltip: 'Nếu được sao chép từ một nguồn trực tuyến, hãy đặt URL ở đây, bao gồm giao thức "http://" hoặc "https://".',
size: 60
},
{
name: 'copyvio_url2',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
},
{
name: 'copyvio_url3',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
}
]
},
{
list: 'redirectList',
label: 'ĐH2: Đổi hướng liên không gian',
code: 'dh2',
db: 'rediruser',
tooltip: 'Tiêu chí này áp dụng cho các trang đổi hướng (trừ các trang viết tắt) từ không gian chính (không gian mục từ) đến bất kỳ không gian nào, ngoại trừ các không gian sau Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp: và Phụ lục:.',
showInNamespaces: [ 0 ]
},
{
list: 'redirectList',
label: 'ĐH3: Trang đổi hướng tên sai do lỗi chính tả, lỗi bỏ dấu từ',
code: 'dh3',
db: 'redirtypo',
tooltip: 'Tiêu chí này áp dụng với các trang có tên sai, chẳng hạn như lỗi chính tả, lỗi bỏ dấu từ, lỗi trình bày... Lưu ý trong một số trường hợp, nếu tên mục từ sai nhưng phổ biến thì có thể giữ lại và đổi hướng đến trang đích có tên đúng.'
},
{
list: 'redirectList',
label: 'C8: Trang đổi hướng đến một trang không tồn tại',
code: 'c8',
db: 'redirnone',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ trang đổi hướng nào đến trang không tồn tại. Khi xóa một trang, quản trị viên lưu ý kiểm tra và xóa tất cả các trang đổi hướng đến trang vừa xóa nếu có.',
hideWhenMultiple: true
}
];
/**
* Given a list name such as talkList, fileList, redirectList, etc, return the CSDs that should be in that list.
*/
Twinkle.speedy.getCsdList = ( csdList ) => {
const list = [];
for (const item of Twinkle.speedy.data) {
if (item.list === csdList) {
const copy = Object.assign({}, item);
// Change some things to match the old spec, from before I refactored this.
delete copy.list;
delete copy.code;
copy.value = copy.db;
delete copy.db;
list.push(copy);
}
}
return list;
};
Twinkle.speedy.customRationale = Twinkle.speedy.getCsdList( 'customRationale' );
Twinkle.speedy.talkList = Twinkle.speedy.getCsdList( 'talkList' );
Twinkle.speedy.fileList = Twinkle.speedy.getCsdList( 'fileList' );
Twinkle.speedy.articleList = Twinkle.speedy.getCsdList( 'articleList' );
Twinkle.speedy.categoryList = Twinkle.speedy.getCsdList( 'categoryList' );
Twinkle.speedy.templateList = Twinkle.speedy.getCsdList( 'templateList' );
Twinkle.speedy.userList = Twinkle.speedy.getCsdList( 'userList' );
Twinkle.speedy.generalList = Twinkle.speedy.getCsdList( 'generalList' );
Twinkle.speedy.redirectList = Twinkle.speedy.getCsdList( 'redirectList' );
Twinkle.speedy.timedTextList = Twinkle.speedy.getCsdList( 'timedTextList' );
/**
* Iterate over Twinkle.speedy.data. Turn `code: 'c8', db: 'redirnone',` into `redirnone: 'c8',`
*/
Twinkle.speedy.getNormalizeHash = () => {
const hash = {};
for (const item of Twinkle.speedy.data) {
if (item.code && item.db) {
hash[item.db] = item.code;
}
}
return hash;
};
/**
* This is a map of Db-word templates to CSD codes such as mt1. For example, `"nocontext": "mt1"`
*/
Twinkle.speedy.normalizeHash = Twinkle.speedy.getNormalizeHash();
// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};
// Used by unlink feature
Twinkle.speedy.dialog = null;
// Used throughout
Twinkle.speedy.hasCSD = !!$('#delete-reason').length;
// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
Twinkle.speedy.dialog = new Morebits.SimpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
const dialog = Twinkle.speedy.dialog;
dialog.setTitle('Chọn tiêu chí xóa nhanh');
dialog.setScriptName('Twinkle');
dialog.addFooterLink('Quy định xóa nhanh', 'WT:XN');
dialog.addFooterLink('Tùy chọn CSD', 'WT:TW/PREF#speedy');
dialog.addFooterLink('Trợ giúp Twinkle', 'WT:TW/DOC#speedy');
dialog.addFooterLink('Gửi phản hồi', 'WT:TW');
const form = new Morebits.QuickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null);
if (Morebits.userIsSysop) {
form.append({
type: 'checkbox',
list: [
{
label: 'Chỉ gán nhãn trang, không xóa',
value: 'tag_only',
name: 'tag_only',
tooltip: 'Nếu bạn chỉ muốn gán nhãn trang, thay vì xóa nhanh ngay lúc này',
checked: !(Twinkle.speedy.hasCSD || (mw.config.get('wgRelevantUserName') === mw.config.get('wgUserName')) || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
const cForm = event.target.form;
const cChecked = event.target.checked;
// enable talk page checkbox
if (cForm.talkpage) {
cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
}
// enable redirects checkbox
cForm.redirects.checked = !cChecked;
// enable delete multiple
cForm.delmultiple.checked = false;
// enable notify checkbox
cForm.notify.checked = cChecked;
// enable deletion notification checkbox
cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD;
// enable multiple
cForm.multiple.checked = false;
// enable requesting creation protection
cForm.salting.checked = false;
Twinkle.speedy.callback.modeChanged(cForm);
event.stopPropagation();
}
}
]
});
const deleteOptions = form.append({
type: 'div',
name: 'delete_options'
});
deleteOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến việc xóa trang'
});
if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa trang thảo luận',
value: 'talkpage',
name: 'talkpage',
tooltip: "Tùy chọn này sẽ xóa thêm trang thảo luận của trang.",
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
event: function(event) {
event.stopPropagation();
}
}
]
});
}
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa tất cả các trang đổi hướng',
value: 'redirects',
name: 'redirects',
tooltip: 'Tùy chọn này cũng xóa thêm tất cả các trang đổi hướng đến. Hãy tránh dùng tùy chọn này cho các tác vụ xóa theo thủ tục (ví dụ: di chuyển/hợp nhất).',
checked: Twinkle.getPref('deleteRedirectsOnDelete'),
event: function (event) {
event.stopPropagation();
}
},
{
label: 'Xóa theo nhiều tiêu chí',
value: 'delmultiple',
name: 'delmultiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
},
{
label: 'Thông báo cho người tạo trang về việc xóa trang',
value: 'warnusertalk',
name: 'warnusertalk',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang, ' +
'người tạo trang cũng có thể được thông báo.',
checked: !Twinkle.speedy.hasCSD,
event: function(event) {
event.stopPropagation();
}
}
]
});
}
const tagOptions = form.append({
type: 'div',
name: 'tag_options'
});
if (Morebits.userIsSysop) {
tagOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến nhãn'
});
}
tagOptions.append({
type: 'checkbox',
list: [
{
label: 'Thông báo cho người tạo trang nếu có thể',
value: 'notify',
name: 'notify',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang. ' +
'Người tạo trang cũng có thể được hoan nghênh.',
checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn để khóa việc tạo trang',
value: 'salting',
name: 'salting',
tooltip: 'Khi được chọn, nhãn xóa nhanh sẽ được kèm theo nhãn {{salt}} để yêu cầu quản trị viên khi xóa trang áp dụng biện pháp khóa tạo trang. Chỉ chọn chức năng này nếu trang bị xóa được tạo đi tạo lại nhiều lần.',
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn với nhiều tiêu chí',
value: 'multiple',
name: 'multiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
}
]
});
form.append({
type: 'div',
id: 'prior-deletion-count',
style: 'font-style: italic'
});
form.append({
type: 'div',
name: 'work_area',
label: 'Không thể khởi chạy mô đun CSD. Vui lòng thử lại hoặc báo với các nhà phát triển Twinkle về vấn đề này.'
});
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged
}
const result = form.render();
dialog.setContent(result);
dialog.display();
Twinkle.speedy.callback.modeChanged(result);
// Check for prior deletions. Just once, upon init
Twinkle.speedy.callback.priorDeletionCount();
};
Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
const namespace = mw.config.get('wgNamespaceNumber');
// first figure out what mode we're in
const mode = {
isSysop: !!form.tag_only && !form.tag_only.checked,
isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked,
isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick'
};
if (mode.isSysop) {
$('[name=delete_options]').show();
$('[name=tag_options]').hide();
$('button.tw-speedy-submit').text('Xóa trang');
} else {
$('[name=delete_options]').hide();
$('[name=tag_options]').show();
$('button.tw-speedy-submit').text('Gán nhãn trang');
}
const work_area = new Morebits.QuickForm.Element({
type: 'div',
name: 'work_area'
});
if (mode.isMultiple && mode.isRadioClick) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
work_area.append({
type: 'div',
label: 'Khi chọn xong tiêu chí, hãy nhấp vào:'
});
work_area.append({
type: 'button',
name: 'submit-multiple',
label: mode.isSysop ? 'Xóa trang' : 'Gán thẻ trang',
event: function(event) {
Twinkle.speedy.callback[evaluateType](event);
event.stopPropagation();
}
});
}
const appendList = function(headerLabel, csdList) {
work_area.append({ type: 'header', label: headerLabel });
work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) });
};
if (mode.isSysop && !mode.isMultiple) {
appendList('Tiêu chí tùy chọn', Twinkle.speedy.customRationale);
}
if (namespace % 2 === 1 && namespace !== 3) {
// show db-talk on talk pages, but not user talk pages
appendList('Trang thảo luận', Twinkle.speedy.talkList);
}
if (!Morebits.isPageRedirect()) {
switch (namespace) {
case 0: // article
case 1: // talk
appendList('Mục từ', Twinkle.speedy.articleList);
break;
case 2: // user
case 3: // user talk
appendList('Trang thành viên', Twinkle.speedy.userList);
break;
case 6: // file
case 7: // file talk
break;
case 10: // template
case 11: // template talk
case 828: // module
case 829: // module talk
appendList('Bản mẫu/Mô đun', Twinkle.speedy.templateList);
break;
case 14: // category
case 15: // category talk
appendList('Thể loại', Twinkle.speedy.categoryList);
break;
case 710: // timed text
case 711: // timed text talk
break;
default:
break;
}
} else {
if (namespace === 2 || namespace === 3) {
appendList('Trang thành viên', Twinkle.speedy.userList);
}
appendList('Trang đổi hướng', Twinkle.speedy.redirectList);
}
let generalCriteria = Twinkle.speedy.generalList;
// custom rationale lives under general criteria when tagging
if (!mode.isSysop) {
generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria);
}
appendList('Tiêu chí chung', generalCriteria);
const old_area = Morebits.QuickForm.getElements(form, 'work_area')[0];
form.replaceChild(work_area.render(), old_area);
// if sysop, check if CSD is already on the page and fill in custom rationale
if (mode.isSysop && Twinkle.speedy.hasCSD) {
const customOption = $('input[name=csd][value=reason]')[0];
if (customOption) {
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
// force listeners to re-init
customOption.click();
customOption.parentNode.appendChild(customOption.subgroup);
}
customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' ');
}
}
};
Twinkle.speedy.callback.priorDeletionCount = function () {
const query = {
action: 'query',
format: 'json',
list: 'logevents',
letype: 'delete',
leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel
letitle: mw.config.get('wgPageName'),
leprop: '', // We're just counting we don't actually care about the entries
lelimit: 5 // A little bit goes a long way
};
new Morebits.wiki.Api('Checking for past deletions', query, ((apiobj) => {
const response = apiobj.getResponse();
const delCount = response.query.logevents.length;
if (delCount) {
let message = delCount + ' previous deletion';
if (delCount > 1) {
message += 's';
if (response.continue) {
message = 'More than ' + message;
}
// 3+ seems problematic
if (delCount >= 3) {
$('#prior-deletion-count').css('color', 'red');
}
}
// Provide a link to page logs (CSD templates have one for sysops)
const link = Morebits.htmlNode('a', '(logs)');
link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')}));
link.setAttribute('target', '_blank');
$('#prior-deletion-count').text(message + ' '); // Space before log link
$('#prior-deletion-count').append(link);
}
})).post();
};
Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
const pageNamespace = mw.config.get('wgNamespaceNumber');
const openSubgroupHandler = function(e) {
$(e.target.form).find('input').prop('disabled', true);
$(e.target.form).children().css('color', 'gray');
$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
$(e.target).parent().find('input:text')[0].focus();
e.stopPropagation();
};
const submitSubgroupHandler = function(e) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
Twinkle.speedy.callback[evaluateType](e);
e.stopPropagation();
};
return $.map(list, (critElement) => {
const criterion = $.extend({}, critElement);
if (mode.isMultiple) {
if (criterion.hideWhenMultiple) {
return null;
}
if (criterion.hideSubgroupWhenMultiple) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenSingle) {
return null;
}
if (criterion.hideSubgroupWhenSingle) {
criterion.subgroup = null;
}
}
if (mode.isSysop) {
if (criterion.hideWhenSysop) {
return null;
}
if (criterion.hideSubgroupWhenSysop) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenUser) {
return null;
}
if (criterion.hideSubgroupWhenUser) {
criterion.subgroup = null;
}
}
if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) {
return null;
}
if (criterion.showInNamespaces && !criterion.showInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.hideInNamespaces && criterion.hideInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) {
if (Array.isArray(criterion.subgroup)) {
criterion.subgroup = criterion.subgroup.concat({
type: 'button',
name: 'submit',
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
});
} else {
criterion.subgroup = [
criterion.subgroup,
{
type: 'button',
name: 'submit', // ends up being called "csd.submit" so this is OK
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
}
];
}
// FIXME: does this do anything?
criterion.event = openSubgroupHandler;
}
return criterion;
});
};
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
let code, parameters, i;
if (params.normalizeds.length > 1) {
code = '{{db-multiple';
params.utparams = {};
$.each(params.normalizeds, (index, norm) => {
code += '|' + norm.toUpperCase();
parameters = params.templateParams[index] || [];
for (const i in parameters) {
if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them
code += '|' + i + '=' + parameters[i];
}
}
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
});
code += '}}';
} else {
parameters = params.templateParams[0] || [];
code = '{{db-' + params.values[0];
for (i in parameters) {
if (typeof parameters[i] === 'string') {
code += '|' + i + '=' + parameters[i];
}
}
if (params.usertalk) {
code += '|help=off';
}
code += '}}';
params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
}
return [code, params.utparams];
},
parseWikitext: function(wikitext, callback) {
const query = {
action: 'parse',
prop: 'text',
pst: 'true',
text: wikitext,
contentmodel: 'wikitext',
title: mw.config.get('wgPageName'),
disablelimitreport: true,
format: 'json'
};
const statusIndicator = new Morebits.Status('Đang xây dựng tóm tắt xóa');
const api = new Morebits.wiki.Api('Đang phân tích cú pháp bản mẫu xóa', query, ((apiobj) => {
const reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' ');
if (!reason) {
statusIndicator.warn('Không thể tạo tóm tắt từ bản mẫu xóa');
} else {
statusIndicator.info('hoàn tất');
}
callback(reason);
}), statusIndicator);
api.post();
},
noteToCreator: function(pageobj) {
const params = pageobj.getCallbackParameters();
let initialContrib = pageobj.getCreator();
// disallow notifying yourself
if (initialContrib === mw.config.get('wgUserName')) {
Morebits.Status.warn('You (' + initialContrib + ') created this page; skipping user notification');
initialContrib = null;
// don't notify users when their user talk page is nominated/deleted
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
Morebits.Status.warn('Notifying initial contributor: this user created their own user talk page; skipping notification');
initialContrib = null;
// Check for already existing tags
} else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('The page has a deletion-related tag, and thus the creator has likely been notified. Do you want to notify them for this deletion as well?')) {
Morebits.Status.info('Notifying initial contributor', 'canceled by user; skipping notification.');
initialContrib = null;
}
if (initialContrib) {
const usertalkpage = new Morebits.wiki.Page('User talk:' + initialContrib, 'Notifying initial contributor (' + initialContrib + ')');
let notifytext, i, editsummary;
// special cases: "db" and "db-multiple"
if (params.normalizeds.length > 1) {
notifytext = '\n{{subst:db-' + (params.warnUser ? 'deleted' : 'notice') + '-multiple|1=' + Morebits.pageNameNorm;
let count = 2;
$.each(params.normalizeds, (index, norm) => {
notifytext += '|' + count++ + '=' + norm.toUpperCase();
});
} else if (params.normalizeds[0] === 'db') {
notifytext = '\n{{subst:db-reason-' + (params.warnUser ? 'deleted' : 'notice') + '|1=' + Morebits.pageNameNorm;
} else {
notifytext = '\n{{subst:db-csd-' + (params.warnUser ? 'deleted' : 'notice') + '-custom|1=';
if (params.values[0] === 'copypaste') {
notifytext += params.templateParams[0].sourcepage;
} else {
notifytext += Morebits.pageNameNorm;
}
notifytext += '|2=' + params.values[0];
}
for (i in params.utparams) {
if (typeof params.utparams[i] === 'string') {
notifytext += '|' + i + '=' + params.utparams[i];
}
}
notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~';
editsummary = 'Notification: speedy deletion' + (params.warnUser ? '' : ' nomination');
if (!params.normalizeds.includes('c10')) { // no article name in summary for G10 taggings
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
editsummary += ' of an attack page.';
}
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary);
usertalkpage.setChangeTags(Twinkle.changeTags);
usertalkpage.setCreateOption('recreate');
usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser'));
usertalkpage.setFollowRedirect(true, false);
usertalkpage.append(() => {
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
}
}, () => {
// if user could not be notified, log nomination without mentioning that notification was sent
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
});
} else if (params.lognomination) {
// log nomination even if the user notification wasn't sent
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
sysop: {
main: function(params) {
let reason;
if (!params.normalizeds.length && params.normalizeds[0] === 'db') {
reason = prompt('Nhập tóm tắt xóa để sử dụng, tóm tắt này sẽ được nhập vào nhật trình xóa:', '');
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
} else {
const code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0];
Twinkle.speedy.callbacks.parseWikitext(code, (reason) => {
if (params.promptForSummary) {
reason = prompt('Nhập bản tóm tắt xóa để sử dụng hoặc nhấn OK để chấp nhận bản tóm tắt được tạo tự động.', reason);
}
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
});
}
},
deletePage: function(reason, params) {
const thispage = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang xóa trang');
if (reason === null) {
return Morebits.Status.error('Asking for reason', 'User cancelled');
} else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) {
return Morebits.Status.error('Đang yêu cầu lý do', 'bạn đã không đưa ra một lý do xóa nhanh, tác vụ đã bị hủy bỏ.');
}
const deleteMain = function(callback) {
thispage.setEditSummary(reason);
thispage.setChangeTags(Twinkle.changeTags);
thispage.setWatchlist(params.watch);
thispage.deletePage(() => {
thispage.getStatusElement().info('đã xong');
typeof callback === 'function' && callback();
Twinkle.speedy.callbacks.sysop.deleteTalk(params);
});
};
// look up initial contributor. If prompting user for deletion reason, just display a link.
// Otherwise open the talk page directly
if (params.warnUser) {
thispage.setCallbackParameters(params);
thispage.lookupCreation((pageobj) => {
deleteMain(() => {
Twinkle.speedy.callbacks.noteToCreator(pageobj);
});
});
} else {
deleteMain();
}
},
deleteTalk: function(params) {
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'f8' &&
!document.getElementById('ca-talk').classList.contains('new')) {
const talkpage = new Morebits.wiki.Page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Đang xóa trang thảo luận');
talkpage.setEditSummary('[[WT:TCXN#C8|C8]]: Trang thảo luận của trang đã xóa [[' + Morebits.pageNameNorm + ']]');
talkpage.setChangeTags(Twinkle.changeTags);
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
// (otherwise success/failure messages for the previous action would be suppressed)
window.setTimeout(() => {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}, 1800);
} else {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}
},
deleteRedirects: function(params) {
// delete redirects
if (params.deleteRedirects) {
const query = {
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'redirects',
rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops
format: 'json'
};
const wikipedia_api = new Morebits.wiki.Api('đang lấy danh sách các trang đổi hướng...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
new Morebits.Status('Đang xóa các trang đổi hướng'));
wikipedia_api.params = params;
wikipedia_api.post();
}
// promote Unlink tool
let $link, $bigtext;
if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('hấp vào đây để đến công cụ Gỡ liên kết (Unlink)')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Removing usages of and/or links to deleted file ' + Morebits.pageNameNorm);
});
$bigtext = $('<span>')
.text('To orphan backlinks and remove instances of file usage')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
} else if (params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('nhấp vào đây để chuyển đến công cụ Gỡ liên kết')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Đang xóa các liên kết đến trang đã xóa ' + Morebits.pageNameNorm);
} );
$bigtext = $('<span>')
.text('Để gỡ các backlink')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
}
},
deleteRedirectsMain: function(apiobj) {
const response = apiobj.getResponse();
const snapshot = response.query.pages[0].redirects || [];
const total = snapshot.length;
const statusIndicator = apiobj.statelem;
if (!total) {
statusIndicator.status('không tìm thấy trang đổi hướng nào');
return;
}
statusIndicator.status('0%');
let current = 0;
const onsuccess = function(apiobjInner) {
const now = parseInt(100 * ++current / total, 10) + '%';
statusIndicator.update(now);
apiobjInner.statelem.unlink();
if (current >= total) {
statusIndicator.info(now + ' (đã hoàn tất)');
Morebits.wiki.removeCheckpoint();
}
};
Morebits.wiki.addCheckpoint();
snapshot.forEach((value) => {
const title = value.title;
const page = new Morebits.wiki.Page(title, 'Đang xóa trang đổi hướng "' + title + '"');
page.setEditSummary('[[WT:XN#C8|C8]]: Đổi hướng đến trang đã xóa [[' + Morebits.pageNameNorm + ']]');
page.setChangeTags(Twinkle.changeTags);
page.deletePage(onsuccess);
});
}
},
user: {
main: function(pageobj) {
const statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error("Có vẻ như trang không tồn tại; có thể đã bị xóa");
return;
}
const params = pageobj.getCallbackParameters();
// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
// returns => [<string> wikitext, <object> utparams]
const buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
let code = buildData[0];
params.utparams = buildData[1];
// Tag if possible, post on talk if not
if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].includes(pageobj.getContentModel()) && mw.config.get('wgNamespaceNumber') !== 710 /* TimedText */) {
let text = pageobj.getPageText();
statelem.status('Kiểm tra các nhãn trên trang...');
// check for existing deletion tags
const tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text);
// This won't make use of the db-multiple template but it probably should
if (tag && !confirm('Trang đã chứa bản mẫu xóa nhanh (CSD) {{' + tag[1] + '}}. Bạn có muốn thêm một bản mẫu xóa nhanh khác không?')) {
return;
}
const xfd = /\{\{((?:article for deletion|proposed deletion|prod blp|template for discussion)\/dated|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text);
if (xfd && !confirm('Bản mẫu xóa {{' + xfd[1] + '}} }} đã được tìm thấy trên trang. Bạn có muốn tiếp tục thêm một bản mẫu CSD?')) {
return;
}
// curate/patrol the page
if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
pageobj.triage();
}
// Wrap SD template in noinclude tags if we are in template space.
// Won't work with userboxes in userspace, or any other transcluded page outside template space
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = '<noinclude>' + code + '</noinclude>';
}
// Remove tags that become superfluous with this action
text = text.replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
if (mw.config.get('wgNamespaceNumber') === 6) {
text = Twinkle.removeMoveToCommonsTagsFromWikicode( text );
}
if (params.requestsalt) {
if (!params.normalizeds.includes('c10')) {
code += '\n{{salt}}';
} else {
code = '{{salt}}\n' + code;
}
}
if (mw.config.get('wgPageContentModel') === 'Scribunto') {
// Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work
let equals = '';
while (code.includes(']' + equals + ']')) {
equals += '=';
}
code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);';
} else if (['javascript', 'css', 'sanitized-css'].includes(mw.config.get('wgPageContentModel'))) {
// Likewise for JS/CSS pages
code = '/* ' + code + ' */';
}
// Generate edit summary for edit
let editsummary;
if (params.normalizeds.length > 1) {
editsummary = 'Đang yêu cầu xóa nhanh (';
$.each(params.normalizeds, (index, norm) => {
editsummary += '[[WT:XN#' + norm.toUpperCase() + '|XN ' + norm.toUpperCase() + ']], ';
});
editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
editsummary += ').';
} else if (params.normalizeds[0] === 'db') {
editsummary = 'Đang yêu cầu [[Wiktionary:Quy định xóa trang#xóa nhanh|xóa nhanh]] với lý do "' + params.templateParams[0]['1'] + '".';
} else {
editsummary = 'Đang yêu cầu xóa nhanh ([[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']]).';
}
// Blank attack pages
if (params.normalizeds.includes('c10')) {
text = code;
} else {
// Insert tag after short description or any hatnotes
const wikipage = new Morebits.wikitext.Page(text);
text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText();
}
pageobj.setPageText(text);
pageobj.setEditSummary(editsummary);
pageobj.setWatchlist(params.watch);
pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
} else { // Attempt to place on talk page
const talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText();
if (talkName !== pageobj.getPageName()) {
if (params.requestsalt) {
code += '\n{{salt}}';
}
pageobj.getStatusElement().warn('Unable to edit page, placing tag on talk page');
const talkPage = new Morebits.wiki.Page(talkName, 'Automatically placing tag on talk page');
talkPage.setNewSectionTitle(pageobj.getPageName() + ' nominated for CSD, request deletion');
talkPage.setNewSectionText(code + '\n\nI was unable to tag ' + pageobj.getPageName() + ' directly, so I have placed the speedy deletion tag on this page. I request deletion of the other page. ~~~~');
talkPage.setCreateOption('recreate');
talkPage.setFollowRedirect(true);
talkPage.setWatchlist(params.watch);
talkPage.setChangeTags(Twinkle.changeTags);
talkPage.setCallbackParameters(params);
talkPage.newSection(Twinkle.speedy.callbacks.user.tagComplete);
} else {
pageobj.getStatusElement().error('Page cannot be edited and no other location to place a speedy deletion request, aborting');
}
}
},
tagComplete: function(pageobj) {
const params = pageobj.getCallbackParameters();
// Notification to first contributor, will also log nomination to the user's userspace log
if (params.usertalk) {
const thispage = new Morebits.wiki.Page(Morebits.pageNameNorm);
thispage.setCallbackParameters(params);
thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator);
// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
} else if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
addToLog: function(params, initialContrib) {
const usl = new Morebits.UserspaceLogger(Twinkle.getPref('speedyLogPageName'));
usl.initialText =
"Đây là nhật trình của tất cả đề nghị [[Wiktionary:Tiêu chí xóa nhanh|xóa nhanh]] được thực hiện bởi người dùng này bằng cách sử dụng mô đun CSD của [[WT:TW|Twinkle]].\n\n" +
'Nếu bạn không muốn giữ nhật trình này nữa, bạn có thể tắt nó bằng cách sử dụng [[Wiktionary:Twinkle/Preferences|preferences panel]], và ' +
'đề cử trang này để xóa nhanh chóng dưới dạng [[WT:XN#TV1|XN TV1]].' +
(Morebits.userIsSysop ? '\n\nNhật trình này không theo dõi các thao tác xóa nhanh ngay lập tức được thực hiện bằng Twinkle.' : '');
const formatParamLog = function(normalize, csdparam, input) {
if ((normalize === 'C4' && csdparam === 'xfd') ||
(normalize === 'C6' && csdparam === 'page') ||
(normalize === 'C6' && csdparam === 'fullvotepage') ||
(normalize === 'C6' && csdparam === 'sourcepage') ||
(normalize === 'MT2' && csdparam === 'source') ||
(normalize === 'MT10' && csdparam === 'article')) {
input = '[[:' + input + ']]';
} else if (normalize === 'C5' && csdparam === 'user') {
input = '[[:User:' + input + ']]';
} else if (normalize === 'C12' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) {
input = '[' + input + ' ' + input + ']';
}
return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
};
let extraInfo = '';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
const fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : '';
let editsummary = 'Đang ghi nhật ký đề cử xóa nhanh';
let appendText = '# [[:' + Morebits.pageNameNorm;
if (!params.normalizeds.includes('c10')) { // no article name in log for G10 taggings
appendText += ']]' + fileLogLink + ': ';
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
appendText += '|Trang]] tấn công này' + fileLogLink + ': ';
editsummary += ' của một trang tấn công.';
}
if (params.normalizeds.length > 1) {
appendText += 'nhiều tiêu chí (';
$.each(params.normalizeds, (index, norm) => {
appendText += '[[WT:XN#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']], ';
});
appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma
appendText += ')';
} else if (params.normalizeds[0] === 'db') {
appendText += '{{tl|db-reason}}';
} else {
appendText += '[[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']] ({{tl|db-' + params.values[0] + '}})';
}
// If params is "empty" it will still be full of empty arrays, but ask anyway
if (params.templateParams) {
// Treat custom rationale individually
if (params.normalizeds[0] && params.normalizeds[0] === 'db') {
extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']);
} else {
params.templateParams.forEach((item, index) => {
const keys = Object.keys(item);
if (keys[0] !== undefined && keys[0].length > 0) {
// Second loop required since some items (G12, F9) may have multiple keys
keys.forEach((key, keyIndex) => {
if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') {
return true; // Not worth logging
}
extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]);
});
}
});
}
}
if (params.requestsalt) {
appendText += '; requested creation protection ([[WP:SALT|salting]])';
}
if (extraInfo) {
appendText += '; thông tin bổ sung:' + extraInfo;
}
if (initialContrib) {
appendText += '; đã thông báo {{user|1=' + initialContrib + '}}';
}
appendText += ' ~~~~~\n';
usl.changeTags = Twinkle.changeTags;
usl.log(appendText, editsummary);
}
}
};
// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
let parameters = [];
$.each(values, (index, value) => {
const currentParams = [];
switch (value) {
case 'reason':
if (form['csd.reason_1']) {
const dbrationale = form['csd.reason_1'].value;
if (!dbrationale || !dbrationale.trim()) {
alert('Lý do tùy chọn: Vui lòng nêu ra một lý do.');
parameters = null;
return false;
}
currentParams['1'] = dbrationale;
}
break;
case 'userreq': // TV1
if (form['csd.userreq_rationale']) {
const u1rationale = form['csd.userreq_rationale'].value;
if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) &&
(!u1rationale || !u1rationale.trim())) {
alert('XN TV1: Vui lòng đưa ra lý do khi đề cử xóa các trang thảo luận của người dùng.');
parameters = null;
return false;
}
currentParams.rationale = u1rationale;
}
break;
case 'repost': // C4
if (form['csd.repost_xfd']) {
const deldisc = form['csd.repost_xfd'].value;
if (deldisc) {
currentParams.xfd = deldisc;
}
}
break;
case 'banned': // C5
if (form['csd.banned_user'] && form['csd.banned_user'].value) {
currentParams.user = form['csd.banned_user'].value.replace(/^\s*User:/i, '');
}
break;
case 'gs': // C5
if (form['csd.code']) {
currentParams.code = form['csd.code'].value;
}
break;
case 'move': // C6
if (form['csd.move_page'] && form['csd.move_reason']) {
const movepage = form['csd.move_page'].value,
movereason = form['csd.move_reason'].value;
if (!movepage || !movepage.trim()) {
alert('CSD G6 (move): Please specify the page to be moved here.');
parameters = null;
return false;
}
if (!movereason || !movereason.trim()) {
alert('CSD G6 (move): Please specify the reason for the move.');
parameters = null;
return false;
}
currentParams.page = movepage;
currentParams.reason = movereason;
}
break;
case 'xfd': // C6
if (form['csd.xfd_fullvotepage']) {
const xfd = form['csd.xfd_fullvotepage'].value;
if (xfd) {
currentParams.fullvotepage = xfd;
}
}
break;
case 'copypaste': // C6
if (form['csd.copypaste_sourcepage']) {
const copypaste = form['csd.copypaste_sourcepage'].value;
if (!copypaste || !copypaste.trim()) {
alert('CSD G6 (copypaste): Please specify the source page name.');
parameters = null;
return false;
}
currentParams.sourcepage = copypaste;
}
break;
case 'c6': // C6
if (form['csd.c6_rationale'] && form['csd.c6_rationale'].value) {
currentParams.rationale = form['csd.c6_rationale'].value;
}
break;
case 'author': // C7
if (form['csd.author_rationale'] && form['csd.author_rationale'].value) {
currentParams.rationale = form['csd.author_rationale'].value;
}
break;
case 'c8': // C8
if (form['csd.c8_rationale'] && form['csd.c8_rationale'].value) {
currentParams.rationale = form['csd.c8_rationale'].value;
}
break;
case 'attack': // C10
currentParams.blanked = 'yes';
// it is actually blanked elsewhere in code, but setting the flag here
break;
case 'copyvio': // C12
if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) {
currentParams.url = form['csd.copyvio_url'].value;
}
if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) {
currentParams.url2 = form['csd.copyvio_url2'].value;
}
if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) {
currentParams.url3 = form['csd.copyvio_url3'].value;
}
break;
case 'foreign': // MT2
if (form['csd.foreign_source']) {
const foreignlink = form['csd.foreign_source'].value;
if (!foreignlink || !foreignlink.trim()) {
alert('XN MT2: Vui lòng chỉ rõ liên kết interwiki đến mục từ bị sao chép.');
parameters = null;
return false;
}
currentParams.source = foreignlink;
}
break;
case 'mt10': // C10
if (form['csd.mt10_article']) {
const duptitle = form['csd.mt10_article'].value;
if (!duptitle || !duptitle.trim()) {
alert('XN MT10: Vui lòng chỉ rõ tên mục từ trùng lặp nội dung.');
parameters = null;
return false;
}
currentParams.article = duptitle;
}
break;
case 'bm2': // T2
if (form['csd.bm2_rationale'] && form['csd.bm2_rationale'].value) {
currentParams.rationale = form['csd.bm2_rationale'].value;
}
break;
default:
break;
}
parameters.push(currentParams);
});
return parameters;
};
// Function for processing talk page notification template parameters
// key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}})
// utparams.param: for {{db-[notice|deleted]-multiple}}
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
const utparams = [];
// Special cases
if (normalized === 'db') {
utparams['2'] = parameters['1'];
} else if (normalized === 'c6') {
utparams.key1 = 'to';
utparams.value1 = Morebits.pageNameNorm;
} else if (normalized === 'c12') {
['url', 'url2', 'url3'].forEach((item, idx) => {
if (parameters[item]) {
idx++;
utparams['key' + idx] = item;
utparams['value' + idx] = utparams[item] = parameters[item];
}
});
} else {
// Handle the rest
let param;
switch (normalized) {
case 'c4':
param = 'xfd';
break;
case 'c5': // Only for db-gs, as db-g5 doesn't send a notice
param = 'code';
break;
case 'mt2':
param = 'source';
break;
case 'mt10':
param = 'article';
break;
default:
break;
}
// No harm in providing a usertalk template with the others' parameters
if (param && parameters[param]) {
utparams.key1 = param;
utparams.value1 = utparams[param] = parameters[param];
}
}
return utparams;
};
/**
* @param {Event} e
* @return {Array}
*/
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
const values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert('Vui lòng chỉ định một tiêu chí!');
return null;
}
return values;
};
Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const tag_only = form.tag_only;
if (tag_only && tag_only.checked) {
Twinkle.speedy.callback.evaluateUser(e);
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator
let watchPage, promptForSummary;
normalizeds.forEach((norm) => {
if (Twinkle.getPref('watchSpeedyPages').includes(norm)) {
watchPage = Twinkle.getPref('watchSpeedyExpiry');
}
if (Twinkle.getPref('promptForSpeedyDeletionSummary').includes(norm)) {
promptForSummary = true;
}
});
const warnusertalk = form.warnusertalk.checked && normalizeds.some((norm, index) => Twinkle.getPref('warnUserOnSpeedyDelete').includes(norm) &&
!(norm === 'g6' && values[index] !== 'copypaste') && !(norm === 'g5' && values[index] !== 'gs'));
const welcomeuser = warnusertalk && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
warnUser: warnusertalk,
welcomeuser: welcomeuser,
promptForSummary: promptForSummary,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Twinkle.speedy.callbacks.sysop.main(params);
};
Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
// var multiple = form.multiple.checked;
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page/notify the creator
const watchPage = normalizeds.some((csdCriteria) => Twinkle.getPref('watchSpeedyPages').includes(csdCriteria)) && Twinkle.getPref('watchSpeedyExpiry');
const notifyuser = form.notify.checked && normalizeds.some((norm, index) => Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').includes(norm) &&
!(norm === 'c6' && values[index] !== 'copypaste') && !(norm === 'c5' && values[index] !== 'gs'));
const welcomeuser = notifyuser && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some((norm) => !Twinkle.getPref('noLogOnSpeedyNomination').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
usertalk: notifyuser,
welcomeuser: welcomeuser,
lognomination: csdlog,
requestsalt: form.salting.checked,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'Gán nhãn hoàn tất';
const wikipedia_page = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang gán nhãn trang');
wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};
Twinkle.addInitCallback(Twinkle.speedy, 'speedy');
}());
// </nowiki>
sw2h4fj8r37g06xmz9nh1tb59d7f1oy
2353234
2353233
2026-05-14T16:59:13Z
Kateru Zakuro
34522
2353234
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinklespeedy.js: CSD module
****************************************
* Mode of invocation: Tab ("CSD")
* Active on: Non-special, existing pages
*
* NOTE FOR DEVELOPERS:
* If adding a new criterion, add it to the appropriate places at the top of
* twinkleconfig.js. Also check out the default values of the CSD preferences
* in twinkle.js, and add your new criterion to those if you think it would be
* good.
*/
Twinkle.speedy = function twinklespeedy() {
// Disable on:
// * special pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
return;
}
Twinkle.addPortletLink(Twinkle.speedy.callback, 'Xóa nhanh', 'tw-csd', Morebits.userIsSysop ? 'Xóa trang theo WT:XN' : 'Đề nghị xóa nhanh theo WT:XN');
};
Twinkle.speedy.data = [
{
list: 'customRationale',
label: 'Tiêu chí tùy chọn' + (Morebits.userIsSysop ? ' (lý do xóa tùy chọn)' : ' sử dụng bản mẫu {{db}}'),
code: 'db',
db: 'reason',
tooltip: 'Tên bản mẫu {{db}} là viết tắt của "xóa bởi vì" (delete because). Trang sắp bị xóa phải được áp dụng tối thiểu một trong các tiêu chí xóa nhanh với lý do hợp lý. Lưu ý đây không phải là tiêu chí "chung cho tất cả trường hợp" khi bạn không thể tìm thấy bất kỳ tiêu chí xóa nhanh nào phù hợp.',
subgroup: {
name: 'reason_1',
type: 'input',
label: 'Lý do:',
size: 60
},
hideWhenMultiple: true
},
{
list: 'talkList',
label: 'C8: Trang thảo luận của trang không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'talk',
tooltip: 'Tiêu chí này không bao gồm bất kỳ trang nào hữu ích cho dự án - cụ thể là các trang thảo luận của người dùng, trang lưu trữ trang thảo luận và các trang thảo luận của các tập tin đang tồn tại ở Wikimedia Commons.'
},
{
list: 'articleList',
label: 'MT1: Không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến.',
code: 'mt1',
db: 'nocontext',
tooltip: 'Tiêu chí này áp dụng cho các mục từ "thiếu ngữ cảnh cần thiết" để nhận diện.'
},
{
list: 'articleList',
label: 'MT2: Mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
code: 'mt2',
db: 'foreign',
tooltip: 'Tiêu chí này áp dụng cho các mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
subgroup: {
name: 'foreign_source',
type: 'input',
label: 'Liên kết Interwiki đến mục từ trên wiki ngoại ngữ:',
tooltip: 'Ví dụ: fr:Bonjour'
}
},
{
list: 'articleList',
label: 'MT3: Không có nội dung thực',
code: 'mt3',
db: 'nocontent',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ không có nội dung thực (ví dụ, mục từ chỉ gồm các liên kết, thể loại, phần "Xem thêm" và một câu lặp lại tiêu đề).'
},
{
list: 'articleList',
label: 'MT7: Mục từ chưa đủ tiêu chuẩn rõ ràng',
code: 'mt7',
db: 'mt7',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ rõ ràng chưa đủ tiêu chuẩn để được đưa vào Wiktionary',
hideWhenSingle: true
},
{
list: 'articleList',
label: 'MT10: Mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn',
code: 'mt10',
db: 'mt10',
tooltip: 'Tiêu chí này áp dụng cho các mục từ có nội dung được sao chép từ một mục từ đã tồn tại trước đó.',
subgroup: {
name: 'mt10_article',
type: 'input',
label: 'Tên mục từ bị sao chép:'
}
},
{
list: 'categoryList',
label: 'TL1: Thể loại trống hoặc không cần thiết',
code: 'tl1',
db: 'catempty',
tooltip: 'Tiêu chí này áp dụng cho các thể loại trống hoặc không cần thiết. Các thể loại bảo quản (ví dụ như Thể loại:Chờ xóa) không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM1: Bản mẫu/Mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary',
code: 'bm1',
db: 'bm1',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM2: Bản mẫu/Mô đun không thể được sử dụng hữu ích theo bất kỳ cách nào hoặc theo biểu quyết đồng thuận',
code: 'bm2',
db: 'bm2',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun không được sử dụng hữu ích. Quản trị viên cần phải xem xét kỹ lưỡng bản mẫu/mô đun có thật sự hữu ích với Wiktionary hay không trước khi xóa nhanh. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh. Nếu không thể xóa nhanh, bản mẫu/mô đun nên được đưa ra thảo luận tìm đồng thuận để quyết định xóa hay giữ. Tiêu chí này sẽ có hiệu lực nếu biểu quyết đồng thuận có kết quả là xóa.',
subgroup: {
name: 'bm2_rationale',
type: 'input',
label: 'Lý do (nếu có):',
size: 60
}
},
{
list: 'userList',
label: 'TV1: Thành viên yêu cầu xóa',
code: 'tv1',
db: 'userreq',
tooltip: 'Thành viên có quyền được yêu cầu xóa các trang thành viên và trang con của mình (nhưng không phải là các trang thảo luận thành viên) theo yêu cầu cá nhân.',
subgroup: mw.config.get('wgNamespaceNumber') === 3 && !mw.config.get('wgTitle').includes('/') ? {
name: 'userreq_rationale',
type: 'input',
label: 'Lý do bắt buộc để giải thích lý do tại sao nên xóa trang thảo luận của người dùng này:',
tooltip: 'Các trang thảo luận của người dùng chỉ bị xóa trong những trường hợp đặc biệt nghiêm trọng.',
size: 60
} : null,
hideSubgroupWhenMultiple: true
},
{
list: 'userList',
code: 'tv2',
label: 'TV2: Tên thành viên chưa đăng ký',
db: 'nouser',
tooltip: 'Tiêu chí này áp dụng cho các trang thành viên chưa đăng ký/không tồn tại.'
},
{
list: 'generalList',
label: 'C1: Vô nghĩa rõ ràng',
code: 'c1',
db: 'nonsense',
tooltip: 'Tiêu chí này áp dụng với những trang chứa các đoạn văn bản hoàn toàn không mạch lạc hoặc vô nghĩa, và cả nội dung lẫn lịch sử trang đều không chứa nội dung gì có ý nghĩa.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C2: Trang thử nghiệm',
code: 'c2',
db: 'test',
tooltip: 'Tiêu chí này áp dụng với những trang được tạo ra nhằm thử nghiệm chức năng sửa đổi hoặc những chức năng khác của Wiktionary. Tiêu chí không áp dụng với những trang con của chỗ thử Wiktionary được tạo ra cho mục đích thử nghiệm.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C3. Hoàn toàn là phá hoại hoặc lừa bịp rõ ràng',
code: 'c3',
db: 'vandalism',
tooltip: 'Tiêu chí này áp dụng với những trang tung thông tin sai lệch, tin vịt (thông tin lừa bịp) rõ ràng, và các trang đổi hướng được tạo ra sau khi đổi tên những trang bị phá hoại tiêu đề về trang có tên đúng.'
},
{
list: 'generalList',
label: 'C4: Trang được tạo lại với nội dung của một trang đã từng bị xoá theo biểu quyết',
code: 'c4',
db: 'repost',
tooltip: 'Tiêu chí này áp dụng với những bản sao y hệt, dù đã được đổi sang tiêu đề mới, của một trang đã từng bị xoá theo kết quả của lần biểu quyết xoá gần đây nhất.',
subgroup: {
name: 'repost_xfd',
type: 'input',
label: 'Trang diễn ra cuộc thảo luận xóa:',
tooltip: 'Phải bắt đầu với tiền tố "Wiktionary:"',
size: 60
}
},
{
list: 'generalList',
label: 'C5: Trang do thành viên bị cấm tạo ra',
code: 'c5',
db: 'banned',
tooltip: 'Tiêu chí này áp dụng với những trang do các thành viên bị cấm tạo ra mà vi phạm lệnh cấm.',
subgroup: {
name: 'banned_user',
type: 'input',
label: 'Tên thành viên bị cấm (nếu có):',
tooltip: 'Không bắt đầu bằng tiền tố "User:" hoặc "Thành viên:"'
}
},
{
list: 'generalList',
label: 'C6: Xóa để thực hiện các tác vụ bảo trì kĩ thuật',
code: 'c6',
db: 'c6',
tooltip: 'Tiêu chí này áp dụng với các tác vụ xóa để thực hiện công tác bảo trì kĩ thuật.',
subgroup: {
name: 'c6_rationale',
type: 'input',
label: 'Lý do:',
size: 60
}
},
{
list: 'generalList',
label: 'C7: Người viết/Tác giả yêu cầu xóa',
code: 'c7',
db: 'author',
tooltip: 'Tiêu chí này áp dụng trong trường hợp chính tác giả yêu cầu xoá (một cách có thiện chí) và đây phải là tác giả đóng góp nội dung chủ yếu của trang.',
subgroup: {
name: 'author_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
tooltip: 'Liên kết đến nơi mà tác giả yêu cầu xóa.',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C8: Trang liên quan đến một trang khác không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'c8',
tooltip: 'Những trường hợp áp dụng tiêu chí này bao gồm trang thảo luận không có trang nội dung tương ứng, trang con nhưng không có trang cha mẹ bên ngoài, trang tập tin không chứa tập tin tương ứng, trang đổi hướng tới trang đích không hợp lệ, chẳng hạn như trang đích không tồn tại, trang đổi hướng bị lặp vòng, hoặc đổi hướng đến trang có tên nằm trong danh sách đen tiêu đề trang, thông báo sửa đổi không sử dụng thuộc về những trang không tồn tại hoặc bị xoá và khoá khả năng tạo mới, và các thể loại được thêm tự động nhờ các bản mẫu đã bị xoá hoặc bị đổi hướng.',
subgroup: {
name: 'c8_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C10: Trang có nội dung tấn công cá nhân',
code: 'c10',
db: 'attack',
tooltip: 'Các ví dụ của các "trang có nội dung tấn công" có thể bao gồm phỉ báng, đe dọa pháp lý, thông tin hoàn toàn với ý định quấy rối hoặc đe dọa một cá nhân hay người đang sống, có giọng điệu hoàn toàn tiêu cực và không có nguồn gốc. Những trang này nên được xóa nhanh khi không có bất cứ phiên bản sửa đổi trang nào thể hiện thái độ trung lập để lùi sửa.'
},
{
list: 'generalList',
label: 'C11: Quảng cáo, quảng bá cho một công ty, sản phẩm, dịch vụ hay cá nhân',
code: 'c11',
db: 'spam',
tooltip: 'Tiêu chí này áp dụng với những mục từ chỉ có một mục đích duy nhất là quảng cáo cho một công ty, sản phẩm, dịch vụ hay cá nhân và cần được viết lại nếu muốn đáp ứng yêu cầu bách khoa.'
},
{
list: 'generalList',
label: 'C12: Vi phạm bản quyền',
code: 'c12',
db: 'copyvio',
tooltip: 'Tiêu chí này áp dụng với các trang vi phạm bản quyền rõ ràng',
subgroup: [
{
name: 'copyvio_url',
type: 'input',
label: 'URL (nếu có):',
tooltip: 'Nếu được sao chép từ một nguồn trực tuyến, hãy đặt URL ở đây, bao gồm giao thức "http://" hoặc "https://".',
size: 60
},
{
name: 'copyvio_url2',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
},
{
name: 'copyvio_url3',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
}
]
},
{
list: 'redirectList',
label: 'ĐH2: Đổi hướng liên không gian',
code: 'dh2',
db: 'rediruser',
tooltip: 'Tiêu chí này áp dụng cho các trang đổi hướng (trừ các trang viết tắt) từ không gian chính (không gian mục từ) đến bất kỳ không gian nào, ngoại trừ các không gian sau Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp: và Phụ lục:.',
showInNamespaces: [ 0 ]
},
{
list: 'redirectList',
label: 'ĐH3: Trang đổi hướng tên sai do lỗi chính tả, lỗi bỏ dấu từ',
code: 'dh3',
db: 'redirtypo',
tooltip: 'Tiêu chí này áp dụng với các trang có tên sai, chẳng hạn như lỗi chính tả, lỗi bỏ dấu từ, lỗi trình bày... Lưu ý trong một số trường hợp, nếu tên mục từ sai nhưng phổ biến thì có thể giữ lại và đổi hướng đến trang đích có tên đúng.'
},
{
list: 'redirectList',
label: 'C8: Trang đổi hướng đến một trang không tồn tại',
code: 'c8',
db: 'redirnone',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ trang đổi hướng nào đến trang không tồn tại. Khi xóa một trang, quản trị viên lưu ý kiểm tra và xóa tất cả các trang đổi hướng đến trang vừa xóa nếu có.',
hideWhenMultiple: true
}
];
/**
* Given a list name such as talkList, fileList, redirectList, etc, return the CSDs that should be in that list.
*/
Twinkle.speedy.getCsdList = ( csdList ) => {
const list = [];
for (const item of Twinkle.speedy.data) {
if (item.list === csdList) {
const copy = Object.assign({}, item);
// Change some things to match the old spec, from before I refactored this.
delete copy.list;
delete copy.code;
copy.value = copy.db;
delete copy.db;
list.push(copy);
}
}
return list;
};
Twinkle.speedy.customRationale = Twinkle.speedy.getCsdList( 'customRationale' );
Twinkle.speedy.talkList = Twinkle.speedy.getCsdList( 'talkList' );
Twinkle.speedy.fileList = Twinkle.speedy.getCsdList( 'fileList' );
Twinkle.speedy.articleList = Twinkle.speedy.getCsdList( 'articleList' );
Twinkle.speedy.categoryList = Twinkle.speedy.getCsdList( 'categoryList' );
Twinkle.speedy.templateList = Twinkle.speedy.getCsdList( 'templateList' );
Twinkle.speedy.userList = Twinkle.speedy.getCsdList( 'userList' );
Twinkle.speedy.generalList = Twinkle.speedy.getCsdList( 'generalList' );
Twinkle.speedy.redirectList = Twinkle.speedy.getCsdList( 'redirectList' );
Twinkle.speedy.timedTextList = Twinkle.speedy.getCsdList( 'timedTextList' );
/**
* Iterate over Twinkle.speedy.data. Turn `code: 'c8', db: 'redirnone',` into `redirnone: 'c8',`
*/
Twinkle.speedy.getNormalizeHash = () => {
const hash = {};
for (const item of Twinkle.speedy.data) {
if (item.code && item.db) {
hash[item.db] = item.code;
}
}
return hash;
};
/**
* This is a map of Db-word templates to CSD codes such as mt1. For example, `"nocontext": "mt1"`
*/
Twinkle.speedy.normalizeHash = Twinkle.speedy.getNormalizeHash();
// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};
// Used by unlink feature
Twinkle.speedy.dialog = null;
// Used throughout
Twinkle.speedy.hasCSD = !!$('#delete-reason').length;
// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
Twinkle.speedy.dialog = new Morebits.SimpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
const dialog = Twinkle.speedy.dialog;
dialog.setTitle('Chọn tiêu chí xóa nhanh');
dialog.setScriptName('Twinkle');
dialog.addFooterLink('Quy định xóa nhanh', 'WT:XN');
dialog.addFooterLink('Tùy chọn CSD', 'WT:TW/PREF#speedy');
dialog.addFooterLink('Trợ giúp Twinkle', 'WT:TW/DOC#speedy');
dialog.addFooterLink('Gửi phản hồi', 'WT:TW');
const form = new Morebits.QuickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null);
if (Morebits.userIsSysop) {
form.append({
type: 'checkbox',
list: [
{
label: 'Chỉ gán nhãn trang, không xóa',
value: 'tag_only',
name: 'tag_only',
tooltip: 'Nếu bạn chỉ muốn gán nhãn trang, thay vì xóa nhanh ngay lúc này',
checked: !(Twinkle.speedy.hasCSD || (mw.config.get('wgRelevantUserName') === mw.config.get('wgUserName')) || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
const cForm = event.target.form;
const cChecked = event.target.checked;
// enable talk page checkbox
if (cForm.talkpage) {
cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
}
// enable redirects checkbox
cForm.redirects.checked = !cChecked;
// enable delete multiple
cForm.delmultiple.checked = false;
// enable notify checkbox
cForm.notify.checked = cChecked;
// enable deletion notification checkbox
cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD;
// enable multiple
cForm.multiple.checked = false;
// enable requesting creation protection
cForm.salting.checked = false;
Twinkle.speedy.callback.modeChanged(cForm);
event.stopPropagation();
}
}
]
});
const deleteOptions = form.append({
type: 'div',
name: 'delete_options'
});
deleteOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến việc xóa trang'
});
if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa trang thảo luận',
value: 'talkpage',
name: 'talkpage',
tooltip: "Tùy chọn này sẽ xóa thêm trang thảo luận của trang.",
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
event: function(event) {
event.stopPropagation();
}
}
]
});
}
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa tất cả các trang đổi hướng',
value: 'redirects',
name: 'redirects',
tooltip: 'Tùy chọn này cũng xóa thêm tất cả các trang đổi hướng đến. Hãy tránh dùng tùy chọn này cho các tác vụ xóa theo thủ tục (ví dụ: di chuyển/hợp nhất).',
checked: Twinkle.getPref('deleteRedirectsOnDelete'),
event: function (event) {
event.stopPropagation();
}
},
{
label: 'Xóa theo nhiều tiêu chí',
value: 'delmultiple',
name: 'delmultiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
},
{
label: 'Thông báo cho người tạo trang về việc xóa trang',
value: 'warnusertalk',
name: 'warnusertalk',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang, ' +
'người tạo trang cũng có thể được thông báo.',
checked: !Twinkle.speedy.hasCSD,
event: function(event) {
event.stopPropagation();
}
}
]
});
}
const tagOptions = form.append({
type: 'div',
name: 'tag_options'
});
if (Morebits.userIsSysop) {
tagOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến nhãn'
});
}
tagOptions.append({
type: 'checkbox',
list: [
{
label: 'Thông báo cho người tạo trang nếu có thể',
value: 'notify',
name: 'notify',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang. ' +
'Người tạo trang cũng có thể được hoan nghênh.',
checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn để khóa việc tạo trang',
value: 'salting',
name: 'salting',
tooltip: 'Khi được chọn, nhãn xóa nhanh sẽ được kèm theo nhãn {{salt}} để yêu cầu quản trị viên khi xóa trang áp dụng biện pháp khóa tạo trang. Chỉ chọn chức năng này nếu trang bị xóa được tạo đi tạo lại nhiều lần.',
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn với nhiều tiêu chí',
value: 'multiple',
name: 'multiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
}
]
});
form.append({
type: 'div',
id: 'prior-deletion-count',
style: 'font-style: italic'
});
form.append({
type: 'div',
name: 'work_area',
label: 'Không thể khởi chạy mô đun CSD. Vui lòng thử lại hoặc báo với các nhà phát triển Twinkle về vấn đề này.'
});
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged
}
const result = form.render();
dialog.setContent(result);
dialog.display();
Twinkle.speedy.callback.modeChanged(result);
// Check for prior deletions. Just once, upon init
Twinkle.speedy.callback.priorDeletionCount();
};
Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
const namespace = mw.config.get('wgNamespaceNumber');
// first figure out what mode we're in
const mode = {
isSysop: !!form.tag_only && !form.tag_only.checked,
isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked,
isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick'
};
if (mode.isSysop) {
$('[name=delete_options]').show();
$('[name=tag_options]').hide();
$('button.tw-speedy-submit').text('Xóa trang');
} else {
$('[name=delete_options]').hide();
$('[name=tag_options]').show();
$('button.tw-speedy-submit').text('Gán nhãn trang');
}
const work_area = new Morebits.QuickForm.Element({
type: 'div',
name: 'work_area'
});
if (mode.isMultiple && mode.isRadioClick) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
work_area.append({
type: 'div',
label: 'Khi chọn xong tiêu chí, hãy nhấp vào:'
});
work_area.append({
type: 'button',
name: 'submit-multiple',
label: mode.isSysop ? 'Xóa trang' : 'Gán thẻ trang',
event: function(event) {
Twinkle.speedy.callback[evaluateType](event);
event.stopPropagation();
}
});
}
const appendList = function(headerLabel, csdList) {
work_area.append({ type: 'header', label: headerLabel });
work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) });
};
if (mode.isSysop && !mode.isMultiple) {
appendList('Tiêu chí tùy chọn', Twinkle.speedy.customRationale);
}
if (namespace % 2 === 1 && namespace !== 3) {
// show db-talk on talk pages, but not user talk pages
appendList('Trang thảo luận', Twinkle.speedy.talkList);
}
if (!Morebits.isPageRedirect()) {
switch (namespace) {
case 0: // article
case 1: // talk
appendList('Mục từ', Twinkle.speedy.articleList);
break;
case 2: // user
case 3: // user talk
appendList('Trang thành viên', Twinkle.speedy.userList);
break;
case 6: // file
case 7: // file talk
break;
case 10: // template
case 11: // template talk
case 828: // module
case 829: // module talk
appendList('Bản mẫu/Mô đun', Twinkle.speedy.templateList);
break;
case 14: // category
case 15: // category talk
appendList('Thể loại', Twinkle.speedy.categoryList);
break;
case 710: // timed text
case 711: // timed text talk
break;
default:
break;
}
} else {
if (namespace === 2 || namespace === 3) {
appendList('Trang thành viên', Twinkle.speedy.userList);
}
appendList('Trang đổi hướng', Twinkle.speedy.redirectList);
}
let generalCriteria = Twinkle.speedy.generalList;
// custom rationale lives under general criteria when tagging
if (!mode.isSysop) {
generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria);
}
appendList('Tiêu chí chung', generalCriteria);
const old_area = Morebits.QuickForm.getElements(form, 'work_area')[0];
form.replaceChild(work_area.render(), old_area);
// if sysop, check if CSD is already on the page and fill in custom rationale
if (mode.isSysop && Twinkle.speedy.hasCSD) {
const customOption = $('input[name=csd][value=reason]')[0];
if (customOption) {
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
// force listeners to re-init
customOption.click();
customOption.parentNode.appendChild(customOption.subgroup);
}
customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' ');
}
}
};
Twinkle.speedy.callback.priorDeletionCount = function () {
const query = {
action: 'query',
format: 'json',
list: 'logevents',
letype: 'delete',
leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel
letitle: mw.config.get('wgPageName'),
leprop: '', // We're just counting we don't actually care about the entries
lelimit: 5 // A little bit goes a long way
};
new Morebits.wiki.Api('Checking for past deletions', query, ((apiobj) => {
const response = apiobj.getResponse();
const delCount = response.query.logevents.length;
if (delCount) {
let message = delCount + ' previous deletion';
if (delCount > 1) {
message += 's';
if (response.continue) {
message = 'More than ' + message;
}
// 3+ seems problematic
if (delCount >= 3) {
$('#prior-deletion-count').css('color', 'red');
}
}
// Provide a link to page logs (CSD templates have one for sysops)
const link = Morebits.htmlNode('a', '(logs)');
link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')}));
link.setAttribute('target', '_blank');
$('#prior-deletion-count').text(message + ' '); // Space before log link
$('#prior-deletion-count').append(link);
}
})).post();
};
Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
const pageNamespace = mw.config.get('wgNamespaceNumber');
const openSubgroupHandler = function(e) {
$(e.target.form).find('input').prop('disabled', true);
$(e.target.form).children().css('color', 'gray');
$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
$(e.target).parent().find('input:text')[0].focus();
e.stopPropagation();
};
const submitSubgroupHandler = function(e) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
Twinkle.speedy.callback[evaluateType](e);
e.stopPropagation();
};
return $.map(list, (critElement) => {
const criterion = $.extend({}, critElement);
if (mode.isMultiple) {
if (criterion.hideWhenMultiple) {
return null;
}
if (criterion.hideSubgroupWhenMultiple) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenSingle) {
return null;
}
if (criterion.hideSubgroupWhenSingle) {
criterion.subgroup = null;
}
}
if (mode.isSysop) {
if (criterion.hideWhenSysop) {
return null;
}
if (criterion.hideSubgroupWhenSysop) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenUser) {
return null;
}
if (criterion.hideSubgroupWhenUser) {
criterion.subgroup = null;
}
}
if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) {
return null;
}
if (criterion.showInNamespaces && !criterion.showInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.hideInNamespaces && criterion.hideInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) {
if (Array.isArray(criterion.subgroup)) {
criterion.subgroup = criterion.subgroup.concat({
type: 'button',
name: 'submit',
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
});
} else {
criterion.subgroup = [
criterion.subgroup,
{
type: 'button',
name: 'submit', // ends up being called "csd.submit" so this is OK
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
}
];
}
// FIXME: does this do anything?
criterion.event = openSubgroupHandler;
}
return criterion;
});
};
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
let code, parameters, i;
if (params.normalizeds.length > 1) {
code = '{{db-multiple';
params.utparams = {};
$.each(params.normalizeds, (index, norm) => {
code += '|' + norm.toUpperCase();
parameters = params.templateParams[index] || [];
for (const i in parameters) {
if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them
code += '|' + i + '=' + parameters[i];
}
}
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
});
code += '}}';
} else {
parameters = params.templateParams[0] || [];
code = '{{db-' + params.values[0];
for (i in parameters) {
if (typeof parameters[i] === 'string') {
code += '|' + i + '=' + parameters[i];
}
}
if (params.usertalk) {
code += '|help=off';
}
code += '}}';
params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
}
return [code, params.utparams];
},
parseWikitext: function(wikitext, callback) {
const query = {
action: 'parse',
prop: 'text',
pst: 'true',
text: wikitext,
contentmodel: 'wikitext',
title: mw.config.get('wgPageName'),
disablelimitreport: true,
format: 'json'
};
const statusIndicator = new Morebits.Status('Đang xây dựng tóm tắt xóa');
const api = new Morebits.wiki.Api('Đang phân tích cú pháp bản mẫu xóa', query, ((apiobj) => {
const reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' ');
if (!reason) {
statusIndicator.warn('Không thể tạo tóm tắt từ bản mẫu xóa');
} else {
statusIndicator.info('hoàn tất');
}
callback(reason);
}), statusIndicator);
api.post();
},
noteToCreator: function(pageobj) {
const params = pageobj.getCallbackParameters();
let initialContrib = pageobj.getCreator();
// disallow notifying yourself
if (initialContrib === mw.config.get('wgUserName')) {
Morebits.Status.warn('You (' + initialContrib + ') created this page; skipping user notification');
initialContrib = null;
// don't notify users when their user talk page is nominated/deleted
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
Morebits.Status.warn('Notifying initial contributor: this user created their own user talk page; skipping notification');
initialContrib = null;
// Check for already existing tags
} else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('The page has a deletion-related tag, and thus the creator has likely been notified. Do you want to notify them for this deletion as well?')) {
Morebits.Status.info('Notifying initial contributor', 'canceled by user; skipping notification.');
initialContrib = null;
}
if (initialContrib) {
const usertalkpage = new Morebits.wiki.Page('User talk:' + initialContrib, 'Notifying initial contributor (' + initialContrib + ')');
let notifytext, i, editsummary;
// special cases: "db" and "db-multiple"
if (params.normalizeds.length > 1) {
notifytext = '\n{{subst:db-' + (params.warnUser ? 'deleted' : 'notice') + '-multiple|1=' + Morebits.pageNameNorm;
let count = 2;
$.each(params.normalizeds, (index, norm) => {
notifytext += '|' + count++ + '=' + norm.toUpperCase();
});
} else if (params.normalizeds[0] === 'db') {
notifytext = '\n{{subst:db-reason-' + (params.warnUser ? 'deleted' : 'notice') + '|1=' + Morebits.pageNameNorm;
} else {
notifytext = '\n{{subst:db-csd-' + (params.warnUser ? 'deleted' : 'notice') + '-custom|1=';
if (params.values[0] === 'copypaste') {
notifytext += params.templateParams[0].sourcepage;
} else {
notifytext += Morebits.pageNameNorm;
}
notifytext += '|2=' + params.values[0];
}
for (i in params.utparams) {
if (typeof params.utparams[i] === 'string') {
notifytext += '|' + i + '=' + params.utparams[i];
}
}
notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~';
editsummary = 'Notification: speedy deletion' + (params.warnUser ? '' : ' nomination');
if (!params.normalizeds.includes('c10')) { // no article name in summary for G10 taggings
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
editsummary += ' of an attack page.';
}
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary);
usertalkpage.setChangeTags(Twinkle.changeTags);
usertalkpage.setCreateOption('recreate');
usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser'));
usertalkpage.setFollowRedirect(true, false);
usertalkpage.append(() => {
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
}
}, () => {
// if user could not be notified, log nomination without mentioning that notification was sent
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
});
} else if (params.lognomination) {
// log nomination even if the user notification wasn't sent
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
sysop: {
main: function(params) {
let reason;
if (!params.normalizeds.length && params.normalizeds[0] === 'db') {
reason = prompt('Nhập tóm tắt xóa để sử dụng, tóm tắt này sẽ được nhập vào nhật trình xóa:', '');
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
} else {
const code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0];
Twinkle.speedy.callbacks.parseWikitext(code, (reason) => {
if (params.promptForSummary) {
reason = prompt('Nhập bản tóm tắt xóa để sử dụng hoặc nhấn OK để chấp nhận bản tóm tắt được tạo tự động.', reason);
}
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
});
}
},
deletePage: function(reason, params) {
const thispage = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang xóa trang');
if (reason === null) {
return Morebits.Status.error('Asking for reason', 'User cancelled');
} else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) {
return Morebits.Status.error('Đang yêu cầu lý do', 'bạn đã không đưa ra một lý do xóa nhanh, tác vụ đã bị hủy bỏ.');
}
const deleteMain = function(callback) {
thispage.setEditSummary(reason);
thispage.setChangeTags(Twinkle.changeTags);
thispage.setWatchlist(params.watch);
thispage.deletePage(() => {
thispage.getStatusElement().info('đã xong');
typeof callback === 'function' && callback();
Twinkle.speedy.callbacks.sysop.deleteTalk(params);
});
};
// look up initial contributor. If prompting user for deletion reason, just display a link.
// Otherwise open the talk page directly
if (params.warnUser) {
thispage.setCallbackParameters(params);
thispage.lookupCreation((pageobj) => {
deleteMain(() => {
Twinkle.speedy.callbacks.noteToCreator(pageobj);
});
});
} else {
deleteMain();
}
},
deleteTalk: function(params) {
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'f8' &&
!document.getElementById('ca-talk').classList.contains('new')) {
const talkpage = new Morebits.wiki.Page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Đang xóa trang thảo luận');
talkpage.setEditSummary('[[WT:TCXN#C8|C8]]: Trang thảo luận của trang đã xóa [[' + Morebits.pageNameNorm + ']]');
talkpage.setChangeTags(Twinkle.changeTags);
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
// (otherwise success/failure messages for the previous action would be suppressed)
window.setTimeout(() => {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}, 1800);
} else {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}
},
deleteRedirects: function(params) {
// delete redirects
if (params.deleteRedirects) {
const query = {
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'redirects',
rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops
format: 'json'
};
const wikipedia_api = new Morebits.wiki.Api('đang lấy danh sách các trang đổi hướng...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
new Morebits.Status('Đang xóa các trang đổi hướng'));
wikipedia_api.params = params;
wikipedia_api.post();
}
// promote Unlink tool
let $link, $bigtext;
if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('hấp vào đây để đến công cụ Gỡ liên kết (Unlink)')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Removing usages of and/or links to deleted file ' + Morebits.pageNameNorm);
});
$bigtext = $('<span>')
.text('To orphan backlinks and remove instances of file usage')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
} else if (params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('nhấp vào đây để chuyển đến công cụ Gỡ liên kết')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Đang xóa các liên kết đến trang đã xóa ' + Morebits.pageNameNorm);
} );
$bigtext = $('<span>')
.text('Để gỡ các backlink')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
}
},
deleteRedirectsMain: function(apiobj) {
const response = apiobj.getResponse();
const snapshot = response.query.pages[0].redirects || [];
const total = snapshot.length;
const statusIndicator = apiobj.statelem;
if (!total) {
statusIndicator.status('không tìm thấy trang đổi hướng nào');
return;
}
statusIndicator.status('0%');
let current = 0;
const onsuccess = function(apiobjInner) {
const now = parseInt(100 * ++current / total, 10) + '%';
statusIndicator.update(now);
apiobjInner.statelem.unlink();
if (current >= total) {
statusIndicator.info(now + ' (đã hoàn tất)');
Morebits.wiki.removeCheckpoint();
}
};
Morebits.wiki.addCheckpoint();
snapshot.forEach((value) => {
const title = value.title;
const page = new Morebits.wiki.Page(title, 'Đang xóa trang đổi hướng "' + title + '"');
page.setEditSummary('[[WT:XN#C8|C8]]: Đổi hướng đến trang đã xóa [[' + Morebits.pageNameNorm + ']]');
page.setChangeTags(Twinkle.changeTags);
page.deletePage(onsuccess);
});
}
},
user: {
main: function(pageobj) {
const statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error("Có vẻ như trang không tồn tại; có thể đã bị xóa");
return;
}
const params = pageobj.getCallbackParameters();
// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
// returns => [<string> wikitext, <object> utparams]
const buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
let code = buildData[0];
params.utparams = buildData[1];
// Tag if possible, post on talk if not
if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].includes(pageobj.getContentModel()) && mw.config.get('wgNamespaceNumber') !== 710 /* TimedText */) {
let text = pageobj.getPageText();
statelem.status('Kiểm tra các nhãn trên trang...');
// check for existing deletion tags
const tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text);
// This won't make use of the db-multiple template but it probably should
if (tag && !confirm('Trang đã chứa bản mẫu xóa nhanh (CSD) {{' + tag[1] + '}}. Bạn có muốn thêm một bản mẫu xóa nhanh khác không?')) {
return;
}
const xfd = /\{\{((?:article for deletion|proposed deletion|prod blp|template for discussion)\/dated|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text);
if (xfd && !confirm('Bản mẫu xóa {{' + xfd[1] + '}} }} đã được tìm thấy trên trang. Bạn có muốn tiếp tục thêm một bản mẫu CSD?')) {
return;
}
// curate/patrol the page
if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
pageobj.triage();
}
// Wrap SD template in noinclude tags if we are in template space.
// Won't work with userboxes in userspace, or any other transcluded page outside template space
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = '<noinclude>' + code + '</noinclude>';
}
// Remove tags that become superfluous with this action
text = text.replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
if (mw.config.get('wgNamespaceNumber') === 6) {
text = Twinkle.removeMoveToCommonsTagsFromWikicode( text );
}
if (params.requestsalt) {
if (!params.normalizeds.includes('c10')) {
code += '\n{{salt}}';
} else {
code = '{{salt}}\n' + code;
}
}
if (mw.config.get('wgPageContentModel') === 'Scribunto') {
// Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work
let equals = '';
while (code.includes(']' + equals + ']')) {
equals += '=';
}
code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);';
} else if (['javascript', 'css', 'sanitized-css'].includes(mw.config.get('wgPageContentModel'))) {
// Likewise for JS/CSS pages
code = '/* ' + code + ' */';
}
// Generate edit summary for edit
let editsummary;
if (params.normalizeds.length > 1) {
editsummary = 'Đang yêu cầu xóa nhanh (';
$.each(params.normalizeds, (index, norm) => {
editsummary += '[[WT:XN#' + norm.toUpperCase() + '|XN ' + norm.toUpperCase() + ']], ';
});
editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
editsummary += ').';
} else if (params.normalizeds[0] === 'db') {
editsummary = 'Đang yêu cầu [[Wiktionary:Quy định xóa trang#xóa nhanh|xóa nhanh]] với lý do "' + params.templateParams[0]['1'] + '".';
} else {
editsummary = 'Đang yêu cầu xóa nhanh ([[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']]).';
}
// Blank attack pages
if (params.normalizeds.includes('c10')) {
text = code;
} else {
// Insert tag after short description or any hatnotes
const wikipage = new Morebits.wikitext.Page(text);
text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText();
}
pageobj.setPageText(text);
pageobj.setEditSummary(editsummary);
pageobj.setWatchlist(params.watch);
pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
} else { // Attempt to place on talk page
const talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText();
if (talkName !== pageobj.getPageName()) {
if (params.requestsalt) {
code += '\n{{salt}}';
}
pageobj.getStatusElement().warn('Unable to edit page, placing tag on talk page');
const talkPage = new Morebits.wiki.Page(talkName, 'Automatically placing tag on talk page');
talkPage.setNewSectionTitle(pageobj.getPageName() + ' nominated for CSD, request deletion');
talkPage.setNewSectionText(code + '\n\nI was unable to tag ' + pageobj.getPageName() + ' directly, so I have placed the speedy deletion tag on this page. I request deletion of the other page. ~~~~');
talkPage.setCreateOption('recreate');
talkPage.setFollowRedirect(true);
talkPage.setWatchlist(params.watch);
talkPage.setChangeTags(Twinkle.changeTags);
talkPage.setCallbackParameters(params);
talkPage.newSection(Twinkle.speedy.callbacks.user.tagComplete);
} else {
pageobj.getStatusElement().error('Page cannot be edited and no other location to place a speedy deletion request, aborting');
}
}
},
tagComplete: function(pageobj) {
const params = pageobj.getCallbackParameters();
// Notification to first contributor, will also log nomination to the user's userspace log
if (params.usertalk) {
const thispage = new Morebits.wiki.Page(Morebits.pageNameNorm);
thispage.setCallbackParameters(params);
thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator);
// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
} else if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
addToLog: function(params, initialContrib) {
const usl = new Morebits.UserspaceLogger(Twinkle.getPref('speedyLogPageName'));
usl.initialText =
"Đây là nhật trình của tất cả đề nghị [[Wiktionary:Quy định xóa trang|xóa nhanh]] được thực hiện bởi người dùng này bằng cách sử dụng mô đun CSD của [[WT:TW|Twinkle]].\n\n" +
'Nếu bạn không muốn giữ nhật trình này nữa, bạn có thể tắt nó bằng cách sử dụng [[Wiktionary:Twinkle/Preferences|preferences panel]], và ' +
'đề cử trang này để xóa nhanh chóng dưới dạng [[WT:XN#TV1|XN TV1]].' +
(Morebits.userIsSysop ? '\n\nNhật trình này không theo dõi các thao tác xóa nhanh ngay lập tức được thực hiện bằng Twinkle.' : '');
const formatParamLog = function(normalize, csdparam, input) {
if ((normalize === 'C4' && csdparam === 'xfd') ||
(normalize === 'C6' && csdparam === 'page') ||
(normalize === 'C6' && csdparam === 'fullvotepage') ||
(normalize === 'C6' && csdparam === 'sourcepage') ||
(normalize === 'MT2' && csdparam === 'source') ||
(normalize === 'MT10' && csdparam === 'article')) {
input = '[[:' + input + ']]';
} else if (normalize === 'C5' && csdparam === 'user') {
input = '[[:User:' + input + ']]';
} else if (normalize === 'C12' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) {
input = '[' + input + ' ' + input + ']';
}
return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
};
let extraInfo = '';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
const fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : '';
let editsummary = 'Đang ghi nhật ký đề cử xóa nhanh';
let appendText = '# [[:' + Morebits.pageNameNorm;
if (!params.normalizeds.includes('c10')) { // no article name in log for G10 taggings
appendText += ']]' + fileLogLink + ': ';
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
appendText += '|Trang]] tấn công này' + fileLogLink + ': ';
editsummary += ' của một trang tấn công.';
}
if (params.normalizeds.length > 1) {
appendText += 'nhiều tiêu chí (';
$.each(params.normalizeds, (index, norm) => {
appendText += '[[WT:XN#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']], ';
});
appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma
appendText += ')';
} else if (params.normalizeds[0] === 'db') {
appendText += '{{tl|db-reason}}';
} else {
appendText += '[[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']] ({{tl|db-' + params.values[0] + '}})';
}
// If params is "empty" it will still be full of empty arrays, but ask anyway
if (params.templateParams) {
// Treat custom rationale individually
if (params.normalizeds[0] && params.normalizeds[0] === 'db') {
extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']);
} else {
params.templateParams.forEach((item, index) => {
const keys = Object.keys(item);
if (keys[0] !== undefined && keys[0].length > 0) {
// Second loop required since some items (G12, F9) may have multiple keys
keys.forEach((key, keyIndex) => {
if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') {
return true; // Not worth logging
}
extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]);
});
}
});
}
}
if (params.requestsalt) {
appendText += '; requested creation protection ([[WP:SALT|salting]])';
}
if (extraInfo) {
appendText += '; thông tin bổ sung:' + extraInfo;
}
if (initialContrib) {
appendText += '; đã thông báo {{user|1=' + initialContrib + '}}';
}
appendText += ' ~~~~~\n';
usl.changeTags = Twinkle.changeTags;
usl.log(appendText, editsummary);
}
}
};
// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
let parameters = [];
$.each(values, (index, value) => {
const currentParams = [];
switch (value) {
case 'reason':
if (form['csd.reason_1']) {
const dbrationale = form['csd.reason_1'].value;
if (!dbrationale || !dbrationale.trim()) {
alert('Lý do tùy chọn: Vui lòng nêu ra một lý do.');
parameters = null;
return false;
}
currentParams['1'] = dbrationale;
}
break;
case 'userreq': // TV1
if (form['csd.userreq_rationale']) {
const u1rationale = form['csd.userreq_rationale'].value;
if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) &&
(!u1rationale || !u1rationale.trim())) {
alert('XN TV1: Vui lòng đưa ra lý do khi đề cử xóa các trang thảo luận của người dùng.');
parameters = null;
return false;
}
currentParams.rationale = u1rationale;
}
break;
case 'repost': // C4
if (form['csd.repost_xfd']) {
const deldisc = form['csd.repost_xfd'].value;
if (deldisc) {
currentParams.xfd = deldisc;
}
}
break;
case 'banned': // C5
if (form['csd.banned_user'] && form['csd.banned_user'].value) {
currentParams.user = form['csd.banned_user'].value.replace(/^\s*User:/i, '');
}
break;
case 'gs': // C5
if (form['csd.code']) {
currentParams.code = form['csd.code'].value;
}
break;
case 'move': // C6
if (form['csd.move_page'] && form['csd.move_reason']) {
const movepage = form['csd.move_page'].value,
movereason = form['csd.move_reason'].value;
if (!movepage || !movepage.trim()) {
alert('CSD G6 (move): Please specify the page to be moved here.');
parameters = null;
return false;
}
if (!movereason || !movereason.trim()) {
alert('CSD G6 (move): Please specify the reason for the move.');
parameters = null;
return false;
}
currentParams.page = movepage;
currentParams.reason = movereason;
}
break;
case 'xfd': // C6
if (form['csd.xfd_fullvotepage']) {
const xfd = form['csd.xfd_fullvotepage'].value;
if (xfd) {
currentParams.fullvotepage = xfd;
}
}
break;
case 'copypaste': // C6
if (form['csd.copypaste_sourcepage']) {
const copypaste = form['csd.copypaste_sourcepage'].value;
if (!copypaste || !copypaste.trim()) {
alert('CSD G6 (copypaste): Please specify the source page name.');
parameters = null;
return false;
}
currentParams.sourcepage = copypaste;
}
break;
case 'c6': // C6
if (form['csd.c6_rationale'] && form['csd.c6_rationale'].value) {
currentParams.rationale = form['csd.c6_rationale'].value;
}
break;
case 'author': // C7
if (form['csd.author_rationale'] && form['csd.author_rationale'].value) {
currentParams.rationale = form['csd.author_rationale'].value;
}
break;
case 'c8': // C8
if (form['csd.c8_rationale'] && form['csd.c8_rationale'].value) {
currentParams.rationale = form['csd.c8_rationale'].value;
}
break;
case 'attack': // C10
currentParams.blanked = 'yes';
// it is actually blanked elsewhere in code, but setting the flag here
break;
case 'copyvio': // C12
if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) {
currentParams.url = form['csd.copyvio_url'].value;
}
if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) {
currentParams.url2 = form['csd.copyvio_url2'].value;
}
if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) {
currentParams.url3 = form['csd.copyvio_url3'].value;
}
break;
case 'foreign': // MT2
if (form['csd.foreign_source']) {
const foreignlink = form['csd.foreign_source'].value;
if (!foreignlink || !foreignlink.trim()) {
alert('XN MT2: Vui lòng chỉ rõ liên kết interwiki đến mục từ bị sao chép.');
parameters = null;
return false;
}
currentParams.source = foreignlink;
}
break;
case 'mt10': // C10
if (form['csd.mt10_article']) {
const duptitle = form['csd.mt10_article'].value;
if (!duptitle || !duptitle.trim()) {
alert('XN MT10: Vui lòng chỉ rõ tên mục từ trùng lặp nội dung.');
parameters = null;
return false;
}
currentParams.article = duptitle;
}
break;
case 'bm2': // T2
if (form['csd.bm2_rationale'] && form['csd.bm2_rationale'].value) {
currentParams.rationale = form['csd.bm2_rationale'].value;
}
break;
default:
break;
}
parameters.push(currentParams);
});
return parameters;
};
// Function for processing talk page notification template parameters
// key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}})
// utparams.param: for {{db-[notice|deleted]-multiple}}
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
const utparams = [];
// Special cases
if (normalized === 'db') {
utparams['2'] = parameters['1'];
} else if (normalized === 'c6') {
utparams.key1 = 'to';
utparams.value1 = Morebits.pageNameNorm;
} else if (normalized === 'c12') {
['url', 'url2', 'url3'].forEach((item, idx) => {
if (parameters[item]) {
idx++;
utparams['key' + idx] = item;
utparams['value' + idx] = utparams[item] = parameters[item];
}
});
} else {
// Handle the rest
let param;
switch (normalized) {
case 'c4':
param = 'xfd';
break;
case 'c5': // Only for db-gs, as db-g5 doesn't send a notice
param = 'code';
break;
case 'mt2':
param = 'source';
break;
case 'mt10':
param = 'article';
break;
default:
break;
}
// No harm in providing a usertalk template with the others' parameters
if (param && parameters[param]) {
utparams.key1 = param;
utparams.value1 = utparams[param] = parameters[param];
}
}
return utparams;
};
/**
* @param {Event} e
* @return {Array}
*/
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
const values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert('Vui lòng chỉ định một tiêu chí!');
return null;
}
return values;
};
Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const tag_only = form.tag_only;
if (tag_only && tag_only.checked) {
Twinkle.speedy.callback.evaluateUser(e);
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator
let watchPage, promptForSummary;
normalizeds.forEach((norm) => {
if (Twinkle.getPref('watchSpeedyPages').includes(norm)) {
watchPage = Twinkle.getPref('watchSpeedyExpiry');
}
if (Twinkle.getPref('promptForSpeedyDeletionSummary').includes(norm)) {
promptForSummary = true;
}
});
const warnusertalk = form.warnusertalk.checked && normalizeds.some((norm, index) => Twinkle.getPref('warnUserOnSpeedyDelete').includes(norm) &&
!(norm === 'g6' && values[index] !== 'copypaste') && !(norm === 'g5' && values[index] !== 'gs'));
const welcomeuser = warnusertalk && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
warnUser: warnusertalk,
welcomeuser: welcomeuser,
promptForSummary: promptForSummary,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Twinkle.speedy.callbacks.sysop.main(params);
};
Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
// var multiple = form.multiple.checked;
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page/notify the creator
const watchPage = normalizeds.some((csdCriteria) => Twinkle.getPref('watchSpeedyPages').includes(csdCriteria)) && Twinkle.getPref('watchSpeedyExpiry');
const notifyuser = form.notify.checked && normalizeds.some((norm, index) => Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').includes(norm) &&
!(norm === 'c6' && values[index] !== 'copypaste') && !(norm === 'c5' && values[index] !== 'gs'));
const welcomeuser = notifyuser && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some((norm) => !Twinkle.getPref('noLogOnSpeedyNomination').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
usertalk: notifyuser,
welcomeuser: welcomeuser,
lognomination: csdlog,
requestsalt: form.salting.checked,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'Gán nhãn hoàn tất';
const wikipedia_page = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang gán nhãn trang');
wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};
Twinkle.addInitCallback(Twinkle.speedy, 'speedy');
}());
// </nowiki>
61oudetk7rtvakp5m9vi8ffqwxm7q0u
2353235
2353234
2026-05-14T17:00:10Z
Kateru Zakuro
34522
2353235
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinklespeedy.js: CSD module
****************************************
* Mode of invocation: Tab ("CSD")
* Active on: Non-special, existing pages
*
* NOTE FOR DEVELOPERS:
* If adding a new criterion, add it to the appropriate places at the top of
* twinkleconfig.js. Also check out the default values of the CSD preferences
* in twinkle.js, and add your new criterion to those if you think it would be
* good.
*/
Twinkle.speedy = function twinklespeedy() {
// Disable on:
// * special pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
return;
}
Twinkle.addPortletLink(Twinkle.speedy.callback, 'Xóa nhanh', 'tw-csd', Morebits.userIsSysop ? 'Xóa trang theo WT:XN' : 'Đề nghị xóa nhanh theo WT:XN');
};
Twinkle.speedy.data = [
{
list: 'customRationale',
label: 'Tiêu chí tùy chọn' + (Morebits.userIsSysop ? ' (lý do xóa tùy chọn)' : ' sử dụng bản mẫu {{db}}'),
code: 'db',
db: 'reason',
tooltip: 'Tên bản mẫu {{db}} là viết tắt của "xóa bởi vì" (delete because). Trang sắp bị xóa phải được áp dụng tối thiểu một trong các tiêu chí xóa nhanh với lý do hợp lý. Lưu ý đây không phải là tiêu chí "chung cho tất cả trường hợp" khi bạn không thể tìm thấy bất kỳ tiêu chí xóa nhanh nào phù hợp.',
subgroup: {
name: 'reason_1',
type: 'input',
label: 'Lý do:',
size: 60
},
hideWhenMultiple: true
},
{
list: 'talkList',
label: 'C8: Trang thảo luận của trang không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'talk',
tooltip: 'Tiêu chí này không bao gồm bất kỳ trang nào hữu ích cho dự án - cụ thể là các trang thảo luận của người dùng, trang lưu trữ trang thảo luận và các trang thảo luận của các tập tin đang tồn tại ở Wikimedia Commons.'
},
{
list: 'articleList',
label: 'MT1: Không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến.',
code: 'mt1',
db: 'nocontext',
tooltip: 'Tiêu chí này áp dụng cho các mục từ "thiếu ngữ cảnh cần thiết" để nhận diện.'
},
{
list: 'articleList',
label: 'MT2: Mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
code: 'mt2',
db: 'foreign',
tooltip: 'Tiêu chí này áp dụng cho các mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
subgroup: {
name: 'foreign_source',
type: 'input',
label: 'Liên kết Interwiki đến mục từ trên wiki ngoại ngữ:',
tooltip: 'Ví dụ: fr:Bonjour'
}
},
{
list: 'articleList',
label: 'MT3: Không có nội dung thực',
code: 'mt3',
db: 'nocontent',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ không có nội dung thực (ví dụ, mục từ chỉ gồm các liên kết, thể loại, phần "Xem thêm" và một câu lặp lại tiêu đề).'
},
{
list: 'articleList',
label: 'MT7: Mục từ chưa đủ tiêu chuẩn rõ ràng',
code: 'mt7',
db: 'mt7',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ rõ ràng chưa đủ tiêu chuẩn để được đưa vào Wiktionary',
hideWhenSingle: true
},
{
list: 'articleList',
label: 'MT10: Mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn',
code: 'mt10',
db: 'mt10',
tooltip: 'Tiêu chí này áp dụng cho các mục từ có nội dung được sao chép từ một mục từ đã tồn tại trước đó.',
subgroup: {
name: 'mt10_article',
type: 'input',
label: 'Tên mục từ bị sao chép:'
}
},
{
list: 'categoryList',
label: 'TL1: Thể loại trống hoặc không cần thiết',
code: 'tl1',
db: 'catempty',
tooltip: 'Tiêu chí này áp dụng cho các thể loại trống hoặc không cần thiết. Các thể loại bảo quản (ví dụ như Thể loại:Chờ xóa) không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM1: Bản mẫu/Mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary',
code: 'bm1',
db: 'bm1',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM2: Bản mẫu/Mô đun không thể được sử dụng hữu ích theo bất kỳ cách nào hoặc theo biểu quyết đồng thuận',
code: 'bm2',
db: 'bm2',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun không được sử dụng hữu ích. Quản trị viên cần phải xem xét kỹ lưỡng bản mẫu/mô đun có thật sự hữu ích với Wiktionary hay không trước khi xóa nhanh. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh. Nếu không thể xóa nhanh, bản mẫu/mô đun nên được đưa ra thảo luận tìm đồng thuận để quyết định xóa hay giữ. Tiêu chí này sẽ có hiệu lực nếu biểu quyết đồng thuận có kết quả là xóa.',
subgroup: {
name: 'bm2_rationale',
type: 'input',
label: 'Lý do (nếu có):',
size: 60
}
},
{
list: 'userList',
label: 'TV1: Thành viên yêu cầu xóa',
code: 'tv1',
db: 'userreq',
tooltip: 'Thành viên có quyền được yêu cầu xóa các trang thành viên và trang con của mình (nhưng không phải là các trang thảo luận thành viên) theo yêu cầu cá nhân.',
subgroup: mw.config.get('wgNamespaceNumber') === 3 && !mw.config.get('wgTitle').includes('/') ? {
name: 'userreq_rationale',
type: 'input',
label: 'Lý do bắt buộc để giải thích lý do tại sao nên xóa trang thảo luận của người dùng này:',
tooltip: 'Các trang thảo luận của người dùng chỉ bị xóa trong những trường hợp đặc biệt nghiêm trọng.',
size: 60
} : null,
hideSubgroupWhenMultiple: true
},
{
list: 'userList',
code: 'tv2',
label: 'TV2: Tên thành viên chưa đăng ký',
db: 'nouser',
tooltip: 'Tiêu chí này áp dụng cho các trang thành viên chưa đăng ký/không tồn tại.'
},
{
list: 'generalList',
label: 'C1: Vô nghĩa rõ ràng',
code: 'c1',
db: 'nonsense',
tooltip: 'Tiêu chí này áp dụng với những trang chứa các đoạn văn bản hoàn toàn không mạch lạc hoặc vô nghĩa, và cả nội dung lẫn lịch sử trang đều không chứa nội dung gì có ý nghĩa.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C2: Trang thử nghiệm',
code: 'c2',
db: 'test',
tooltip: 'Tiêu chí này áp dụng với những trang được tạo ra nhằm thử nghiệm chức năng sửa đổi hoặc những chức năng khác của Wiktionary. Tiêu chí không áp dụng với những trang con của chỗ thử Wiktionary được tạo ra cho mục đích thử nghiệm.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C3: Hoàn toàn là phá hoại hoặc lừa bịp rõ ràng',
code: 'c3',
db: 'vandalism',
tooltip: 'Tiêu chí này áp dụng với những trang tung thông tin sai lệch, tin vịt (thông tin lừa bịp) rõ ràng, và các trang đổi hướng được tạo ra sau khi đổi tên những trang bị phá hoại tiêu đề về trang có tên đúng.'
},
{
list: 'generalList',
label: 'C4: Trang được tạo lại với nội dung của một trang đã từng bị xoá theo biểu quyết',
code: 'c4',
db: 'repost',
tooltip: 'Tiêu chí này áp dụng với những bản sao y hệt, dù đã được đổi sang tiêu đề mới, của một trang đã từng bị xoá theo kết quả của lần biểu quyết xoá gần đây nhất.',
subgroup: {
name: 'repost_xfd',
type: 'input',
label: 'Trang diễn ra cuộc thảo luận xóa:',
tooltip: 'Phải bắt đầu với tiền tố "Wiktionary:"',
size: 60
}
},
{
list: 'generalList',
label: 'C5: Trang do thành viên bị cấm tạo ra',
code: 'c5',
db: 'banned',
tooltip: 'Tiêu chí này áp dụng với những trang do các thành viên bị cấm tạo ra mà vi phạm lệnh cấm.',
subgroup: {
name: 'banned_user',
type: 'input',
label: 'Tên thành viên bị cấm (nếu có):',
tooltip: 'Không bắt đầu bằng tiền tố "User:" hoặc "Thành viên:"'
}
},
{
list: 'generalList',
label: 'C6: Xóa để thực hiện các tác vụ bảo trì kĩ thuật',
code: 'c6',
db: 'c6',
tooltip: 'Tiêu chí này áp dụng với các tác vụ xóa để thực hiện công tác bảo trì kĩ thuật.',
subgroup: {
name: 'c6_rationale',
type: 'input',
label: 'Lý do:',
size: 60
}
},
{
list: 'generalList',
label: 'C7: Người viết/Tác giả yêu cầu xóa',
code: 'c7',
db: 'author',
tooltip: 'Tiêu chí này áp dụng trong trường hợp chính tác giả yêu cầu xoá (một cách có thiện chí) và đây phải là tác giả đóng góp nội dung chủ yếu của trang.',
subgroup: {
name: 'author_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
tooltip: 'Liên kết đến nơi mà tác giả yêu cầu xóa.',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C8: Trang liên quan đến một trang khác không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'c8',
tooltip: 'Những trường hợp áp dụng tiêu chí này bao gồm trang thảo luận không có trang nội dung tương ứng, trang con nhưng không có trang cha mẹ bên ngoài, trang tập tin không chứa tập tin tương ứng, trang đổi hướng tới trang đích không hợp lệ, chẳng hạn như trang đích không tồn tại, trang đổi hướng bị lặp vòng, hoặc đổi hướng đến trang có tên nằm trong danh sách đen tiêu đề trang, thông báo sửa đổi không sử dụng thuộc về những trang không tồn tại hoặc bị xoá và khoá khả năng tạo mới, và các thể loại được thêm tự động nhờ các bản mẫu đã bị xoá hoặc bị đổi hướng.',
subgroup: {
name: 'c8_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C10: Trang có nội dung tấn công cá nhân',
code: 'c10',
db: 'attack',
tooltip: 'Các ví dụ của các "trang có nội dung tấn công" có thể bao gồm phỉ báng, đe dọa pháp lý, thông tin hoàn toàn với ý định quấy rối hoặc đe dọa một cá nhân hay người đang sống, có giọng điệu hoàn toàn tiêu cực và không có nguồn gốc. Những trang này nên được xóa nhanh khi không có bất cứ phiên bản sửa đổi trang nào thể hiện thái độ trung lập để lùi sửa.'
},
{
list: 'generalList',
label: 'C11: Quảng cáo, quảng bá cho một công ty, sản phẩm, dịch vụ hay cá nhân',
code: 'c11',
db: 'spam',
tooltip: 'Tiêu chí này áp dụng với những mục từ chỉ có một mục đích duy nhất là quảng cáo cho một công ty, sản phẩm, dịch vụ hay cá nhân và cần được viết lại nếu muốn đáp ứng yêu cầu bách khoa.'
},
{
list: 'generalList',
label: 'C12: Vi phạm bản quyền',
code: 'c12',
db: 'copyvio',
tooltip: 'Tiêu chí này áp dụng với các trang vi phạm bản quyền rõ ràng',
subgroup: [
{
name: 'copyvio_url',
type: 'input',
label: 'URL (nếu có):',
tooltip: 'Nếu được sao chép từ một nguồn trực tuyến, hãy đặt URL ở đây, bao gồm giao thức "http://" hoặc "https://".',
size: 60
},
{
name: 'copyvio_url2',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
},
{
name: 'copyvio_url3',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
}
]
},
{
list: 'redirectList',
label: 'ĐH2: Đổi hướng liên không gian',
code: 'dh2',
db: 'rediruser',
tooltip: 'Tiêu chí này áp dụng cho các trang đổi hướng (trừ các trang viết tắt) từ không gian chính (không gian mục từ) đến bất kỳ không gian nào, ngoại trừ các không gian sau Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp: và Phụ lục:.',
showInNamespaces: [ 0 ]
},
{
list: 'redirectList',
label: 'ĐH3: Trang đổi hướng tên sai do lỗi chính tả, lỗi bỏ dấu từ',
code: 'dh3',
db: 'redirtypo',
tooltip: 'Tiêu chí này áp dụng với các trang có tên sai, chẳng hạn như lỗi chính tả, lỗi bỏ dấu từ, lỗi trình bày... Lưu ý trong một số trường hợp, nếu tên mục từ sai nhưng phổ biến thì có thể giữ lại và đổi hướng đến trang đích có tên đúng.'
},
{
list: 'redirectList',
label: 'C8: Trang đổi hướng đến một trang không tồn tại',
code: 'c8',
db: 'redirnone',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ trang đổi hướng nào đến trang không tồn tại. Khi xóa một trang, quản trị viên lưu ý kiểm tra và xóa tất cả các trang đổi hướng đến trang vừa xóa nếu có.',
hideWhenMultiple: true
}
];
/**
* Given a list name such as talkList, fileList, redirectList, etc, return the CSDs that should be in that list.
*/
Twinkle.speedy.getCsdList = ( csdList ) => {
const list = [];
for (const item of Twinkle.speedy.data) {
if (item.list === csdList) {
const copy = Object.assign({}, item);
// Change some things to match the old spec, from before I refactored this.
delete copy.list;
delete copy.code;
copy.value = copy.db;
delete copy.db;
list.push(copy);
}
}
return list;
};
Twinkle.speedy.customRationale = Twinkle.speedy.getCsdList( 'customRationale' );
Twinkle.speedy.talkList = Twinkle.speedy.getCsdList( 'talkList' );
Twinkle.speedy.fileList = Twinkle.speedy.getCsdList( 'fileList' );
Twinkle.speedy.articleList = Twinkle.speedy.getCsdList( 'articleList' );
Twinkle.speedy.categoryList = Twinkle.speedy.getCsdList( 'categoryList' );
Twinkle.speedy.templateList = Twinkle.speedy.getCsdList( 'templateList' );
Twinkle.speedy.userList = Twinkle.speedy.getCsdList( 'userList' );
Twinkle.speedy.generalList = Twinkle.speedy.getCsdList( 'generalList' );
Twinkle.speedy.redirectList = Twinkle.speedy.getCsdList( 'redirectList' );
Twinkle.speedy.timedTextList = Twinkle.speedy.getCsdList( 'timedTextList' );
/**
* Iterate over Twinkle.speedy.data. Turn `code: 'c8', db: 'redirnone',` into `redirnone: 'c8',`
*/
Twinkle.speedy.getNormalizeHash = () => {
const hash = {};
for (const item of Twinkle.speedy.data) {
if (item.code && item.db) {
hash[item.db] = item.code;
}
}
return hash;
};
/**
* This is a map of Db-word templates to CSD codes such as mt1. For example, `"nocontext": "mt1"`
*/
Twinkle.speedy.normalizeHash = Twinkle.speedy.getNormalizeHash();
// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};
// Used by unlink feature
Twinkle.speedy.dialog = null;
// Used throughout
Twinkle.speedy.hasCSD = !!$('#delete-reason').length;
// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
Twinkle.speedy.dialog = new Morebits.SimpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
const dialog = Twinkle.speedy.dialog;
dialog.setTitle('Chọn tiêu chí xóa nhanh');
dialog.setScriptName('Twinkle');
dialog.addFooterLink('Quy định xóa nhanh', 'WT:XN');
dialog.addFooterLink('Tùy chọn CSD', 'WT:TW/PREF#speedy');
dialog.addFooterLink('Trợ giúp Twinkle', 'WT:TW/DOC#speedy');
dialog.addFooterLink('Gửi phản hồi', 'WT:TW');
const form = new Morebits.QuickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null);
if (Morebits.userIsSysop) {
form.append({
type: 'checkbox',
list: [
{
label: 'Chỉ gán nhãn trang, không xóa',
value: 'tag_only',
name: 'tag_only',
tooltip: 'Nếu bạn chỉ muốn gán nhãn trang, thay vì xóa nhanh ngay lúc này',
checked: !(Twinkle.speedy.hasCSD || (mw.config.get('wgRelevantUserName') === mw.config.get('wgUserName')) || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
const cForm = event.target.form;
const cChecked = event.target.checked;
// enable talk page checkbox
if (cForm.talkpage) {
cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
}
// enable redirects checkbox
cForm.redirects.checked = !cChecked;
// enable delete multiple
cForm.delmultiple.checked = false;
// enable notify checkbox
cForm.notify.checked = cChecked;
// enable deletion notification checkbox
cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD;
// enable multiple
cForm.multiple.checked = false;
// enable requesting creation protection
cForm.salting.checked = false;
Twinkle.speedy.callback.modeChanged(cForm);
event.stopPropagation();
}
}
]
});
const deleteOptions = form.append({
type: 'div',
name: 'delete_options'
});
deleteOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến việc xóa trang'
});
if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa trang thảo luận',
value: 'talkpage',
name: 'talkpage',
tooltip: "Tùy chọn này sẽ xóa thêm trang thảo luận của trang.",
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
event: function(event) {
event.stopPropagation();
}
}
]
});
}
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa tất cả các trang đổi hướng',
value: 'redirects',
name: 'redirects',
tooltip: 'Tùy chọn này cũng xóa thêm tất cả các trang đổi hướng đến. Hãy tránh dùng tùy chọn này cho các tác vụ xóa theo thủ tục (ví dụ: di chuyển/hợp nhất).',
checked: Twinkle.getPref('deleteRedirectsOnDelete'),
event: function (event) {
event.stopPropagation();
}
},
{
label: 'Xóa theo nhiều tiêu chí',
value: 'delmultiple',
name: 'delmultiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
},
{
label: 'Thông báo cho người tạo trang về việc xóa trang',
value: 'warnusertalk',
name: 'warnusertalk',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang, ' +
'người tạo trang cũng có thể được thông báo.',
checked: !Twinkle.speedy.hasCSD,
event: function(event) {
event.stopPropagation();
}
}
]
});
}
const tagOptions = form.append({
type: 'div',
name: 'tag_options'
});
if (Morebits.userIsSysop) {
tagOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến nhãn'
});
}
tagOptions.append({
type: 'checkbox',
list: [
{
label: 'Thông báo cho người tạo trang nếu có thể',
value: 'notify',
name: 'notify',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang. ' +
'Người tạo trang cũng có thể được hoan nghênh.',
checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn để khóa việc tạo trang',
value: 'salting',
name: 'salting',
tooltip: 'Khi được chọn, nhãn xóa nhanh sẽ được kèm theo nhãn {{salt}} để yêu cầu quản trị viên khi xóa trang áp dụng biện pháp khóa tạo trang. Chỉ chọn chức năng này nếu trang bị xóa được tạo đi tạo lại nhiều lần.',
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn với nhiều tiêu chí',
value: 'multiple',
name: 'multiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
}
]
});
form.append({
type: 'div',
id: 'prior-deletion-count',
style: 'font-style: italic'
});
form.append({
type: 'div',
name: 'work_area',
label: 'Không thể khởi chạy mô đun CSD. Vui lòng thử lại hoặc báo với các nhà phát triển Twinkle về vấn đề này.'
});
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged
}
const result = form.render();
dialog.setContent(result);
dialog.display();
Twinkle.speedy.callback.modeChanged(result);
// Check for prior deletions. Just once, upon init
Twinkle.speedy.callback.priorDeletionCount();
};
Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
const namespace = mw.config.get('wgNamespaceNumber');
// first figure out what mode we're in
const mode = {
isSysop: !!form.tag_only && !form.tag_only.checked,
isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked,
isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick'
};
if (mode.isSysop) {
$('[name=delete_options]').show();
$('[name=tag_options]').hide();
$('button.tw-speedy-submit').text('Xóa trang');
} else {
$('[name=delete_options]').hide();
$('[name=tag_options]').show();
$('button.tw-speedy-submit').text('Gán nhãn trang');
}
const work_area = new Morebits.QuickForm.Element({
type: 'div',
name: 'work_area'
});
if (mode.isMultiple && mode.isRadioClick) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
work_area.append({
type: 'div',
label: 'Khi chọn xong tiêu chí, hãy nhấp vào:'
});
work_area.append({
type: 'button',
name: 'submit-multiple',
label: mode.isSysop ? 'Xóa trang' : 'Gán thẻ trang',
event: function(event) {
Twinkle.speedy.callback[evaluateType](event);
event.stopPropagation();
}
});
}
const appendList = function(headerLabel, csdList) {
work_area.append({ type: 'header', label: headerLabel });
work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) });
};
if (mode.isSysop && !mode.isMultiple) {
appendList('Tiêu chí tùy chọn', Twinkle.speedy.customRationale);
}
if (namespace % 2 === 1 && namespace !== 3) {
// show db-talk on talk pages, but not user talk pages
appendList('Trang thảo luận', Twinkle.speedy.talkList);
}
if (!Morebits.isPageRedirect()) {
switch (namespace) {
case 0: // article
case 1: // talk
appendList('Mục từ', Twinkle.speedy.articleList);
break;
case 2: // user
case 3: // user talk
appendList('Trang thành viên', Twinkle.speedy.userList);
break;
case 6: // file
case 7: // file talk
break;
case 10: // template
case 11: // template talk
case 828: // module
case 829: // module talk
appendList('Bản mẫu/Mô đun', Twinkle.speedy.templateList);
break;
case 14: // category
case 15: // category talk
appendList('Thể loại', Twinkle.speedy.categoryList);
break;
case 710: // timed text
case 711: // timed text talk
break;
default:
break;
}
} else {
if (namespace === 2 || namespace === 3) {
appendList('Trang thành viên', Twinkle.speedy.userList);
}
appendList('Trang đổi hướng', Twinkle.speedy.redirectList);
}
let generalCriteria = Twinkle.speedy.generalList;
// custom rationale lives under general criteria when tagging
if (!mode.isSysop) {
generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria);
}
appendList('Tiêu chí chung', generalCriteria);
const old_area = Morebits.QuickForm.getElements(form, 'work_area')[0];
form.replaceChild(work_area.render(), old_area);
// if sysop, check if CSD is already on the page and fill in custom rationale
if (mode.isSysop && Twinkle.speedy.hasCSD) {
const customOption = $('input[name=csd][value=reason]')[0];
if (customOption) {
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
// force listeners to re-init
customOption.click();
customOption.parentNode.appendChild(customOption.subgroup);
}
customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' ');
}
}
};
Twinkle.speedy.callback.priorDeletionCount = function () {
const query = {
action: 'query',
format: 'json',
list: 'logevents',
letype: 'delete',
leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel
letitle: mw.config.get('wgPageName'),
leprop: '', // We're just counting we don't actually care about the entries
lelimit: 5 // A little bit goes a long way
};
new Morebits.wiki.Api('Checking for past deletions', query, ((apiobj) => {
const response = apiobj.getResponse();
const delCount = response.query.logevents.length;
if (delCount) {
let message = delCount + ' previous deletion';
if (delCount > 1) {
message += 's';
if (response.continue) {
message = 'More than ' + message;
}
// 3+ seems problematic
if (delCount >= 3) {
$('#prior-deletion-count').css('color', 'red');
}
}
// Provide a link to page logs (CSD templates have one for sysops)
const link = Morebits.htmlNode('a', '(logs)');
link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')}));
link.setAttribute('target', '_blank');
$('#prior-deletion-count').text(message + ' '); // Space before log link
$('#prior-deletion-count').append(link);
}
})).post();
};
Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
const pageNamespace = mw.config.get('wgNamespaceNumber');
const openSubgroupHandler = function(e) {
$(e.target.form).find('input').prop('disabled', true);
$(e.target.form).children().css('color', 'gray');
$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
$(e.target).parent().find('input:text')[0].focus();
e.stopPropagation();
};
const submitSubgroupHandler = function(e) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
Twinkle.speedy.callback[evaluateType](e);
e.stopPropagation();
};
return $.map(list, (critElement) => {
const criterion = $.extend({}, critElement);
if (mode.isMultiple) {
if (criterion.hideWhenMultiple) {
return null;
}
if (criterion.hideSubgroupWhenMultiple) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenSingle) {
return null;
}
if (criterion.hideSubgroupWhenSingle) {
criterion.subgroup = null;
}
}
if (mode.isSysop) {
if (criterion.hideWhenSysop) {
return null;
}
if (criterion.hideSubgroupWhenSysop) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenUser) {
return null;
}
if (criterion.hideSubgroupWhenUser) {
criterion.subgroup = null;
}
}
if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) {
return null;
}
if (criterion.showInNamespaces && !criterion.showInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.hideInNamespaces && criterion.hideInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) {
if (Array.isArray(criterion.subgroup)) {
criterion.subgroup = criterion.subgroup.concat({
type: 'button',
name: 'submit',
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
});
} else {
criterion.subgroup = [
criterion.subgroup,
{
type: 'button',
name: 'submit', // ends up being called "csd.submit" so this is OK
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
}
];
}
// FIXME: does this do anything?
criterion.event = openSubgroupHandler;
}
return criterion;
});
};
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
let code, parameters, i;
if (params.normalizeds.length > 1) {
code = '{{db-multiple';
params.utparams = {};
$.each(params.normalizeds, (index, norm) => {
code += '|' + norm.toUpperCase();
parameters = params.templateParams[index] || [];
for (const i in parameters) {
if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them
code += '|' + i + '=' + parameters[i];
}
}
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
});
code += '}}';
} else {
parameters = params.templateParams[0] || [];
code = '{{db-' + params.values[0];
for (i in parameters) {
if (typeof parameters[i] === 'string') {
code += '|' + i + '=' + parameters[i];
}
}
if (params.usertalk) {
code += '|help=off';
}
code += '}}';
params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
}
return [code, params.utparams];
},
parseWikitext: function(wikitext, callback) {
const query = {
action: 'parse',
prop: 'text',
pst: 'true',
text: wikitext,
contentmodel: 'wikitext',
title: mw.config.get('wgPageName'),
disablelimitreport: true,
format: 'json'
};
const statusIndicator = new Morebits.Status('Đang xây dựng tóm tắt xóa');
const api = new Morebits.wiki.Api('Đang phân tích cú pháp bản mẫu xóa', query, ((apiobj) => {
const reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' ');
if (!reason) {
statusIndicator.warn('Không thể tạo tóm tắt từ bản mẫu xóa');
} else {
statusIndicator.info('hoàn tất');
}
callback(reason);
}), statusIndicator);
api.post();
},
noteToCreator: function(pageobj) {
const params = pageobj.getCallbackParameters();
let initialContrib = pageobj.getCreator();
// disallow notifying yourself
if (initialContrib === mw.config.get('wgUserName')) {
Morebits.Status.warn('You (' + initialContrib + ') created this page; skipping user notification');
initialContrib = null;
// don't notify users when their user talk page is nominated/deleted
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
Morebits.Status.warn('Notifying initial contributor: this user created their own user talk page; skipping notification');
initialContrib = null;
// Check for already existing tags
} else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('The page has a deletion-related tag, and thus the creator has likely been notified. Do you want to notify them for this deletion as well?')) {
Morebits.Status.info('Notifying initial contributor', 'canceled by user; skipping notification.');
initialContrib = null;
}
if (initialContrib) {
const usertalkpage = new Morebits.wiki.Page('User talk:' + initialContrib, 'Notifying initial contributor (' + initialContrib + ')');
let notifytext, i, editsummary;
// special cases: "db" and "db-multiple"
if (params.normalizeds.length > 1) {
notifytext = '\n{{subst:db-' + (params.warnUser ? 'deleted' : 'notice') + '-multiple|1=' + Morebits.pageNameNorm;
let count = 2;
$.each(params.normalizeds, (index, norm) => {
notifytext += '|' + count++ + '=' + norm.toUpperCase();
});
} else if (params.normalizeds[0] === 'db') {
notifytext = '\n{{subst:db-reason-' + (params.warnUser ? 'deleted' : 'notice') + '|1=' + Morebits.pageNameNorm;
} else {
notifytext = '\n{{subst:db-csd-' + (params.warnUser ? 'deleted' : 'notice') + '-custom|1=';
if (params.values[0] === 'copypaste') {
notifytext += params.templateParams[0].sourcepage;
} else {
notifytext += Morebits.pageNameNorm;
}
notifytext += '|2=' + params.values[0];
}
for (i in params.utparams) {
if (typeof params.utparams[i] === 'string') {
notifytext += '|' + i + '=' + params.utparams[i];
}
}
notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~';
editsummary = 'Notification: speedy deletion' + (params.warnUser ? '' : ' nomination');
if (!params.normalizeds.includes('c10')) { // no article name in summary for G10 taggings
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
editsummary += ' of an attack page.';
}
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary);
usertalkpage.setChangeTags(Twinkle.changeTags);
usertalkpage.setCreateOption('recreate');
usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser'));
usertalkpage.setFollowRedirect(true, false);
usertalkpage.append(() => {
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
}
}, () => {
// if user could not be notified, log nomination without mentioning that notification was sent
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
});
} else if (params.lognomination) {
// log nomination even if the user notification wasn't sent
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
sysop: {
main: function(params) {
let reason;
if (!params.normalizeds.length && params.normalizeds[0] === 'db') {
reason = prompt('Nhập tóm tắt xóa để sử dụng, tóm tắt này sẽ được nhập vào nhật trình xóa:', '');
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
} else {
const code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0];
Twinkle.speedy.callbacks.parseWikitext(code, (reason) => {
if (params.promptForSummary) {
reason = prompt('Nhập bản tóm tắt xóa để sử dụng hoặc nhấn OK để chấp nhận bản tóm tắt được tạo tự động.', reason);
}
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
});
}
},
deletePage: function(reason, params) {
const thispage = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang xóa trang');
if (reason === null) {
return Morebits.Status.error('Asking for reason', 'User cancelled');
} else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) {
return Morebits.Status.error('Đang yêu cầu lý do', 'bạn đã không đưa ra một lý do xóa nhanh, tác vụ đã bị hủy bỏ.');
}
const deleteMain = function(callback) {
thispage.setEditSummary(reason);
thispage.setChangeTags(Twinkle.changeTags);
thispage.setWatchlist(params.watch);
thispage.deletePage(() => {
thispage.getStatusElement().info('đã xong');
typeof callback === 'function' && callback();
Twinkle.speedy.callbacks.sysop.deleteTalk(params);
});
};
// look up initial contributor. If prompting user for deletion reason, just display a link.
// Otherwise open the talk page directly
if (params.warnUser) {
thispage.setCallbackParameters(params);
thispage.lookupCreation((pageobj) => {
deleteMain(() => {
Twinkle.speedy.callbacks.noteToCreator(pageobj);
});
});
} else {
deleteMain();
}
},
deleteTalk: function(params) {
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'f8' &&
!document.getElementById('ca-talk').classList.contains('new')) {
const talkpage = new Morebits.wiki.Page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Đang xóa trang thảo luận');
talkpage.setEditSummary('[[WT:TCXN#C8|C8]]: Trang thảo luận của trang đã xóa [[' + Morebits.pageNameNorm + ']]');
talkpage.setChangeTags(Twinkle.changeTags);
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
// (otherwise success/failure messages for the previous action would be suppressed)
window.setTimeout(() => {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}, 1800);
} else {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}
},
deleteRedirects: function(params) {
// delete redirects
if (params.deleteRedirects) {
const query = {
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'redirects',
rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops
format: 'json'
};
const wikipedia_api = new Morebits.wiki.Api('đang lấy danh sách các trang đổi hướng...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
new Morebits.Status('Đang xóa các trang đổi hướng'));
wikipedia_api.params = params;
wikipedia_api.post();
}
// promote Unlink tool
let $link, $bigtext;
if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('hấp vào đây để đến công cụ Gỡ liên kết (Unlink)')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Removing usages of and/or links to deleted file ' + Morebits.pageNameNorm);
});
$bigtext = $('<span>')
.text('To orphan backlinks and remove instances of file usage')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
} else if (params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('nhấp vào đây để chuyển đến công cụ Gỡ liên kết')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Đang xóa các liên kết đến trang đã xóa ' + Morebits.pageNameNorm);
} );
$bigtext = $('<span>')
.text('Để gỡ các backlink')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
}
},
deleteRedirectsMain: function(apiobj) {
const response = apiobj.getResponse();
const snapshot = response.query.pages[0].redirects || [];
const total = snapshot.length;
const statusIndicator = apiobj.statelem;
if (!total) {
statusIndicator.status('không tìm thấy trang đổi hướng nào');
return;
}
statusIndicator.status('0%');
let current = 0;
const onsuccess = function(apiobjInner) {
const now = parseInt(100 * ++current / total, 10) + '%';
statusIndicator.update(now);
apiobjInner.statelem.unlink();
if (current >= total) {
statusIndicator.info(now + ' (đã hoàn tất)');
Morebits.wiki.removeCheckpoint();
}
};
Morebits.wiki.addCheckpoint();
snapshot.forEach((value) => {
const title = value.title;
const page = new Morebits.wiki.Page(title, 'Đang xóa trang đổi hướng "' + title + '"');
page.setEditSummary('[[WT:XN#C8|C8]]: Đổi hướng đến trang đã xóa [[' + Morebits.pageNameNorm + ']]');
page.setChangeTags(Twinkle.changeTags);
page.deletePage(onsuccess);
});
}
},
user: {
main: function(pageobj) {
const statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error("Có vẻ như trang không tồn tại; có thể đã bị xóa");
return;
}
const params = pageobj.getCallbackParameters();
// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
// returns => [<string> wikitext, <object> utparams]
const buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
let code = buildData[0];
params.utparams = buildData[1];
// Tag if possible, post on talk if not
if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].includes(pageobj.getContentModel()) && mw.config.get('wgNamespaceNumber') !== 710 /* TimedText */) {
let text = pageobj.getPageText();
statelem.status('Kiểm tra các nhãn trên trang...');
// check for existing deletion tags
const tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text);
// This won't make use of the db-multiple template but it probably should
if (tag && !confirm('Trang đã chứa bản mẫu xóa nhanh (CSD) {{' + tag[1] + '}}. Bạn có muốn thêm một bản mẫu xóa nhanh khác không?')) {
return;
}
const xfd = /\{\{((?:article for deletion|proposed deletion|prod blp|template for discussion)\/dated|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text);
if (xfd && !confirm('Bản mẫu xóa {{' + xfd[1] + '}} }} đã được tìm thấy trên trang. Bạn có muốn tiếp tục thêm một bản mẫu CSD?')) {
return;
}
// curate/patrol the page
if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
pageobj.triage();
}
// Wrap SD template in noinclude tags if we are in template space.
// Won't work with userboxes in userspace, or any other transcluded page outside template space
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = '<noinclude>' + code + '</noinclude>';
}
// Remove tags that become superfluous with this action
text = text.replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
if (mw.config.get('wgNamespaceNumber') === 6) {
text = Twinkle.removeMoveToCommonsTagsFromWikicode( text );
}
if (params.requestsalt) {
if (!params.normalizeds.includes('c10')) {
code += '\n{{salt}}';
} else {
code = '{{salt}}\n' + code;
}
}
if (mw.config.get('wgPageContentModel') === 'Scribunto') {
// Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work
let equals = '';
while (code.includes(']' + equals + ']')) {
equals += '=';
}
code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);';
} else if (['javascript', 'css', 'sanitized-css'].includes(mw.config.get('wgPageContentModel'))) {
// Likewise for JS/CSS pages
code = '/* ' + code + ' */';
}
// Generate edit summary for edit
let editsummary;
if (params.normalizeds.length > 1) {
editsummary = 'Đang yêu cầu xóa nhanh (';
$.each(params.normalizeds, (index, norm) => {
editsummary += '[[WT:XN#' + norm.toUpperCase() + '|XN ' + norm.toUpperCase() + ']], ';
});
editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
editsummary += ').';
} else if (params.normalizeds[0] === 'db') {
editsummary = 'Đang yêu cầu [[Wiktionary:Quy định xóa trang#xóa nhanh|xóa nhanh]] với lý do "' + params.templateParams[0]['1'] + '".';
} else {
editsummary = 'Đang yêu cầu xóa nhanh ([[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']]).';
}
// Blank attack pages
if (params.normalizeds.includes('c10')) {
text = code;
} else {
// Insert tag after short description or any hatnotes
const wikipage = new Morebits.wikitext.Page(text);
text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText();
}
pageobj.setPageText(text);
pageobj.setEditSummary(editsummary);
pageobj.setWatchlist(params.watch);
pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
} else { // Attempt to place on talk page
const talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText();
if (talkName !== pageobj.getPageName()) {
if (params.requestsalt) {
code += '\n{{salt}}';
}
pageobj.getStatusElement().warn('Unable to edit page, placing tag on talk page');
const talkPage = new Morebits.wiki.Page(talkName, 'Automatically placing tag on talk page');
talkPage.setNewSectionTitle(pageobj.getPageName() + ' nominated for CSD, request deletion');
talkPage.setNewSectionText(code + '\n\nI was unable to tag ' + pageobj.getPageName() + ' directly, so I have placed the speedy deletion tag on this page. I request deletion of the other page. ~~~~');
talkPage.setCreateOption('recreate');
talkPage.setFollowRedirect(true);
talkPage.setWatchlist(params.watch);
talkPage.setChangeTags(Twinkle.changeTags);
talkPage.setCallbackParameters(params);
talkPage.newSection(Twinkle.speedy.callbacks.user.tagComplete);
} else {
pageobj.getStatusElement().error('Page cannot be edited and no other location to place a speedy deletion request, aborting');
}
}
},
tagComplete: function(pageobj) {
const params = pageobj.getCallbackParameters();
// Notification to first contributor, will also log nomination to the user's userspace log
if (params.usertalk) {
const thispage = new Morebits.wiki.Page(Morebits.pageNameNorm);
thispage.setCallbackParameters(params);
thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator);
// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
} else if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
addToLog: function(params, initialContrib) {
const usl = new Morebits.UserspaceLogger(Twinkle.getPref('speedyLogPageName'));
usl.initialText =
"Đây là nhật trình của tất cả đề nghị [[Wiktionary:Quy định xóa trang|xóa nhanh]] được thực hiện bởi người dùng này bằng cách sử dụng mô đun CSD của [[WT:TW|Twinkle]].\n\n" +
'Nếu bạn không muốn giữ nhật trình này nữa, bạn có thể tắt nó bằng cách sử dụng [[Wiktionary:Twinkle/Preferences|preferences panel]], và ' +
'đề cử trang này để xóa nhanh chóng dưới dạng [[WT:XN#TV1|XN TV1]].' +
(Morebits.userIsSysop ? '\n\nNhật trình này không theo dõi các thao tác xóa nhanh ngay lập tức được thực hiện bằng Twinkle.' : '');
const formatParamLog = function(normalize, csdparam, input) {
if ((normalize === 'C4' && csdparam === 'xfd') ||
(normalize === 'C6' && csdparam === 'page') ||
(normalize === 'C6' && csdparam === 'fullvotepage') ||
(normalize === 'C6' && csdparam === 'sourcepage') ||
(normalize === 'MT2' && csdparam === 'source') ||
(normalize === 'MT10' && csdparam === 'article')) {
input = '[[:' + input + ']]';
} else if (normalize === 'C5' && csdparam === 'user') {
input = '[[:User:' + input + ']]';
} else if (normalize === 'C12' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) {
input = '[' + input + ' ' + input + ']';
}
return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
};
let extraInfo = '';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
const fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : '';
let editsummary = 'Đang ghi nhật ký đề cử xóa nhanh';
let appendText = '# [[:' + Morebits.pageNameNorm;
if (!params.normalizeds.includes('c10')) { // no article name in log for G10 taggings
appendText += ']]' + fileLogLink + ': ';
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
appendText += '|Trang]] tấn công này' + fileLogLink + ': ';
editsummary += ' của một trang tấn công.';
}
if (params.normalizeds.length > 1) {
appendText += 'nhiều tiêu chí (';
$.each(params.normalizeds, (index, norm) => {
appendText += '[[WT:XN#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']], ';
});
appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma
appendText += ')';
} else if (params.normalizeds[0] === 'db') {
appendText += '{{tl|db-reason}}';
} else {
appendText += '[[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']] ({{tl|db-' + params.values[0] + '}})';
}
// If params is "empty" it will still be full of empty arrays, but ask anyway
if (params.templateParams) {
// Treat custom rationale individually
if (params.normalizeds[0] && params.normalizeds[0] === 'db') {
extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']);
} else {
params.templateParams.forEach((item, index) => {
const keys = Object.keys(item);
if (keys[0] !== undefined && keys[0].length > 0) {
// Second loop required since some items (G12, F9) may have multiple keys
keys.forEach((key, keyIndex) => {
if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') {
return true; // Not worth logging
}
extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]);
});
}
});
}
}
if (params.requestsalt) {
appendText += '; requested creation protection ([[WP:SALT|salting]])';
}
if (extraInfo) {
appendText += '; thông tin bổ sung:' + extraInfo;
}
if (initialContrib) {
appendText += '; đã thông báo {{user|1=' + initialContrib + '}}';
}
appendText += ' ~~~~~\n';
usl.changeTags = Twinkle.changeTags;
usl.log(appendText, editsummary);
}
}
};
// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
let parameters = [];
$.each(values, (index, value) => {
const currentParams = [];
switch (value) {
case 'reason':
if (form['csd.reason_1']) {
const dbrationale = form['csd.reason_1'].value;
if (!dbrationale || !dbrationale.trim()) {
alert('Lý do tùy chọn: Vui lòng nêu ra một lý do.');
parameters = null;
return false;
}
currentParams['1'] = dbrationale;
}
break;
case 'userreq': // TV1
if (form['csd.userreq_rationale']) {
const u1rationale = form['csd.userreq_rationale'].value;
if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) &&
(!u1rationale || !u1rationale.trim())) {
alert('XN TV1: Vui lòng đưa ra lý do khi đề cử xóa các trang thảo luận của người dùng.');
parameters = null;
return false;
}
currentParams.rationale = u1rationale;
}
break;
case 'repost': // C4
if (form['csd.repost_xfd']) {
const deldisc = form['csd.repost_xfd'].value;
if (deldisc) {
currentParams.xfd = deldisc;
}
}
break;
case 'banned': // C5
if (form['csd.banned_user'] && form['csd.banned_user'].value) {
currentParams.user = form['csd.banned_user'].value.replace(/^\s*User:/i, '');
}
break;
case 'gs': // C5
if (form['csd.code']) {
currentParams.code = form['csd.code'].value;
}
break;
case 'move': // C6
if (form['csd.move_page'] && form['csd.move_reason']) {
const movepage = form['csd.move_page'].value,
movereason = form['csd.move_reason'].value;
if (!movepage || !movepage.trim()) {
alert('CSD G6 (move): Please specify the page to be moved here.');
parameters = null;
return false;
}
if (!movereason || !movereason.trim()) {
alert('CSD G6 (move): Please specify the reason for the move.');
parameters = null;
return false;
}
currentParams.page = movepage;
currentParams.reason = movereason;
}
break;
case 'xfd': // C6
if (form['csd.xfd_fullvotepage']) {
const xfd = form['csd.xfd_fullvotepage'].value;
if (xfd) {
currentParams.fullvotepage = xfd;
}
}
break;
case 'copypaste': // C6
if (form['csd.copypaste_sourcepage']) {
const copypaste = form['csd.copypaste_sourcepage'].value;
if (!copypaste || !copypaste.trim()) {
alert('CSD G6 (copypaste): Please specify the source page name.');
parameters = null;
return false;
}
currentParams.sourcepage = copypaste;
}
break;
case 'c6': // C6
if (form['csd.c6_rationale'] && form['csd.c6_rationale'].value) {
currentParams.rationale = form['csd.c6_rationale'].value;
}
break;
case 'author': // C7
if (form['csd.author_rationale'] && form['csd.author_rationale'].value) {
currentParams.rationale = form['csd.author_rationale'].value;
}
break;
case 'c8': // C8
if (form['csd.c8_rationale'] && form['csd.c8_rationale'].value) {
currentParams.rationale = form['csd.c8_rationale'].value;
}
break;
case 'attack': // C10
currentParams.blanked = 'yes';
// it is actually blanked elsewhere in code, but setting the flag here
break;
case 'copyvio': // C12
if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) {
currentParams.url = form['csd.copyvio_url'].value;
}
if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) {
currentParams.url2 = form['csd.copyvio_url2'].value;
}
if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) {
currentParams.url3 = form['csd.copyvio_url3'].value;
}
break;
case 'foreign': // MT2
if (form['csd.foreign_source']) {
const foreignlink = form['csd.foreign_source'].value;
if (!foreignlink || !foreignlink.trim()) {
alert('XN MT2: Vui lòng chỉ rõ liên kết interwiki đến mục từ bị sao chép.');
parameters = null;
return false;
}
currentParams.source = foreignlink;
}
break;
case 'mt10': // C10
if (form['csd.mt10_article']) {
const duptitle = form['csd.mt10_article'].value;
if (!duptitle || !duptitle.trim()) {
alert('XN MT10: Vui lòng chỉ rõ tên mục từ trùng lặp nội dung.');
parameters = null;
return false;
}
currentParams.article = duptitle;
}
break;
case 'bm2': // T2
if (form['csd.bm2_rationale'] && form['csd.bm2_rationale'].value) {
currentParams.rationale = form['csd.bm2_rationale'].value;
}
break;
default:
break;
}
parameters.push(currentParams);
});
return parameters;
};
// Function for processing talk page notification template parameters
// key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}})
// utparams.param: for {{db-[notice|deleted]-multiple}}
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
const utparams = [];
// Special cases
if (normalized === 'db') {
utparams['2'] = parameters['1'];
} else if (normalized === 'c6') {
utparams.key1 = 'to';
utparams.value1 = Morebits.pageNameNorm;
} else if (normalized === 'c12') {
['url', 'url2', 'url3'].forEach((item, idx) => {
if (parameters[item]) {
idx++;
utparams['key' + idx] = item;
utparams['value' + idx] = utparams[item] = parameters[item];
}
});
} else {
// Handle the rest
let param;
switch (normalized) {
case 'c4':
param = 'xfd';
break;
case 'c5': // Only for db-gs, as db-g5 doesn't send a notice
param = 'code';
break;
case 'mt2':
param = 'source';
break;
case 'mt10':
param = 'article';
break;
default:
break;
}
// No harm in providing a usertalk template with the others' parameters
if (param && parameters[param]) {
utparams.key1 = param;
utparams.value1 = utparams[param] = parameters[param];
}
}
return utparams;
};
/**
* @param {Event} e
* @return {Array}
*/
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
const values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert('Vui lòng chỉ định một tiêu chí!');
return null;
}
return values;
};
Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const tag_only = form.tag_only;
if (tag_only && tag_only.checked) {
Twinkle.speedy.callback.evaluateUser(e);
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator
let watchPage, promptForSummary;
normalizeds.forEach((norm) => {
if (Twinkle.getPref('watchSpeedyPages').includes(norm)) {
watchPage = Twinkle.getPref('watchSpeedyExpiry');
}
if (Twinkle.getPref('promptForSpeedyDeletionSummary').includes(norm)) {
promptForSummary = true;
}
});
const warnusertalk = form.warnusertalk.checked && normalizeds.some((norm, index) => Twinkle.getPref('warnUserOnSpeedyDelete').includes(norm) &&
!(norm === 'g6' && values[index] !== 'copypaste') && !(norm === 'g5' && values[index] !== 'gs'));
const welcomeuser = warnusertalk && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
warnUser: warnusertalk,
welcomeuser: welcomeuser,
promptForSummary: promptForSummary,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Twinkle.speedy.callbacks.sysop.main(params);
};
Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
// var multiple = form.multiple.checked;
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page/notify the creator
const watchPage = normalizeds.some((csdCriteria) => Twinkle.getPref('watchSpeedyPages').includes(csdCriteria)) && Twinkle.getPref('watchSpeedyExpiry');
const notifyuser = form.notify.checked && normalizeds.some((norm, index) => Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').includes(norm) &&
!(norm === 'c6' && values[index] !== 'copypaste') && !(norm === 'c5' && values[index] !== 'gs'));
const welcomeuser = notifyuser && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some((norm) => !Twinkle.getPref('noLogOnSpeedyNomination').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
usertalk: notifyuser,
welcomeuser: welcomeuser,
lognomination: csdlog,
requestsalt: form.salting.checked,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'Gán nhãn hoàn tất';
const wikipedia_page = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang gán nhãn trang');
wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};
Twinkle.addInitCallback(Twinkle.speedy, 'speedy');
}());
// </nowiki>
3iu29r4chcmkmy0nx0h2dq4aqi230df
2353333
2353235
2026-05-14T18:36:36Z
Kateru Zakuro
34522
2353333
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinklespeedy.js: CSD module
****************************************
* Mode of invocation: Tab ("CSD")
* Active on: Non-special, existing pages
*
* NOTE FOR DEVELOPERS:
* If adding a new criterion, add it to the appropriate places at the top of
* twinkleconfig.js. Also check out the default values of the CSD preferences
* in twinkle.js, and add your new criterion to those if you think it would be
* good.
*/
Twinkle.speedy = function twinklespeedy() {
// Disable on:
// * special pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
return;
}
Twinkle.addPortletLink(Twinkle.speedy.callback, 'Xóa nhanh', 'tw-csd', Morebits.userIsSysop ? 'Xóa trang theo WT:XN' : 'Đề nghị xóa nhanh theo WT:XN');
};
Twinkle.speedy.data = [
{
list: 'customRationale',
label: 'Tiêu chí tùy chọn' + (Morebits.userIsSysop ? ' (lý do xóa tùy chọn)' : ' sử dụng bản mẫu {{db}}'),
code: 'db',
db: 'reason',
tooltip: 'Tên bản mẫu {{db}} là viết tắt của "xóa bởi vì" (delete because). Trang sắp bị xóa phải được áp dụng tối thiểu một trong các tiêu chí xóa nhanh với lý do hợp lý. Lưu ý đây không phải là tiêu chí "chung cho tất cả trường hợp" khi bạn không thể tìm thấy bất kỳ tiêu chí xóa nhanh nào phù hợp.',
subgroup: {
name: 'reason_1',
type: 'input',
label: 'Lý do:',
size: 60
},
hideWhenMultiple: true
},
{
list: 'talkList',
label: 'C8: Trang thảo luận của trang không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'talk',
tooltip: 'Tiêu chí này không bao gồm bất kỳ trang nào hữu ích cho dự án - cụ thể là các trang thảo luận của người dùng, trang lưu trữ trang thảo luận và các trang thảo luận của các tập tin đang tồn tại ở Wikimedia Commons.'
},
{
list: 'articleList',
label: 'MT1: Không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến.',
code: 'mt1',
db: 'nocontext',
tooltip: 'Tiêu chí này áp dụng cho các mục từ "thiếu ngữ cảnh cần thiết" để nhận diện.'
},
{
list: 'articleList',
label: 'MT2: Mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
code: 'mt2',
db: 'foreign',
tooltip: 'Tiêu chí này áp dụng cho các mục từ được chép nguyên văn từ một dự án Wiktionary ngôn ngữ khác sang',
subgroup: {
name: 'foreign_source',
type: 'input',
label: 'Liên kết Interwiki đến mục từ trên wiki ngoại ngữ:',
tooltip: 'Ví dụ: fr:Bonjour'
}
},
{
list: 'articleList',
label: 'MT3: Không có nội dung thực',
code: 'mt3',
db: 'nocontent',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ không có nội dung thực (ví dụ, mục từ chỉ gồm các liên kết, thể loại, phần "Xem thêm" và một câu lặp lại tiêu đề).'
},
{
list: 'articleList',
label: 'MT7: Mục từ chưa đủ tiêu chuẩn rõ ràng',
code: 'mt7',
db: 'mt7',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ mục từ rõ ràng chưa đủ tiêu chuẩn để được đưa vào Wiktionary',
},
{
list: 'articleList',
label: 'MT10: Mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn',
code: 'mt10',
db: 'mt10',
tooltip: 'Tiêu chí này áp dụng cho các mục từ có nội dung được sao chép từ một mục từ đã tồn tại trước đó.',
subgroup: {
name: 'mt10_article',
type: 'input',
label: 'Tên mục từ bị sao chép:'
}
},
{
list: 'categoryList',
label: 'TL1: Thể loại trống hoặc không cần thiết',
code: 'tl1',
db: 'catempty',
tooltip: 'Tiêu chí này áp dụng cho các thể loại trống hoặc không cần thiết. Các thể loại bảo quản (ví dụ như Thể loại:Chờ xóa) không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM1: Bản mẫu/Mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary',
code: 'bm1',
db: 'bm1',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun có nội dung hoặc cách trình bày vi phạm quy định của Wiktionary. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh.'
},
{
list: 'templateList',
label: 'BM2: Bản mẫu/Mô đun không thể được sử dụng hữu ích theo bất kỳ cách nào hoặc theo biểu quyết đồng thuận',
code: 'bm2',
db: 'bm2',
tooltip: 'Tiêu chí này áp dụng cho các bản mẫu/mô đun không được sử dụng hữu ích. Quản trị viên cần phải xem xét kỹ lưỡng bản mẫu/mô đun có thật sự hữu ích với Wiktionary hay không trước khi xóa nhanh. Lưu ý các bản mẫu/mô đun quan trọng nhiều người xem hoặc được nhúng ở nhiều trang khác thì không thuộc diện xóa nhanh. Nếu không thể xóa nhanh, bản mẫu/mô đun nên được đưa ra thảo luận tìm đồng thuận để quyết định xóa hay giữ. Tiêu chí này sẽ có hiệu lực nếu biểu quyết đồng thuận có kết quả là xóa.',
subgroup: {
name: 'bm2_rationale',
type: 'input',
label: 'Lý do (nếu có):',
size: 60
}
},
{
list: 'userList',
label: 'TV1: Thành viên yêu cầu xóa',
code: 'tv1',
db: 'userreq',
tooltip: 'Thành viên có quyền được yêu cầu xóa các trang thành viên và trang con của mình (nhưng không phải là các trang thảo luận thành viên) theo yêu cầu cá nhân.',
subgroup: mw.config.get('wgNamespaceNumber') === 3 && !mw.config.get('wgTitle').includes('/') ? {
name: 'userreq_rationale',
type: 'input',
label: 'Lý do bắt buộc để giải thích lý do tại sao nên xóa trang thảo luận của người dùng này:',
tooltip: 'Các trang thảo luận của người dùng chỉ bị xóa trong những trường hợp đặc biệt nghiêm trọng.',
size: 60
} : null,
hideSubgroupWhenMultiple: true
},
{
list: 'userList',
code: 'tv2',
label: 'TV2: Tên thành viên chưa đăng ký',
db: 'nouser',
tooltip: 'Tiêu chí này áp dụng cho các trang thành viên chưa đăng ký/không tồn tại.'
},
{
list: 'generalList',
label: 'C1: Vô nghĩa rõ ràng',
code: 'c1',
db: 'nonsense',
tooltip: 'Tiêu chí này áp dụng với những trang chứa các đoạn văn bản hoàn toàn không mạch lạc hoặc vô nghĩa, và cả nội dung lẫn lịch sử trang đều không chứa nội dung gì có ý nghĩa.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C2: Trang thử nghiệm',
code: 'c2',
db: 'test',
tooltip: 'Tiêu chí này áp dụng với những trang được tạo ra nhằm thử nghiệm chức năng sửa đổi hoặc những chức năng khác của Wiktionary. Tiêu chí không áp dụng với những trang con của chỗ thử Wiktionary được tạo ra cho mục đích thử nghiệm.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
list: 'generalList',
label: 'C3: Hoàn toàn là phá hoại hoặc lừa bịp rõ ràng',
code: 'c3',
db: 'vandalism',
tooltip: 'Tiêu chí này áp dụng với những trang tung thông tin sai lệch, tin vịt (thông tin lừa bịp) rõ ràng, và các trang đổi hướng được tạo ra sau khi đổi tên những trang bị phá hoại tiêu đề về trang có tên đúng.'
},
{
list: 'generalList',
label: 'C4: Trang được tạo lại với nội dung của một trang đã từng bị xoá theo biểu quyết',
code: 'c4',
db: 'repost',
tooltip: 'Tiêu chí này áp dụng với những bản sao y hệt, dù đã được đổi sang tiêu đề mới, của một trang đã từng bị xoá theo kết quả của lần biểu quyết xoá gần đây nhất.',
subgroup: {
name: 'repost_xfd',
type: 'input',
label: 'Trang diễn ra cuộc thảo luận xóa:',
tooltip: 'Phải bắt đầu với tiền tố "Wiktionary:"',
size: 60
}
},
{
list: 'generalList',
label: 'C5: Trang do thành viên bị cấm tạo ra',
code: 'c5',
db: 'banned',
tooltip: 'Tiêu chí này áp dụng với những trang do các thành viên bị cấm tạo ra mà vi phạm lệnh cấm.',
subgroup: {
name: 'banned_user',
type: 'input',
label: 'Tên thành viên bị cấm (nếu có):',
tooltip: 'Không bắt đầu bằng tiền tố "User:" hoặc "Thành viên:"'
}
},
{
list: 'generalList',
label: 'C6: Xóa để thực hiện các tác vụ bảo trì kĩ thuật',
code: 'c6',
db: 'c6',
tooltip: 'Tiêu chí này áp dụng với các tác vụ xóa để thực hiện công tác bảo trì kĩ thuật.',
subgroup: {
name: 'c6_rationale',
type: 'input',
label: 'Lý do:',
size: 60
}
},
{
list: 'generalList',
label: 'C7: Người viết/Tác giả yêu cầu xóa',
code: 'c7',
db: 'author',
tooltip: 'Tiêu chí này áp dụng trong trường hợp chính tác giả yêu cầu xoá (một cách có thiện chí) và đây phải là tác giả đóng góp nội dung chủ yếu của trang.',
subgroup: {
name: 'author_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
tooltip: 'Liên kết đến nơi mà tác giả yêu cầu xóa.',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C8: Trang liên quan đến một trang khác không tồn tại hoặc đã bị xóa',
code: 'c8',
db: 'c8',
tooltip: 'Những trường hợp áp dụng tiêu chí này bao gồm trang thảo luận không có trang nội dung tương ứng, trang con nhưng không có trang cha mẹ bên ngoài, trang tập tin không chứa tập tin tương ứng, trang đổi hướng tới trang đích không hợp lệ, chẳng hạn như trang đích không tồn tại, trang đổi hướng bị lặp vòng, hoặc đổi hướng đến trang có tên nằm trong danh sách đen tiêu đề trang, thông báo sửa đổi không sử dụng thuộc về những trang không tồn tại hoặc bị xoá và khoá khả năng tạo mới, và các thể loại được thêm tự động nhờ các bản mẫu đã bị xoá hoặc bị đổi hướng.',
subgroup: {
name: 'c8_rationale',
type: 'input',
label: 'Lý do tùy chọn:',
size: 60
},
hideSubgroupWhenSysop: true
},
{
list: 'generalList',
label: 'C10: Trang có nội dung tấn công cá nhân',
code: 'c10',
db: 'attack',
tooltip: 'Các ví dụ của các "trang có nội dung tấn công" có thể bao gồm phỉ báng, đe dọa pháp lý, thông tin hoàn toàn với ý định quấy rối hoặc đe dọa một cá nhân hay người đang sống, có giọng điệu hoàn toàn tiêu cực và không có nguồn gốc. Những trang này nên được xóa nhanh khi không có bất cứ phiên bản sửa đổi trang nào thể hiện thái độ trung lập để lùi sửa.'
},
{
list: 'generalList',
label: 'C11: Quảng cáo, quảng bá cho một công ty, sản phẩm, dịch vụ hay cá nhân',
code: 'c11',
db: 'spam',
tooltip: 'Tiêu chí này áp dụng với những mục từ chỉ có một mục đích duy nhất là quảng cáo cho một công ty, sản phẩm, dịch vụ hay cá nhân và cần được viết lại nếu muốn đáp ứng yêu cầu bách khoa.'
},
{
list: 'generalList',
label: 'C12: Vi phạm bản quyền',
code: 'c12',
db: 'copyvio',
tooltip: 'Tiêu chí này áp dụng với các trang vi phạm bản quyền rõ ràng',
subgroup: [
{
name: 'copyvio_url',
type: 'input',
label: 'URL (nếu có):',
tooltip: 'Nếu được sao chép từ một nguồn trực tuyến, hãy đặt URL ở đây, bao gồm giao thức "http://" hoặc "https://".',
size: 60
},
{
name: 'copyvio_url2',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
},
{
name: 'copyvio_url3',
type: 'input',
label: 'URL bổ sung:',
tooltip: 'Không bắt buộc. Nên bắt đầu với "http://" hoặc "https://"',
size: 60
}
]
},
{
list: 'redirectList',
label: 'ĐH2: Đổi hướng liên không gian',
code: 'dh2',
db: 'rediruser',
tooltip: 'Tiêu chí này áp dụng cho các trang đổi hướng (trừ các trang viết tắt) từ không gian chính (không gian mục từ) đến bất kỳ không gian nào, ngoại trừ các không gian sau Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp: và Phụ lục:.',
showInNamespaces: [ 0 ]
},
{
list: 'redirectList',
label: 'ĐH3: Trang đổi hướng tên sai do lỗi chính tả, lỗi bỏ dấu từ',
code: 'dh3',
db: 'redirtypo',
tooltip: 'Tiêu chí này áp dụng với các trang có tên sai, chẳng hạn như lỗi chính tả, lỗi bỏ dấu từ, lỗi trình bày... Lưu ý trong một số trường hợp, nếu tên mục từ sai nhưng phổ biến thì có thể giữ lại và đổi hướng đến trang đích có tên đúng.'
},
{
list: 'redirectList',
label: 'C8: Trang đổi hướng đến một trang không tồn tại',
code: 'c8',
db: 'redirnone',
tooltip: 'Tiêu chí này áp dụng cho bất kỳ trang đổi hướng nào đến trang không tồn tại. Khi xóa một trang, quản trị viên lưu ý kiểm tra và xóa tất cả các trang đổi hướng đến trang vừa xóa nếu có.',
hideWhenMultiple: true
}
];
/**
* Given a list name such as talkList, fileList, redirectList, etc, return the CSDs that should be in that list.
*/
Twinkle.speedy.getCsdList = ( csdList ) => {
const list = [];
for (const item of Twinkle.speedy.data) {
if (item.list === csdList) {
const copy = Object.assign({}, item);
// Change some things to match the old spec, from before I refactored this.
delete copy.list;
delete copy.code;
copy.value = copy.db;
delete copy.db;
list.push(copy);
}
}
return list;
};
Twinkle.speedy.customRationale = Twinkle.speedy.getCsdList( 'customRationale' );
Twinkle.speedy.talkList = Twinkle.speedy.getCsdList( 'talkList' );
Twinkle.speedy.fileList = Twinkle.speedy.getCsdList( 'fileList' );
Twinkle.speedy.articleList = Twinkle.speedy.getCsdList( 'articleList' );
Twinkle.speedy.categoryList = Twinkle.speedy.getCsdList( 'categoryList' );
Twinkle.speedy.templateList = Twinkle.speedy.getCsdList( 'templateList' );
Twinkle.speedy.userList = Twinkle.speedy.getCsdList( 'userList' );
Twinkle.speedy.generalList = Twinkle.speedy.getCsdList( 'generalList' );
Twinkle.speedy.redirectList = Twinkle.speedy.getCsdList( 'redirectList' );
Twinkle.speedy.timedTextList = Twinkle.speedy.getCsdList( 'timedTextList' );
/**
* Iterate over Twinkle.speedy.data. Turn `code: 'c8', db: 'redirnone',` into `redirnone: 'c8',`
*/
Twinkle.speedy.getNormalizeHash = () => {
const hash = {};
for (const item of Twinkle.speedy.data) {
if (item.code && item.db) {
hash[item.db] = item.code;
}
}
return hash;
};
/**
* This is a map of Db-word templates to CSD codes such as mt1. For example, `"nocontext": "mt1"`
*/
Twinkle.speedy.normalizeHash = Twinkle.speedy.getNormalizeHash();
// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};
// Used by unlink feature
Twinkle.speedy.dialog = null;
// Used throughout
Twinkle.speedy.hasCSD = !!$('#delete-reason').length;
// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
Twinkle.speedy.dialog = new Morebits.SimpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
const dialog = Twinkle.speedy.dialog;
dialog.setTitle('Chọn tiêu chí xóa nhanh');
dialog.setScriptName('Twinkle');
dialog.addFooterLink('Quy định xóa nhanh', 'WT:XN');
dialog.addFooterLink('Tùy chọn CSD', 'WT:TW/PREF#speedy');
dialog.addFooterLink('Trợ giúp Twinkle', 'WT:TW/DOC#speedy');
dialog.addFooterLink('Gửi phản hồi', 'WT:TW');
const form = new Morebits.QuickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null);
if (Morebits.userIsSysop) {
form.append({
type: 'checkbox',
list: [
{
label: 'Chỉ gán nhãn trang, không xóa',
value: 'tag_only',
name: 'tag_only',
tooltip: 'Nếu bạn chỉ muốn gán nhãn trang, thay vì xóa nhanh ngay lúc này',
checked: !(Twinkle.speedy.hasCSD || (mw.config.get('wgRelevantUserName') === mw.config.get('wgUserName')) || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
const cForm = event.target.form;
const cChecked = event.target.checked;
// enable talk page checkbox
if (cForm.talkpage) {
cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
}
// enable redirects checkbox
cForm.redirects.checked = !cChecked;
// enable delete multiple
cForm.delmultiple.checked = false;
// enable notify checkbox
cForm.notify.checked = cChecked;
// enable deletion notification checkbox
cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD;
// enable multiple
cForm.multiple.checked = false;
// enable requesting creation protection
cForm.salting.checked = false;
Twinkle.speedy.callback.modeChanged(cForm);
event.stopPropagation();
}
}
]
});
const deleteOptions = form.append({
type: 'div',
name: 'delete_options'
});
deleteOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến việc xóa trang'
});
if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa trang thảo luận',
value: 'talkpage',
name: 'talkpage',
tooltip: "Tùy chọn này sẽ xóa thêm trang thảo luận của trang.",
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
event: function(event) {
event.stopPropagation();
}
}
]
});
}
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Đồng thời xóa tất cả các trang đổi hướng',
value: 'redirects',
name: 'redirects',
tooltip: 'Tùy chọn này cũng xóa thêm tất cả các trang đổi hướng đến. Hãy tránh dùng tùy chọn này cho các tác vụ xóa theo thủ tục (ví dụ: di chuyển/hợp nhất).',
checked: Twinkle.getPref('deleteRedirectsOnDelete'),
event: function (event) {
event.stopPropagation();
}
},
{
label: 'Xóa theo nhiều tiêu chí',
value: 'delmultiple',
name: 'delmultiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
},
{
label: 'Thông báo cho người tạo trang về việc xóa trang',
value: 'warnusertalk',
name: 'warnusertalk',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang, ' +
'người tạo trang cũng có thể được thông báo.',
checked: !Twinkle.speedy.hasCSD,
event: function(event) {
event.stopPropagation();
}
}
]
});
}
const tagOptions = form.append({
type: 'div',
name: 'tag_options'
});
if (Morebits.userIsSysop) {
tagOptions.append({
type: 'header',
label: 'Các tùy chọn liên quan đến nhãn'
});
}
tagOptions.append({
type: 'checkbox',
list: [
{
label: 'Thông báo cho người tạo trang nếu có thể',
value: 'notify',
name: 'notify',
tooltip: 'Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo trang. ' +
'Người tạo trang cũng có thể được hoan nghênh.',
checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn để khóa việc tạo trang',
value: 'salting',
name: 'salting',
tooltip: 'Khi được chọn, nhãn xóa nhanh sẽ được kèm theo nhãn {{salt}} để yêu cầu quản trị viên khi xóa trang áp dụng biện pháp khóa tạo trang. Chỉ chọn chức năng này nếu trang bị xóa được tạo đi tạo lại nhiều lần.',
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Gán nhãn với nhiều tiêu chí',
value: 'multiple',
name: 'multiple',
tooltip: 'Chọn chức năng này nếu bạn muốn áp dụng nhiều tiêu chí cho trang sẽ bị xóa.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
}
]
});
form.append({
type: 'div',
id: 'prior-deletion-count',
style: 'font-style: italic'
});
form.append({
type: 'div',
name: 'work_area',
label: 'Không thể khởi chạy mô đun CSD. Vui lòng thử lại hoặc báo với các nhà phát triển Twinkle về vấn đề này.'
});
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged
}
const result = form.render();
dialog.setContent(result);
dialog.display();
Twinkle.speedy.callback.modeChanged(result);
// Check for prior deletions. Just once, upon init
Twinkle.speedy.callback.priorDeletionCount();
};
Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
const namespace = mw.config.get('wgNamespaceNumber');
// first figure out what mode we're in
const mode = {
isSysop: !!form.tag_only && !form.tag_only.checked,
isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked,
isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick'
};
if (mode.isSysop) {
$('[name=delete_options]').show();
$('[name=tag_options]').hide();
$('button.tw-speedy-submit').text('Xóa trang');
} else {
$('[name=delete_options]').hide();
$('[name=tag_options]').show();
$('button.tw-speedy-submit').text('Gán nhãn trang');
}
const work_area = new Morebits.QuickForm.Element({
type: 'div',
name: 'work_area'
});
if (mode.isMultiple && mode.isRadioClick) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
work_area.append({
type: 'div',
label: 'Khi chọn xong tiêu chí, hãy nhấp vào:'
});
work_area.append({
type: 'button',
name: 'submit-multiple',
label: mode.isSysop ? 'Xóa trang' : 'Gán thẻ trang',
event: function(event) {
Twinkle.speedy.callback[evaluateType](event);
event.stopPropagation();
}
});
}
const appendList = function(headerLabel, csdList) {
work_area.append({ type: 'header', label: headerLabel });
work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) });
};
if (mode.isSysop && !mode.isMultiple) {
appendList('Tiêu chí tùy chọn', Twinkle.speedy.customRationale);
}
if (namespace % 2 === 1 && namespace !== 3) {
// show db-talk on talk pages, but not user talk pages
appendList('Trang thảo luận', Twinkle.speedy.talkList);
}
if (!Morebits.isPageRedirect()) {
switch (namespace) {
case 0: // article
case 1: // talk
appendList('Mục từ', Twinkle.speedy.articleList);
break;
case 2: // user
case 3: // user talk
appendList('Trang thành viên', Twinkle.speedy.userList);
break;
case 6: // file
case 7: // file talk
break;
case 10: // template
case 11: // template talk
case 828: // module
case 829: // module talk
appendList('Bản mẫu/Mô đun', Twinkle.speedy.templateList);
break;
case 14: // category
case 15: // category talk
appendList('Thể loại', Twinkle.speedy.categoryList);
break;
case 710: // timed text
case 711: // timed text talk
break;
default:
break;
}
} else {
if (namespace === 2 || namespace === 3) {
appendList('Trang thành viên', Twinkle.speedy.userList);
}
appendList('Trang đổi hướng', Twinkle.speedy.redirectList);
}
let generalCriteria = Twinkle.speedy.generalList;
// custom rationale lives under general criteria when tagging
if (!mode.isSysop) {
generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria);
}
appendList('Tiêu chí chung', generalCriteria);
const old_area = Morebits.QuickForm.getElements(form, 'work_area')[0];
form.replaceChild(work_area.render(), old_area);
// if sysop, check if CSD is already on the page and fill in custom rationale
if (mode.isSysop && Twinkle.speedy.hasCSD) {
const customOption = $('input[name=csd][value=reason]')[0];
if (customOption) {
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
// force listeners to re-init
customOption.click();
customOption.parentNode.appendChild(customOption.subgroup);
}
customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' ');
}
}
};
Twinkle.speedy.callback.priorDeletionCount = function () {
const query = {
action: 'query',
format: 'json',
list: 'logevents',
letype: 'delete',
leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel
letitle: mw.config.get('wgPageName'),
leprop: '', // We're just counting we don't actually care about the entries
lelimit: 5 // A little bit goes a long way
};
new Morebits.wiki.Api('Checking for past deletions', query, ((apiobj) => {
const response = apiobj.getResponse();
const delCount = response.query.logevents.length;
if (delCount) {
let message = delCount + ' previous deletion';
if (delCount > 1) {
message += 's';
if (response.continue) {
message = 'More than ' + message;
}
// 3+ seems problematic
if (delCount >= 3) {
$('#prior-deletion-count').css('color', 'red');
}
}
// Provide a link to page logs (CSD templates have one for sysops)
const link = Morebits.htmlNode('a', '(logs)');
link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')}));
link.setAttribute('target', '_blank');
$('#prior-deletion-count').text(message + ' '); // Space before log link
$('#prior-deletion-count').append(link);
}
})).post();
};
Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
const pageNamespace = mw.config.get('wgNamespaceNumber');
const openSubgroupHandler = function(e) {
$(e.target.form).find('input').prop('disabled', true);
$(e.target.form).children().css('color', 'gray');
$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
$(e.target).parent().find('input:text')[0].focus();
e.stopPropagation();
};
const submitSubgroupHandler = function(e) {
const evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
Twinkle.speedy.callback[evaluateType](e);
e.stopPropagation();
};
return $.map(list, (critElement) => {
const criterion = $.extend({}, critElement);
if (mode.isMultiple) {
if (criterion.hideWhenMultiple) {
return null;
}
if (criterion.hideSubgroupWhenMultiple) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenSingle) {
return null;
}
if (criterion.hideSubgroupWhenSingle) {
criterion.subgroup = null;
}
}
if (mode.isSysop) {
if (criterion.hideWhenSysop) {
return null;
}
if (criterion.hideSubgroupWhenSysop) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenUser) {
return null;
}
if (criterion.hideSubgroupWhenUser) {
criterion.subgroup = null;
}
}
if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) {
return null;
}
if (criterion.showInNamespaces && !criterion.showInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.hideInNamespaces && criterion.hideInNamespaces.includes(pageNamespace)) {
return null;
}
if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) {
if (Array.isArray(criterion.subgroup)) {
criterion.subgroup = criterion.subgroup.concat({
type: 'button',
name: 'submit',
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
});
} else {
criterion.subgroup = [
criterion.subgroup,
{
type: 'button',
name: 'submit', // ends up being called "csd.submit" so this is OK
label: mode.isSysop ? 'Delete page' : 'Tag page',
event: submitSubgroupHandler
}
];
}
// FIXME: does this do anything?
criterion.event = openSubgroupHandler;
}
return criterion;
});
};
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
let code, parameters, i;
if (params.normalizeds.length > 1) {
code = '{{db-multiple';
params.utparams = {};
$.each(params.normalizeds, (index, norm) => {
code += '|' + norm.toUpperCase();
parameters = params.templateParams[index] || [];
for (const i in parameters) {
if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them
code += '|' + i + '=' + parameters[i];
}
}
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
});
code += '}}';
} else {
parameters = params.templateParams[0] || [];
code = '{{db-' + params.values[0];
for (i in parameters) {
if (typeof parameters[i] === 'string') {
code += '|' + i + '=' + parameters[i];
}
}
if (params.usertalk) {
code += '|help=off';
}
code += '}}';
params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
}
return [code, params.utparams];
},
parseWikitext: function(wikitext, callback) {
const query = {
action: 'parse',
prop: 'text',
pst: 'true',
text: wikitext,
contentmodel: 'wikitext',
title: mw.config.get('wgPageName'),
disablelimitreport: true,
format: 'json'
};
const statusIndicator = new Morebits.Status('Đang xây dựng tóm tắt xóa');
const api = new Morebits.wiki.Api('Đang phân tích cú pháp bản mẫu xóa', query, ((apiobj) => {
const reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' ');
if (!reason) {
statusIndicator.warn('Không thể tạo tóm tắt từ bản mẫu xóa');
} else {
statusIndicator.info('hoàn tất');
}
callback(reason);
}), statusIndicator);
api.post();
},
noteToCreator: function(pageobj) {
const params = pageobj.getCallbackParameters();
let initialContrib = pageobj.getCreator();
// disallow notifying yourself
if (initialContrib === mw.config.get('wgUserName')) {
Morebits.Status.warn('You (' + initialContrib + ') created this page; skipping user notification');
initialContrib = null;
// don't notify users when their user talk page is nominated/deleted
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
Morebits.Status.warn('Notifying initial contributor: this user created their own user talk page; skipping notification');
initialContrib = null;
// Check for already existing tags
} else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('The page has a deletion-related tag, and thus the creator has likely been notified. Do you want to notify them for this deletion as well?')) {
Morebits.Status.info('Notifying initial contributor', 'canceled by user; skipping notification.');
initialContrib = null;
}
if (initialContrib) {
const usertalkpage = new Morebits.wiki.Page('User talk:' + initialContrib, 'Notifying initial contributor (' + initialContrib + ')');
let notifytext, i, editsummary;
// special cases: "db" and "db-multiple"
if (params.normalizeds.length > 1) {
notifytext = '\n{{subst:db-' + (params.warnUser ? 'deleted' : 'notice') + '-multiple|1=' + Morebits.pageNameNorm;
let count = 2;
$.each(params.normalizeds, (index, norm) => {
notifytext += '|' + count++ + '=' + norm.toUpperCase();
});
} else if (params.normalizeds[0] === 'db') {
notifytext = '\n{{subst:db-reason-' + (params.warnUser ? 'deleted' : 'notice') + '|1=' + Morebits.pageNameNorm;
} else {
notifytext = '\n{{subst:db-csd-' + (params.warnUser ? 'deleted' : 'notice') + '-custom|1=';
if (params.values[0] === 'copypaste') {
notifytext += params.templateParams[0].sourcepage;
} else {
notifytext += Morebits.pageNameNorm;
}
notifytext += '|2=' + params.values[0];
}
for (i in params.utparams) {
if (typeof params.utparams[i] === 'string') {
notifytext += '|' + i + '=' + params.utparams[i];
}
}
notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~';
editsummary = 'Notification: speedy deletion' + (params.warnUser ? '' : ' nomination');
if (!params.normalizeds.includes('c10')) { // no article name in summary for G10 taggings
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
editsummary += ' of an attack page.';
}
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary);
usertalkpage.setChangeTags(Twinkle.changeTags);
usertalkpage.setCreateOption('recreate');
usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser'));
usertalkpage.setFollowRedirect(true, false);
usertalkpage.append(() => {
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
}
}, () => {
// if user could not be notified, log nomination without mentioning that notification was sent
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
});
} else if (params.lognomination) {
// log nomination even if the user notification wasn't sent
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
sysop: {
main: function(params) {
let reason;
if (!params.normalizeds.length && params.normalizeds[0] === 'db') {
reason = prompt('Nhập tóm tắt xóa để sử dụng, tóm tắt này sẽ được nhập vào nhật trình xóa:', '');
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
} else {
const code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0];
Twinkle.speedy.callbacks.parseWikitext(code, (reason) => {
if (params.promptForSummary) {
reason = prompt('Nhập bản tóm tắt xóa để sử dụng hoặc nhấn OK để chấp nhận bản tóm tắt được tạo tự động.', reason);
}
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
});
}
},
deletePage: function(reason, params) {
const thispage = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang xóa trang');
if (reason === null) {
return Morebits.Status.error('Asking for reason', 'User cancelled');
} else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) {
return Morebits.Status.error('Đang yêu cầu lý do', 'bạn đã không đưa ra một lý do xóa nhanh, tác vụ đã bị hủy bỏ.');
}
const deleteMain = function(callback) {
thispage.setEditSummary(reason);
thispage.setChangeTags(Twinkle.changeTags);
thispage.setWatchlist(params.watch);
thispage.deletePage(() => {
thispage.getStatusElement().info('đã xong');
typeof callback === 'function' && callback();
Twinkle.speedy.callbacks.sysop.deleteTalk(params);
});
};
// look up initial contributor. If prompting user for deletion reason, just display a link.
// Otherwise open the talk page directly
if (params.warnUser) {
thispage.setCallbackParameters(params);
thispage.lookupCreation((pageobj) => {
deleteMain(() => {
Twinkle.speedy.callbacks.noteToCreator(pageobj);
});
});
} else {
deleteMain();
}
},
deleteTalk: function(params) {
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'f8' &&
!document.getElementById('ca-talk').classList.contains('new')) {
const talkpage = new Morebits.wiki.Page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Đang xóa trang thảo luận');
talkpage.setEditSummary('[[WT:TCXN#C8|C8]]: Trang thảo luận của trang đã xóa [[' + Morebits.pageNameNorm + ']]');
talkpage.setChangeTags(Twinkle.changeTags);
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
// (otherwise success/failure messages for the previous action would be suppressed)
window.setTimeout(() => {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}, 1800);
} else {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}
},
deleteRedirects: function(params) {
// delete redirects
if (params.deleteRedirects) {
const query = {
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'redirects',
rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops
format: 'json'
};
const wikipedia_api = new Morebits.wiki.Api('đang lấy danh sách các trang đổi hướng...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
new Morebits.Status('Đang xóa các trang đổi hướng'));
wikipedia_api.params = params;
wikipedia_api.post();
}
// promote Unlink tool
let $link, $bigtext;
if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('hấp vào đây để đến công cụ Gỡ liên kết (Unlink)')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Removing usages of and/or links to deleted file ' + Morebits.pageNameNorm);
});
$bigtext = $('<span>')
.text('To orphan backlinks and remove instances of file usage')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
} else if (params.normalized !== 'f8') {
$link = $('<a>')
.attr('href', '#')
.text('nhấp vào đây để chuyển đến công cụ Gỡ liên kết')
.css({
fontSize: '130%',
fontWeight: 'bold'
})
.on('click', () => {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Đang xóa các liên kết đến trang đã xóa ' + Morebits.pageNameNorm);
} );
$bigtext = $('<span>')
.text('Để gỡ các backlink')
.css({
fontSize: '130%',
fontWeight: 'bold'
});
Morebits.Status.info($bigtext[0], $link[0]);
}
},
deleteRedirectsMain: function(apiobj) {
const response = apiobj.getResponse();
const snapshot = response.query.pages[0].redirects || [];
const total = snapshot.length;
const statusIndicator = apiobj.statelem;
if (!total) {
statusIndicator.status('không tìm thấy trang đổi hướng nào');
return;
}
statusIndicator.status('0%');
let current = 0;
const onsuccess = function(apiobjInner) {
const now = parseInt(100 * ++current / total, 10) + '%';
statusIndicator.update(now);
apiobjInner.statelem.unlink();
if (current >= total) {
statusIndicator.info(now + ' (đã hoàn tất)');
Morebits.wiki.removeCheckpoint();
}
};
Morebits.wiki.addCheckpoint();
snapshot.forEach((value) => {
const title = value.title;
const page = new Morebits.wiki.Page(title, 'Đang xóa trang đổi hướng "' + title + '"');
page.setEditSummary('[[WT:XN#C8|C8]]: Đổi hướng đến trang đã xóa [[' + Morebits.pageNameNorm + ']]');
page.setChangeTags(Twinkle.changeTags);
page.deletePage(onsuccess);
});
}
},
user: {
main: function(pageobj) {
const statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error("Có vẻ như trang không tồn tại; có thể đã bị xóa");
return;
}
const params = pageobj.getCallbackParameters();
// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
// returns => [<string> wikitext, <object> utparams]
const buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
let code = buildData[0];
params.utparams = buildData[1];
// Tag if possible, post on talk if not
if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].includes(pageobj.getContentModel()) && mw.config.get('wgNamespaceNumber') !== 710 /* TimedText */) {
let text = pageobj.getPageText();
statelem.status('Kiểm tra các nhãn trên trang...');
// check for existing deletion tags
const tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text);
// This won't make use of the db-multiple template but it probably should
if (tag && !confirm('Trang đã chứa bản mẫu xóa nhanh (CSD) {{' + tag[1] + '}}. Bạn có muốn thêm một bản mẫu xóa nhanh khác không?')) {
return;
}
const xfd = /\{\{((?:article for deletion|proposed deletion|prod blp|template for discussion)\/dated|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text);
if (xfd && !confirm('Bản mẫu xóa {{' + xfd[1] + '}} }} đã được tìm thấy trên trang. Bạn có muốn tiếp tục thêm một bản mẫu CSD?')) {
return;
}
// curate/patrol the page
if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
pageobj.triage();
}
// Wrap SD template in noinclude tags if we are in template space.
// Won't work with userboxes in userspace, or any other transcluded page outside template space
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = '<noinclude>' + code + '</noinclude>';
}
// Remove tags that become superfluous with this action
text = text.replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
if (mw.config.get('wgNamespaceNumber') === 6) {
text = Twinkle.removeMoveToCommonsTagsFromWikicode( text );
}
if (params.requestsalt) {
if (!params.normalizeds.includes('c10')) {
code += '\n{{salt}}';
} else {
code = '{{salt}}\n' + code;
}
}
if (mw.config.get('wgPageContentModel') === 'Scribunto') {
// Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work
let equals = '';
while (code.includes(']' + equals + ']')) {
equals += '=';
}
code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);';
} else if (['javascript', 'css', 'sanitized-css'].includes(mw.config.get('wgPageContentModel'))) {
// Likewise for JS/CSS pages
code = '/* ' + code + ' */';
}
// Generate edit summary for edit
let editsummary;
if (params.normalizeds.length > 1) {
editsummary = 'Đang yêu cầu xóa nhanh (';
$.each(params.normalizeds, (index, norm) => {
editsummary += '[[WT:XN#' + norm.toUpperCase() + '|XN ' + norm.toUpperCase() + ']], ';
});
editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
editsummary += ').';
} else if (params.normalizeds[0] === 'db') {
editsummary = 'Đang yêu cầu [[Wiktionary:Quy định xóa trang#xóa nhanh|xóa nhanh]] với lý do "' + params.templateParams[0]['1'] + '".';
} else {
editsummary = 'Đang yêu cầu xóa nhanh ([[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']]).';
}
// Blank attack pages
if (params.normalizeds.includes('c10')) {
text = code;
} else {
// Insert tag after short description or any hatnotes
const wikipage = new Morebits.wikitext.Page(text);
text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText();
}
pageobj.setPageText(text);
pageobj.setEditSummary(editsummary);
pageobj.setWatchlist(params.watch);
pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
} else { // Attempt to place on talk page
const talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText();
if (talkName !== pageobj.getPageName()) {
if (params.requestsalt) {
code += '\n{{salt}}';
}
pageobj.getStatusElement().warn('Unable to edit page, placing tag on talk page');
const talkPage = new Morebits.wiki.Page(talkName, 'Automatically placing tag on talk page');
talkPage.setNewSectionTitle(pageobj.getPageName() + ' nominated for CSD, request deletion');
talkPage.setNewSectionText(code + '\n\nI was unable to tag ' + pageobj.getPageName() + ' directly, so I have placed the speedy deletion tag on this page. I request deletion of the other page. ~~~~');
talkPage.setCreateOption('recreate');
talkPage.setFollowRedirect(true);
talkPage.setWatchlist(params.watch);
talkPage.setChangeTags(Twinkle.changeTags);
talkPage.setCallbackParameters(params);
talkPage.newSection(Twinkle.speedy.callbacks.user.tagComplete);
} else {
pageobj.getStatusElement().error('Page cannot be edited and no other location to place a speedy deletion request, aborting');
}
}
},
tagComplete: function(pageobj) {
const params = pageobj.getCallbackParameters();
// Notification to first contributor, will also log nomination to the user's userspace log
if (params.usertalk) {
const thispage = new Morebits.wiki.Page(Morebits.pageNameNorm);
thispage.setCallbackParameters(params);
thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator);
// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
} else if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
addToLog: function(params, initialContrib) {
const usl = new Morebits.UserspaceLogger(Twinkle.getPref('speedyLogPageName'));
usl.initialText =
"Đây là nhật trình của tất cả đề nghị [[Wiktionary:Quy định xóa trang|xóa nhanh]] được thực hiện bởi người dùng này bằng cách sử dụng mô đun CSD của [[WT:TW|Twinkle]].\n\n" +
'Nếu bạn không muốn giữ nhật trình này nữa, bạn có thể tắt nó bằng cách sử dụng [[Wiktionary:Twinkle/Preferences|preferences panel]], và ' +
'đề cử trang này để xóa nhanh chóng dưới dạng [[WT:XN#TV1|XN TV1]].' +
(Morebits.userIsSysop ? '\n\nNhật trình này không theo dõi các thao tác xóa nhanh ngay lập tức được thực hiện bằng Twinkle.' : '');
const formatParamLog = function(normalize, csdparam, input) {
if ((normalize === 'C4' && csdparam === 'xfd') ||
(normalize === 'C6' && csdparam === 'page') ||
(normalize === 'C6' && csdparam === 'fullvotepage') ||
(normalize === 'C6' && csdparam === 'sourcepage') ||
(normalize === 'MT2' && csdparam === 'source') ||
(normalize === 'MT10' && csdparam === 'article')) {
input = '[[:' + input + ']]';
} else if (normalize === 'C5' && csdparam === 'user') {
input = '[[:User:' + input + ']]';
} else if (normalize === 'C12' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) {
input = '[' + input + ' ' + input + ']';
}
return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
};
let extraInfo = '';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
const fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : '';
let editsummary = 'Đang ghi nhật ký đề cử xóa nhanh';
let appendText = '# [[:' + Morebits.pageNameNorm;
if (!params.normalizeds.includes('c10')) { // no article name in log for G10 taggings
appendText += ']]' + fileLogLink + ': ';
editsummary += ' of [[:' + Morebits.pageNameNorm + ']].';
} else {
appendText += '|Trang]] tấn công này' + fileLogLink + ': ';
editsummary += ' của một trang tấn công.';
}
if (params.normalizeds.length > 1) {
appendText += 'nhiều tiêu chí (';
$.each(params.normalizeds, (index, norm) => {
appendText += '[[WT:XN#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']], ';
});
appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma
appendText += ')';
} else if (params.normalizeds[0] === 'db') {
appendText += '{{tl|db-reason}}';
} else {
appendText += '[[WT:XN#' + params.normalizeds[0].toUpperCase() + '|XN ' + params.normalizeds[0].toUpperCase() + ']] ({{tl|db-' + params.values[0] + '}})';
}
// If params is "empty" it will still be full of empty arrays, but ask anyway
if (params.templateParams) {
// Treat custom rationale individually
if (params.normalizeds[0] && params.normalizeds[0] === 'db') {
extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']);
} else {
params.templateParams.forEach((item, index) => {
const keys = Object.keys(item);
if (keys[0] !== undefined && keys[0].length > 0) {
// Second loop required since some items (G12, F9) may have multiple keys
keys.forEach((key, keyIndex) => {
if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') {
return true; // Not worth logging
}
extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]);
});
}
});
}
}
if (params.requestsalt) {
appendText += '; requested creation protection ([[WP:SALT|salting]])';
}
if (extraInfo) {
appendText += '; thông tin bổ sung:' + extraInfo;
}
if (initialContrib) {
appendText += '; đã thông báo {{user|1=' + initialContrib + '}}';
}
appendText += ' ~~~~~\n';
usl.changeTags = Twinkle.changeTags;
usl.log(appendText, editsummary);
}
}
};
// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
let parameters = [];
$.each(values, (index, value) => {
const currentParams = [];
switch (value) {
case 'reason':
if (form['csd.reason_1']) {
const dbrationale = form['csd.reason_1'].value;
if (!dbrationale || !dbrationale.trim()) {
alert('Lý do tùy chọn: Vui lòng nêu ra một lý do.');
parameters = null;
return false;
}
currentParams['1'] = dbrationale;
}
break;
case 'userreq': // TV1
if (form['csd.userreq_rationale']) {
const u1rationale = form['csd.userreq_rationale'].value;
if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) &&
(!u1rationale || !u1rationale.trim())) {
alert('XN TV1: Vui lòng đưa ra lý do khi đề cử xóa các trang thảo luận của người dùng.');
parameters = null;
return false;
}
currentParams.rationale = u1rationale;
}
break;
case 'repost': // C4
if (form['csd.repost_xfd']) {
const deldisc = form['csd.repost_xfd'].value;
if (deldisc) {
currentParams.xfd = deldisc;
}
}
break;
case 'banned': // C5
if (form['csd.banned_user'] && form['csd.banned_user'].value) {
currentParams.user = form['csd.banned_user'].value.replace(/^\s*User:/i, '');
}
break;
case 'gs': // C5
if (form['csd.code']) {
currentParams.code = form['csd.code'].value;
}
break;
case 'move': // C6
if (form['csd.move_page'] && form['csd.move_reason']) {
const movepage = form['csd.move_page'].value,
movereason = form['csd.move_reason'].value;
if (!movepage || !movepage.trim()) {
alert('CSD G6 (move): Please specify the page to be moved here.');
parameters = null;
return false;
}
if (!movereason || !movereason.trim()) {
alert('CSD G6 (move): Please specify the reason for the move.');
parameters = null;
return false;
}
currentParams.page = movepage;
currentParams.reason = movereason;
}
break;
case 'xfd': // C6
if (form['csd.xfd_fullvotepage']) {
const xfd = form['csd.xfd_fullvotepage'].value;
if (xfd) {
currentParams.fullvotepage = xfd;
}
}
break;
case 'copypaste': // C6
if (form['csd.copypaste_sourcepage']) {
const copypaste = form['csd.copypaste_sourcepage'].value;
if (!copypaste || !copypaste.trim()) {
alert('CSD G6 (copypaste): Please specify the source page name.');
parameters = null;
return false;
}
currentParams.sourcepage = copypaste;
}
break;
case 'c6': // C6
if (form['csd.c6_rationale'] && form['csd.c6_rationale'].value) {
currentParams.rationale = form['csd.c6_rationale'].value;
}
break;
case 'author': // C7
if (form['csd.author_rationale'] && form['csd.author_rationale'].value) {
currentParams.rationale = form['csd.author_rationale'].value;
}
break;
case 'c8': // C8
if (form['csd.c8_rationale'] && form['csd.c8_rationale'].value) {
currentParams.rationale = form['csd.c8_rationale'].value;
}
break;
case 'attack': // C10
currentParams.blanked = 'yes';
// it is actually blanked elsewhere in code, but setting the flag here
break;
case 'copyvio': // C12
if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) {
currentParams.url = form['csd.copyvio_url'].value;
}
if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) {
currentParams.url2 = form['csd.copyvio_url2'].value;
}
if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) {
currentParams.url3 = form['csd.copyvio_url3'].value;
}
break;
case 'foreign': // MT2
if (form['csd.foreign_source']) {
const foreignlink = form['csd.foreign_source'].value;
if (!foreignlink || !foreignlink.trim()) {
alert('XN MT2: Vui lòng chỉ rõ liên kết interwiki đến mục từ bị sao chép.');
parameters = null;
return false;
}
currentParams.source = foreignlink;
}
break;
case 'mt10': // C10
if (form['csd.mt10_article']) {
const duptitle = form['csd.mt10_article'].value;
if (!duptitle || !duptitle.trim()) {
alert('XN MT10: Vui lòng chỉ rõ tên mục từ trùng lặp nội dung.');
parameters = null;
return false;
}
currentParams.article = duptitle;
}
break;
case 'bm2': // T2
if (form['csd.bm2_rationale'] && form['csd.bm2_rationale'].value) {
currentParams.rationale = form['csd.bm2_rationale'].value;
}
break;
default:
break;
}
parameters.push(currentParams);
});
return parameters;
};
// Function for processing talk page notification template parameters
// key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}})
// utparams.param: for {{db-[notice|deleted]-multiple}}
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
const utparams = [];
// Special cases
if (normalized === 'db') {
utparams['2'] = parameters['1'];
} else if (normalized === 'c6') {
utparams.key1 = 'to';
utparams.value1 = Morebits.pageNameNorm;
} else if (normalized === 'c12') {
['url', 'url2', 'url3'].forEach((item, idx) => {
if (parameters[item]) {
idx++;
utparams['key' + idx] = item;
utparams['value' + idx] = utparams[item] = parameters[item];
}
});
} else {
// Handle the rest
let param;
switch (normalized) {
case 'c4':
param = 'xfd';
break;
case 'c5': // Only for db-gs, as db-g5 doesn't send a notice
param = 'code';
break;
case 'mt2':
param = 'source';
break;
case 'mt10':
param = 'article';
break;
default:
break;
}
// No harm in providing a usertalk template with the others' parameters
if (param && parameters[param]) {
utparams.key1 = param;
utparams.value1 = utparams[param] = parameters[param];
}
}
return utparams;
};
/**
* @param {Event} e
* @return {Array}
*/
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
const values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert('Vui lòng chỉ định một tiêu chí!');
return null;
}
return values;
};
Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const tag_only = form.tag_only;
if (tag_only && tag_only.checked) {
Twinkle.speedy.callback.evaluateUser(e);
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator
let watchPage, promptForSummary;
normalizeds.forEach((norm) => {
if (Twinkle.getPref('watchSpeedyPages').includes(norm)) {
watchPage = Twinkle.getPref('watchSpeedyExpiry');
}
if (Twinkle.getPref('promptForSpeedyDeletionSummary').includes(norm)) {
promptForSummary = true;
}
});
const warnusertalk = form.warnusertalk.checked && normalizeds.some((norm, index) => Twinkle.getPref('warnUserOnSpeedyDelete').includes(norm) &&
!(norm === 'g6' && values[index] !== 'copypaste') && !(norm === 'g5' && values[index] !== 'gs'));
const welcomeuser = warnusertalk && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
warnUser: warnusertalk,
welcomeuser: welcomeuser,
promptForSummary: promptForSummary,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Twinkle.speedy.callbacks.sysop.main(params);
};
Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
const form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
const values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
const templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
// var multiple = form.multiple.checked;
const normalizeds = values.map((value) => Twinkle.speedy.normalizeHash[value]);
// analyse each criterion to determine whether to watch the page/notify the creator
const watchPage = normalizeds.some((csdCriteria) => Twinkle.getPref('watchSpeedyPages').includes(csdCriteria)) && Twinkle.getPref('watchSpeedyExpiry');
const notifyuser = form.notify.checked && normalizeds.some((norm, index) => Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').includes(norm) &&
!(norm === 'c6' && values[index] !== 'copypaste') && !(norm === 'c5' && values[index] !== 'gs'));
const welcomeuser = notifyuser && normalizeds.some((norm) => Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').includes(norm));
const csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some((norm) => !Twinkle.getPref('noLogOnSpeedyNomination').includes(norm));
const params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
usertalk: notifyuser,
welcomeuser: welcomeuser,
lognomination: csdlog,
requestsalt: form.salting.checked,
templateParams: templateParams
};
Morebits.SimpleWindow.setButtonsEnabled(false);
Morebits.Status.init(form);
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'Gán nhãn hoàn tất';
const wikipedia_page = new Morebits.wiki.Page(mw.config.get('wgPageName'), 'Đang gán nhãn trang');
wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};
Twinkle.addInitCallback(Twinkle.speedy, 'speedy');
}());
// </nowiki>
sl6sv318j5kqecrzeiqiogbgk7ukqvb
MediaWiki:Gadget-twinkleconfig.js
8
363655
2353364
2285756
2026-05-15T01:29:28Z
Kateru Zakuro
34522
Cập nhật 2026
2353364
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinkleconfig.js: Preferences module
****************************************
* Mode of invocation: Adds configuration form to Wikipedia:Twinkle/Preferences,
and adds an ad box to the top of user subpages belonging to the
currently logged-in user which end in '.js'
* Active on: What I just said. Yeah.
*/
Twinkle.config = {};
Twinkle.config.watchlistEnums = {
yes: 'Thêm vào danh sách theo dõi',
no: "Không thêm vào danh sách theo dõi",
default: 'Thực hiện theo các tùy chỉnh trang của bạn',
'1 week': 'Watch for 1 week',
'1 month': 'Watch for 1 month',
'3 months': 'Watch for 3 months',
'6 months': 'Watch for 6 months'
};
Twinkle.config.commonSets = {
csdCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
csdCriteriaNotification: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
},
csdAndImageDeletionCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
namespacesNoSpecial: {
0: 'Entry',
1: 'Talk (entry)',
2: 'User',
3: 'User talk',
4: 'Wiktionary',
5: 'Wiktionary talk',
6: 'File',
7: 'File talk',
8: 'MediaWiki',
9: 'MediaWiki talk',
10: 'Template',
11: 'Template talk',
12: 'Help',
13: 'Help talk',
14: 'Category',
15: 'Category talk',
100: 'Appendix',
101: 'Appendix talk',
710: 'TimedText',
711: 'TimedText talk',
828: 'Module',
829: 'Module talk'
}
};
Twinkle.config.commonSets.csdCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteria );
Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteriaNotification );
Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdAndImageDeletionCriteria );
/**
* Section entry format:
*
* {
* title: <human-readable section title>,
* module: <name of the associated module, used to link to sections>,
* adminOnly: <true for admin-only sections>,
* hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
* preferences: [
* {
* name: <TwinkleConfig property name>,
* label: <human-readable short description - used as a form label>,
* helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
* adminOnly: <true for admin-only preferences>,
* type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
* enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
* customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
* customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
* },
* . . .
* ]
* },
* . . .
*
*/
Twinkle.config.sections = [
{
title: 'Chung',
module: 'general',
preferences: [
// TwinkleConfig.userTalkPageMode may take arguments:
// 'window': open a new window, remember the opened window
// 'tab': opens in a new tab, if possible.
// 'blank': force open in a new window, even if such a window exists
{
name: 'userTalkPageMode',
label: 'Khi mở một trang thảo luận của người dùng, hãy mở trang đó',
type: 'enum',
enumValues: { window: 'Trong một cửa sổ, thay thế các cuộc thảo luận của người dùng khác', tab: 'Trong một tab mới', blank: 'Trong một cửa sổ hoàn toàn mới' }
},
// TwinkleConfig.dialogLargeFont (boolean)
{
name: 'dialogLargeFont',
label: 'Sử dụng văn bản có kích thước lớn hơn trong hộp thoại Twinkle',
type: 'boolean'
},
// Twinkle.config.disabledModules (array)
{
name: 'disabledModules',
label: 'Tắt các mô đun Twinkle đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy hành động cẩn thận. Bỏ chọn để kích hoạt lại.',
type: 'set',
setValues: { arv: 'Báo cáo phá hoại', warn: 'Cảnh báo', welcome: 'Chào mừng thành viên', talkback: 'Hồi âm', speedy: 'Xóa nhanh', prod: 'Đề nghị xóa', xfd: 'Thảo luận xóa', image: 'Đề nghị xóa hình', protect: 'Khóa trang', tag: 'Gắn bảng bảo trì', diff: 'Khác biệt phiên bản', unlink: 'Gỡ liên kết', rollback: 'Lùi sửa và hồi sửa' }
},
// Twinkle.config.disabledSysopModules (array)
{
name: 'disabledSysopModules',
label: 'Tắt các mô-đun chỉ dành cho quản trị viên đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy thao tác cẩn thận. Bỏ chọn để kích hoạt lại.',
adminOnly: true,
type: 'set',
setValues: { block: 'Khóa (Block)', deprod: 'Xóa hàng loạt theo đề xuất (DePROD)', batchdelete: 'Xóa hàng loạt theo thể loại (D-batch)', batchprotect: 'Khóa/bảo vệ hàng loạt (P-batch)', batchundelete: 'Phục hồi xóa hàng loạt (Und-batch)' }
}
]
},
{
title: 'ARV',
module: 'arv',
preferences: [
{
name: 'spiWatchReport',
label: 'Thêm các trang báo cáo sockpuppet (rối) vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Cấm người dùng',
module: 'block',
adminOnly: true,
preferences: [
// TwinkleConfig.defaultToBlock64 (boolean)
// Whether to default to just blocking the /64 on or off
{
name: 'defaultToBlock64',
label: 'For IPv6 addresses, select the option to block the /64 range by default',
type: 'boolean'
},
// TwinkleConfig.defaultToPartialBlocks (boolean)
// Whether to default partial blocks on or off
{
name: 'defaultToPartialBlocks',
label: 'Chọn các cấm một phần theo mặc định khi mở menu khóa',
helptip: 'If the user is already blocked, this will be overridden in favor of defaulting to the current block type',
type: 'boolean'
},
// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
// if true, blank the talk page when issuing an indef block notice (per [[WP:UWUL#Indefinitely blocked users]])
{
name: 'blankTalkpageOnIndefBlock',
label: 'Làm trống trang thảo luận khi cấm vô hạn thành viên',
helptip: 'See <a href="' + mw.util.getUrl('Wikipedia:WikiProject_User_warnings/Usage_and_layout#Indefinitely_blocked_users') + '">WP:UWUL</a> for more information.',
type: 'boolean'
}
]
},
{
title: 'Xóa hình ảnh (image deletion - DI)',
module: 'image',
preferences: [
// TwinkleConfig.notifyUserOnDeli (boolean)
// If the user should be notified after placing a file deletion tag
{
name: 'notifyUserOnDeli',
label: 'Kiểm tra hộp "thông báo cho người tải lên đầu tiên" theo mặc định',
type: 'boolean'
},
// TwinkleConfig.deliWatchPage (string)
// The watchlist setting of the page tagged for deletion.
{
name: 'deliWatchPage',
label: 'Thêm hình trang hình ảnh vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.deliWatchUser (string)
// The watchlist setting of the user talk page if a notification is placed.
{
name: 'deliWatchUser',
label: 'Thêm trang thảo luận của người dùng tải lên đầu tiên vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Page protection ' + (Morebits.userIsSysop ? '(PP)' : '(RPP)'),
module: 'protect',
preferences: [
{
name: 'watchRequestedPages',
label: 'Add page to watchlist when requesting protection',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchPPTaggedPages',
label: 'Add page to watchlist when tagging with protection template',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchProtectedPages',
label: 'Add page to watchlist when protecting',
helptip: 'If also tagging the page after protection, that preference will be favored.',
adminOnly: true,
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Đề nghị xóa (PROD)',
module: 'prod',
preferences: [
// TwinkleConfig.watchProdPages (string)
// Watchlist setting when applying prod template to page
{
name: 'watchProdPages',
label: 'Thêm mục từ vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markProdPagesAsPatrolled (boolean)
// If, when applying prod template to page, to mark the page as curated/patrolled (if the page was reached from NewPages)
{
name: 'markProdPagesAsPatrolled',
label: 'Đánh dấu trang đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.prodReasonDefault (string)
// The prefilled PROD reason.
{
name: 'prodReasonDefault',
label: 'Điền trước lý do đề xuất xóa (PROD)',
type: 'string'
},
{
name: 'logProdPages',
label: 'Giữ nhật trình ở không gian người dùng đối với tất cả trang mà bạn gán nhãn theo đề xuất xóa (PROD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật trình không gian người dùng cung cấp một cách tốt để theo dõi tất cả các trang mà bạn gán nhãn đề xuất xóa (PROD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'prodLogPageName',
label: 'Giữ nhật trình không gian người dùng PROD tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký đề xuất xóa (PROD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật chế độ ghi nhật trình không gian người dùng theo đề xuất xóa (PROD).',
type: 'string'
}
]
},
{
title: 'Hồi sửa (revert) và lùi sửa (rollback)',
module: 'rollback',
preferences: [
// TwinkleConfig.autoMenuAfterRollback (bool)
// Option to automatically open the warning menu if the user talk page is opened post-reversion
{
name: 'autoMenuAfterRollback',
label: 'Tự động mở menu cảnh báo Twinkle trên trang thảo luận của người dùng sau khi lùi sửa bằng Twinkle',
helptip: 'Chỉ hoạt động nếu các chức năng tương ứng bên dưới được chọn.',
type: 'boolean'
},
// TwinkleConfig.openTalkPage (array)
// What types of actions that should result in opening of talk page
{
name: 'openTalkPage',
label: 'Mở trang thảo luận người dùng sau các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại' }
},
// TwinkleConfig.openTalkPageOnAutoRevert (bool)
// Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
{
name: 'openTalkPageOnAutoRevert',
label: 'Mở trang thảo luận người dùng khi khôi phục lùi sửa từ các đóng góp người dùng hoặc các thay đổi gần đây',
helptip: 'Khi tính năng này được bật, các tùy chọn mong muốn phải được bật ở cài đặt trước đó để tính năng này hoạt động.',
type: 'boolean'
},
// TwinkleConfig.rollbackInPlace (bool)
//
{
name: 'rollbackInPlace',
label: "Không tải lại trang khi lùi sửa từ các đóng góp hoặc các thay đổi gần đây",
helptip: "Khi tính năng này được bật, Twinkle sẽ không tải lại nguồn cấp dữ liệu các đóng góp hoặc thay đổi gần đây sau khi hồi sửa, cho phép bạn hồi sửa nhiều sửa đổi cùng một lúc.",
type: 'boolean'
},
// TwinkleConfig.markRevertedPagesAsMinor (array)
// What types of actions that should result in marking edit as minor
{
name: 'markRevertedPagesAsMinor',
label: 'Đánh dấu là sửa đổi nhỏ cho các loại đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedPages (array)
// What types of actions that should result in forced addition to watchlist
{
name: 'watchRevertedPages',
label: 'Thêm các trang vào danh sách theo dõi cho các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchRevertedExpiry',
label: 'When reverting a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.offerReasonOnNormalRevert (boolean)
// If to offer a prompt for extra summary reason for normal reverts, default to true
{
name: 'offerReasonOnNormalRevert',
label: 'Nhắc lý do cho các lần lùi sửa bình thường',
helptip: 'Các lùi sửa "bình thường" là những lùi sửa được khôi phục từ liên kết [lùi sửa] nằm ở chính giữa.',
type: 'boolean'
},
{
name: 'confirmOnRollback',
label: 'Yêu cầu một thông báo xác nhận trước khi hồi sửa',
helptip: 'Dành cho những người sử dụng bút hoặc thiết bị cảm ứng và những người thường xuyên thiếu quyết đoán.',
type: 'boolean'
},
{
name: 'confirmOnMobileRollback',
label: 'Require confirmation before reverting (mobile devices only)',
helptip: 'Avoid accidental reversions when on mobile devices.',
type: 'boolean'
},
// TwinkleConfig.showRollbackLinks (array)
// Where Twinkle should show rollback links:
// diff, others, mine, contribs, history, recent
// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
{
name: 'showRollbackLinks',
label: 'Hiển thị liên kết lùi sửa trên các trang này',
type: 'set',
setValues: { diff: 'Các trang khác biệt', others: 'Các trang đóng góp của những người dùng khác', mine: 'Trang đóng góp của tôi', recent: 'Các các trang đặc biệt thay đổi gần đây và các thay đổi liên quan', history: 'Các trang lịch sử' }
}
]
},
{
title: 'Xóa nhanh (CSD)',
module: 'speedy',
preferences: [
{
name: 'speedySelectionStyle',
label: 'Khi nào nên tiếp tục và gán nhãn/xóa trang',
type: 'enum',
enumValues: { buttonClick: 'Khi tôi nhấn nút "Gửi" (hoặc Submit)', radioClick: 'Ngay khi tôi nhấn 1 lựa chọn nào đó' }
},
// TwinkleConfig.watchSpeedyPages (array)
// Whether to add speedy tagged or deleted pages to watchlist
{
name: 'watchSpeedyPages',
label: 'Thêm trang vào danh sách theo dõi khi sử dụng các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
},
// TwinkleConfig.watchSpeedyExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchSpeedyExpiry',
label: 'When tagging a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
// If, when applying speedy template to page, to mark the page as triaged/patrolled (if the page was reached from NewPages)
{
name: 'markSpeedyPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.watchSpeedyUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'watchSpeedyUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
// On what types of speedy deletion notifications shall the user be welcomed
// with a "firstarticle" notice if their talk page has not yet been created.
{
name: 'welcomeUserOnSpeedyDeletionNotification',
label: 'Chào mừng người tạo trang khi thông báo với các tiêu chí này',
helptip: 'Lời chào mừng chỉ được đưa ra nếu người dùng đã được thông báo về việc xóa và chỉ khi trang thảo luận của họ chưa tồn tại. Bản mẫu được dùng là {{firstarticle}}.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
// What types of actions should result in the author of the page being notified of nomination
{
name: 'notifyUserOnSpeedyDeletionNomination',
label: 'Notify page creator when tagging with these criteria',
helptip: 'Even if you choose to notify from the CSD screen, the notification will only take place for those criteria selected here.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.warnUserOnSpeedyDelete (array)
// What types of actions should result in the author of the page being notified of speedy deletion (admin only)
{
name: 'warnUserOnSpeedyDelete',
label: 'Notify page creator when deleting under these criteria',
helptip: 'Even if you choose to notify from the CSD screen, the notification will only take place for those criteria selected here.',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
{
name: 'promptForSpeedyDeletionSummary',
label: 'Allow editing of deletion summary when deleting under these criteria',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
},
// TwinkleConfig.deleteTalkPageOnDelete (boolean)
// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
{
name: 'deleteTalkPageOnDelete',
label: 'Check the "also delete talk page" box by default',
adminOnly: true,
type: 'boolean'
},
{
name: 'deleteRedirectsOnDelete',
label: 'Check the "also delete redirects" box by default',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.deleteSysopDefaultToDelete (boolean)
// Make the CSD screen default to "delete" instead of "tag" (admin only)
{
name: 'deleteSysopDefaultToDelete',
label: 'Default to outright deletion instead of speedy tagging',
helptip: 'If there is a CSD tag already present, Twinkle will always default to "delete" mode',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowWidth',
label: 'Width of speedy deletion window (pixels)',
type: 'integer'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowHeight',
label: 'Height of speedy deletion window (pixels)',
helptip: 'If you have a big monitor, you might like to increase this.',
type: 'integer'
},
{
name: 'logSpeedyNominations',
label: 'Keep a log in userspace of all CSD nominations',
helptip: 'Since non-admins do not have access to their deleted contributions, the userspace log offers a good way to keep track of all pages you nominate for CSD using Twinkle. Files tagged using DI are also added to this log.',
type: 'boolean'
},
{
name: 'speedyLogPageName',
label: 'Keep the CSD userspace log at this user subpage',
helptip: 'Enter a subpage name in this box. You will find your CSD log at User:<i>username</i>/<i>subpage name</i>. Only works if you turn on the CSD userspace log.',
type: 'string'
},
{
name: 'noLogOnSpeedyNomination',
label: 'Do not create a userspace log entry when tagging with these criteria',
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
}
]
},
{
title: 'Tag',
module: 'tag',
preferences: [
{
name: 'watchTaggedVenues',
label: 'Add page to watchlist when tagging these type of pages',
type: 'set',
setValues: { articles: 'Articles', drafts: 'Drafts', redirects: 'Redirects', files: 'Files' }
},
{
name: 'watchTaggedPages',
label: 'When tagging a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchMergeDiscussions',
label: 'Add talk pages to watchlist when starting merge discussions',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markTaggedPagesAsMinor',
label: 'Mark addition of tags as a minor edit',
type: 'boolean'
},
{
name: 'markTaggedPagesAsPatrolled',
label: 'Check the "mark page as patrolled/reviewed" box by default',
type: 'boolean'
},
{
name: 'groupByDefault',
label: 'Check the "group into {{multiple issues}}" box by default',
type: 'boolean'
},
{
name: 'tagArticleSortOrder',
label: 'Default view order for article tags',
type: 'enum',
enumValues: { cat: 'By categories', alpha: 'In alphabetical order' }
},
{
name: 'customTagList',
label: 'Custom article/draft maintenance tags to display',
helptip: "These appear as additional options at the bottom of the list of tags. For example, you could add new maintenance tags which have not yet been added to Twinkle's defaults.",
type: 'customList',
customListValueTitle: 'Template name (no curly brackets)',
customListLabelTitle: 'Text to show in Tag dialog'
},
{
name: 'customFileTagList',
label: 'Custom file maintenance tags to display',
helptip: 'Additional tags that you wish to add for files.',
type: 'customList',
customListValueTitle: 'Template name (no curly brackets)',
customListLabelTitle: 'Text to show in Tag dialog'
},
{
name: 'customRedirectTagList',
label: 'Custom redirect category tags to display',
helptip: 'Additional tags that you wish to add for redirects.',
type: 'customList',
customListValueTitle: 'Template name (no curly brackets)',
customListLabelTitle: 'Text to show in Tag dialog'
}
]
},
{
title: 'Talkback',
module: 'talkback',
preferences: [
{
name: 'markTalkbackAsMinor',
label: 'Mark talkbacks as minor edits',
type: 'boolean'
},
{
name: 'insertTalkbackSignature',
label: 'Insert signature within talkbacks',
type: 'boolean'
},
{
name: 'talkbackHeading',
label: 'Section heading to use for talkback and please see',
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
},
{
name: 'mailHeading',
label: "Section heading to use for \"you've got mail\" notices",
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
}
]
},
{
title: 'Unlink',
module: 'unlink',
preferences: [
// TwinkleConfig.unlinkNamespaces (array)
// In what namespaces unlink should happen, default in 0 (article), 10 (template), 100 (portal), and 118 (draft)
{
name: 'unlinkNamespaces',
label: 'Remove links from pages in these namespaces',
helptip: 'Avoid selecting any talk namespaces, as Twinkle might end up unlinking on talk archives (a big no-no).',
type: 'set',
setValues: Twinkle.config.commonSets.namespacesNoSpecial
}
]
},
{
title: 'Warn user',
module: 'warn',
preferences: [
// TwinkleConfig.defaultWarningGroup (int)
// Which level warning should be the default selected group, default is 1
{
name: 'defaultWarningGroup',
label: 'Default warning level',
type: 'enum',
enumValues: {
1: 'Level 1',
2: 'Level 2',
3: 'Level 3',
4: 'Level 4',
5: 'Level 4im',
6: 'Single-issue notices',
7: 'Single-issue warnings',
// 8 was used for block templates before #260
9: 'Custom warnings',
10: 'All warning templates',
11: 'Auto-select level (1-4)'
}
},
// TwinkleConfig.combinedSingletMenus (boolean)
// if true, show one menu with both single-issue notices and warnings instead of two separately
{
name: 'combinedSingletMenus',
label: 'Replace the two separate single-issue menus into one combined menu',
helptip: 'Selecting either single-issue notices or single-issue warnings as your default will make this your default if enabled.',
type: 'boolean'
},
// TwinkleConfig.watchWarnings (string)
// Watchlist setting for the page which has been dispatched an warning or notice
{
name: 'watchWarnings',
label: 'Add user talk page to watchlist when notifying',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.oldSelect (boolean)
// if true, use the native select menu rather the select2-based one
{
name: 'oldSelect',
label: 'Use the non-searchable classic select menu',
type: 'boolean'
},
{
name: 'customWarningList',
label: 'Custom warning templates to display',
helptip: 'You can add individual templates or user subpages. Custom warnings appear in the "Custom warnings" category within the warning dialog box.',
type: 'customList',
customListValueTitle: 'Template name (no curly brackets)',
customListLabelTitle: 'Text to show in warning list (also used as edit summary)'
}
]
},
{
title: 'Welcome user',
module: 'welcome',
preferences: [
{
name: 'topWelcomes',
label: 'Place welcomes above existing content on user talk pages',
type: 'boolean'
},
{
name: 'watchWelcomes',
label: 'Add user talk pages to watchlist when welcoming',
helptip: 'Doing so adds to the personal element of welcoming a user - you will be able to see how they are coping as a newbie, and possibly help them.',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'insertUsername',
label: 'Add your username to the template (where applicable)',
helptip: "Some welcome templates have an opening sentence like \"Hi, I'm <username>. Welcome\" etc. If you turn off this option, these templates will not display your username in that way.",
type: 'boolean'
},
{
name: 'quickWelcomeMode',
label: 'Clicking the "welcome" link on a diff page (which only appears if the editor\'s user talk page has not been created yet) will',
helptip: 'If you choose to welcome automatically, the template you specify below will be used.',
type: 'enum',
enumValues: { auto: 'immediately post the welcome template specified below', norm: 'prompt you to select a template' }
},
{
name: 'quickWelcomeTemplate',
label: 'Template to use when welcoming automatically',
helptip: 'Enter the name of a welcome template, without the curly brackets. A link to the given article will be added.',
type: 'string'
},
{
name: 'customWelcomeList',
label: 'Custom welcome templates to display',
helptip: "You can add other welcome templates, or user subpages that are welcome templates (prefixed with \"User:\"). Don't forget that these templates are substituted onto user talk pages.",
type: 'customList',
customListValueTitle: 'Template name (no curly brackets)',
customListLabelTitle: 'Text to show in Welcome dialog'
},
{
name: 'customWelcomeSignature',
label: 'Automatically sign custom welcome templates',
helptip: 'If your custom welcome templates contain a built-in signature within the template, turn off this option.',
type: 'boolean'
}
]
},
{
title: 'XFD (deletion discussions)',
module: 'xfd',
preferences: [
{
name: 'logXfdNominations',
label: 'Keep a log in userspace of all pages you nominate for a deletion discussion (XfD)',
helptip: 'The userspace log offers a good way to keep track of all pages you nominate for XfD using Twinkle.',
type: 'boolean'
},
{
name: 'xfdLogPageName',
label: 'Keep the deletion discussion userspace log at this user subpage',
helptip: 'Enter a subpage name in this box. You will find your XfD log at User:<i>username</i>/<i>subpage name</i>. Only works if you turn on the XfD userspace log.',
type: 'string'
},
{
name: 'noLogOnXfdNomination',
label: 'Do not create a userspace log entry when nominating at this venue',
type: 'set',
setValues: { afd: 'AfD', tfd: 'TfD', ffd: 'FfD', cfd: 'CfD', cfds: 'CfD/S', mfd: 'MfD', rfd: 'RfD', rm: 'RM' }
},
// TwinkleConfig.xfdWatchPage (string)
// The watchlist setting of the page being nominated for XfD.
{
name: 'xfdWatchPage',
label: 'Add the nominated page to watchlist',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchDiscussion (string)
// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
// or the list page for the other processes.
{
name: 'xfdWatchDiscussion',
label: 'Add the deletion discussion page to watchlist',
helptip: 'This refers to the discussion subpage (for AfD and MfD) or the daily log page (for TfD, CfD, RfD and FfD)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchList (string)
// The watchlist setting of the XfD list page, *if* the discussion is on a separate page.
{
name: 'xfdWatchList',
label: 'Add the daily log/list page to the watchlist (AfD and MfD)',
helptip: 'This only applies for AfD and MfD, where the discussions are transcluded onto a daily log page (for AfD) or the main MfD page (for MfD).',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'xfdWatchUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchRelated (string)
// The watchlist setting of the target of a redirect being nominated for RfD.
{
name: 'xfdWatchRelated',
label: "Add the redirect's target page to watchlist (when notifying)",
helptip: 'This only applies for RfD, when leaving a notification on the talk page of the target of the redirect',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markXfdPagesAsPatrolled',
label: 'Mark page as patrolled/reviewed when nominating for AFD (if possible)',
type: 'boolean'
}
]
},
{
title: 'Hidden',
hidden: true,
preferences: [
// twinklerollback.js: defines how many revision to query maximum, maximum possible is 50, default is 50
{
name: 'revertMaxRevisions',
type: 'integer'
},
// twinklewarn.js: When using the autolevel select option, how many days makes a prior warning stale
// Huggle is three days ([[Special:Diff/918980316]] and [[Special:Diff/919417999]]) while ClueBotNG is two:
// https://github.com/DamianZaremba/cluebotng/blob/4958e25d6874cba01c75f11debd2e511fd5a2ce5/bot/action_functions.php#L62
{
name: 'autolevelStaleDays',
type: 'integer'
},
// How many pages should be queried by deprod and batchdelete/protect/undelete
{
name: 'batchMax',
type: 'integer',
adminOnly: true
},
// How many pages should be processed at a time by deprod and batchdelete/protect/undelete
{
name: 'batchChunks',
type: 'integer',
adminOnly: true
}
]
}
]; // end of Twinkle.config.sections
Twinkle.config.init = function twinkleconfigInit() {
// create the config page at Wikipedia:Twinkle/Preferences
if ((mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').project && mw.config.get('wgTitle') === 'Twinkle/Preferences') &&
mw.config.get('wgAction') === 'view') {
if (!document.getElementById('twinkle-config')) {
return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
}
// set style to nothing to prevent conflict with external css
document.getElementById('twinkle-config').removeAttribute('style');
document.getElementById('twinkle-config-titlebar').removeAttribute('style');
const contentdiv = document.getElementById('twinkle-config-content');
contentdiv.textContent = ''; // clear children
// let user know about possible conflict with skin js/common.js file
// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
if (window.TwinkleConfig || window.FriendlyConfig) {
const contentnotice = document.createElement('div');
contentnotice.className = 'plainlinks twinkle-ombox';
contentnotice.innerHTML =
'<div>' +
'<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/3/38/Imbox_content.png" />' +
'</div>' +
'<div>' +
'<p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
'<p>To do this, you can <a href="' + mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/' + mw.config.get('skin') +
'.js', { action: 'edit' }) + '" target="_blank"><b>edit your personal skin javascript file</b></a> or <a href="' +
mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/common.js', { action: 'edit'}) + '" target="_blank"><b>your common.js file</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
'</div>';
contentdiv.appendChild(contentnotice);
}
// start a table of contents
const toctable = document.createElement('div');
toctable.className = 'toc';
toctable.style.marginLeft = '0.4em';
// create TOC title
const toctitle = document.createElement('div');
toctitle.id = 'toctitle';
const toch2 = document.createElement('h2');
toch2.textContent = 'Contents ';
toctitle.appendChild(toch2);
// add TOC show/hide link
const toctoggle = document.createElement('span');
toctoggle.className = 'toctoggle';
toctoggle.appendChild(document.createTextNode('['));
const toctogglelink = document.createElement('a');
toctogglelink.className = 'internal';
toctogglelink.setAttribute('href', '#tw-tocshowhide');
toctogglelink.textContent = 'hide';
toctoggle.appendChild(toctogglelink);
toctoggle.appendChild(document.createTextNode(']'));
toctitle.appendChild(toctoggle);
toctable.appendChild(toctitle);
// create item container: this is what we add stuff to
const tocul = document.createElement('ul');
toctogglelink.addEventListener('click', () => {
const $tocul = $(tocul);
$tocul.toggle();
if ($tocul.find(':visible').length) {
toctogglelink.textContent = 'hide';
} else {
toctogglelink.textContent = 'show';
}
}, false);
toctable.appendChild(tocul);
contentdiv.appendChild(toctable);
const contentform = document.createElement('form');
contentform.setAttribute('action', 'javascript:void(0)'); // was #tw-save - changed to void(0) to work around Chrome issue
contentform.addEventListener('submit', Twinkle.config.save, true);
contentdiv.appendChild(contentform);
const container = document.createElement('table');
container.style.width = '100%';
contentform.appendChild(container);
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // i.e. "continue" in this context
}
// add to TOC
const tocli = document.createElement('li');
tocli.className = 'toclevel-1';
const toca = document.createElement('a');
toca.setAttribute('href', '#' + section.module);
toca.appendChild(document.createTextNode(section.title));
tocli.appendChild(toca);
tocul.appendChild(tocli);
let row = document.createElement('tr');
let cell = document.createElement('td');
cell.setAttribute('colspan', '3');
const heading = document.createElement('h4');
heading.style.borderBottom = '1px solid gray';
heading.style.marginTop = '0.2em';
heading.id = section.module;
heading.appendChild(document.createTextNode(section.title));
cell.appendChild(heading);
row.appendChild(cell);
container.appendChild(row);
let rowcount = 1; // for row banding
// add each of the preferences to the form
$(section.preferences).each((prefkey, pref) => {
if (pref.adminOnly && !Morebits.userIsSysop) {
return true; // i.e. "continue" in this context
}
row = document.createElement('tr');
row.style.marginBottom = '0.2em';
// create odd row banding
if (rowcount++ % 2 === 0) {
row.style.backgroundColor = 'rgba(128, 128, 128, 0.1)';
}
cell = document.createElement('td');
let label, input;
const gotPref = Twinkle.getPref(pref.name);
switch (pref.type) {
case 'boolean': // create a checkbox
cell.setAttribute('colspan', '2');
label = document.createElement('label');
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (gotPref === true) {
input.setAttribute('checked', 'checked');
}
label.appendChild(input);
label.appendChild(document.createTextNode(pref.label));
cell.appendChild(label);
break;
case 'string': // create an input box
case 'integer':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (pref.type === 'integer') {
input.setAttribute('size', 6);
input.setAttribute('type', 'number');
input.setAttribute('step', '1'); // integers only
}
if (gotPref) {
input.setAttribute('value', gotPref);
}
cell.appendChild(input);
break;
case 'enum': // create a combo box
// add label to first column
// note: duplicates the code above, under string/integer
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('select');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
$.each(pref.enumValues, (enumvalue, enumdisplay) => {
const option = document.createElement('option');
option.setAttribute('value', enumvalue);
if ((gotPref === enumvalue) ||
// Hack to convert old boolean watchlist prefs
// to corresponding enums (added in v2.1)
(typeof gotPref === 'boolean' &&
((gotPref && enumvalue === 'yes') ||
(!gotPref && enumvalue === 'no')))) {
option.setAttribute('selected', 'selected');
}
option.appendChild(document.createTextNode(enumdisplay));
input.appendChild(option);
});
cell.appendChild(input);
break;
case 'set': // create a set of check boxes
// add label first of all
cell.setAttribute('colspan', '2');
label = document.createElement('label'); // not really necessary to use a label element here, but we do it for consistency of styling
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
var checkdiv = document.createElement('div');
checkdiv.style.paddingLeft = '1em';
var worker = function(itemkey, itemvalue) {
const checklabel = document.createElement('label');
checklabel.style.marginRight = '0.7em';
checklabel.style.display = 'inline-block';
const check = document.createElement('input');
check.setAttribute('type', 'checkbox');
check.setAttribute('id', pref.name + '_' + itemkey);
check.setAttribute('name', pref.name + '_' + itemkey);
if (gotPref && gotPref.includes(itemkey)) {
check.setAttribute('checked', 'checked');
}
// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
if (pref.name === 'unlinkNamespaces') {
if (gotPref && gotPref.includes(parseInt(itemkey, 10))) {
check.setAttribute('checked', 'checked');
}
}
checklabel.appendChild(check);
checklabel.appendChild(document.createTextNode(itemvalue));
checkdiv.appendChild(checklabel);
};
if (pref.setDisplayOrder) {
// add check boxes according to the given display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
worker(item, pref.setValues[item]);
});
} else {
// add check boxes according to the order it gets fed to us (probably strict alphabetical)
$.each(pref.setValues, worker);
}
cell.appendChild(checkdiv);
break;
case 'customList':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add button to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
var button = document.createElement('button');
button.setAttribute('id', pref.name);
button.setAttribute('name', pref.name);
button.setAttribute('type', 'button');
button.addEventListener('click', Twinkle.config.listDialog.display, false);
// use jQuery data on the button to store the current config value
$(button).data({
value: gotPref,
pref: pref
});
button.appendChild(document.createTextNode('Edit items'));
cell.appendChild(button);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
row.appendChild(cell);
// add help tip
cell = document.createElement('td');
cell.className = 'twinkle-config-helptip';
if (pref.helptip) {
// convert mentions of templates in the helptip to clickable links
cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,
'{{<a href="' + mw.util.getUrl('Template:') + '$1" target="_blank">$1</a>}}');
}
// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
if (pref.type !== 'customList') {
const resetlink = document.createElement('a');
resetlink.setAttribute('href', '#tw-reset');
resetlink.setAttribute('id', 'twinkle-config-reset-' + pref.name);
resetlink.addEventListener('click', Twinkle.config.resetPrefLink, false);
resetlink.style.cssFloat = 'right';
resetlink.style.margin = '0 0.6em';
resetlink.appendChild(document.createTextNode('Reset'));
cell.appendChild(resetlink);
}
row.appendChild(cell);
container.appendChild(row);
return true;
});
return true;
});
const footerbox = document.createElement('div');
footerbox.setAttribute('id', 'twinkle-config-buttonpane');
const button = document.createElement('button');
button.setAttribute('id', 'twinkle-config-submit');
button.setAttribute('type', 'submit');
button.appendChild(document.createTextNode('Save changes'));
footerbox.appendChild(button);
const footerspan = document.createElement('span');
footerspan.className = 'plainlinks';
footerspan.style.marginLeft = '2.4em';
footerspan.style.fontSize = '90%';
const footera = document.createElement('a');
footera.setAttribute('href', '#tw-reset-all');
footera.setAttribute('id', 'twinkle-config-resetall');
footera.addEventListener('click', Twinkle.config.resetAllPrefs, false);
footera.appendChild(document.createTextNode('Restore defaults'));
footerspan.appendChild(footera);
footerbox.appendChild(footerspan);
contentform.appendChild(footerbox);
// since all the section headers exist now, we can try going to the requested anchor
if (window.location.hash) {
const loc = window.location.hash;
window.location.hash = '';
window.location.hash = loc;
}
} else if (mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0 &&
mw.config.get('wgPageName').slice(-3) === '.js') {
const box = document.createElement('div');
// Styled in twinkle.css
box.setAttribute('id', 'twinkle-config-headerbox');
let link;
const scriptPageName = mw.config.get('wgPageName').slice(
mw.config.get('wgPageName').lastIndexOf('/') + 1,
mw.config.get('wgPageName').lastIndexOf('.js')
);
if (scriptPageName === 'twinkleoptions') {
// place "why not try the preference panel" notice
box.setAttribute('class', 'config-twopt-box');
if (mw.config.get('wgArticleId') > 0) { // page exists
box.appendChild(document.createTextNode('This page contains your Twinkle preferences. You can change them using the '));
} else { // page does not exist
box.appendChild(document.createTextNode('You can customize Twinkle to suit your preferences by using the '));
}
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Twinkle preferences panel'));
box.appendChild(link);
box.appendChild(document.createTextNode(', or by editing this page.'));
$(box).insertAfter($('#contentSub'));
} else if (['monobook', 'vector', 'vector-2022', 'cologneblue', 'modern', 'timeless', 'minerva', 'common'].includes(scriptPageName)) {
// place "Looking for Twinkle options?" notice
box.setAttribute('class', 'config-userskin-box');
box.appendChild(document.createTextNode('If you want to set Twinkle preferences, you can use the '));
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Twinkle preferences panel'));
box.appendChild(link);
box.appendChild(document.createTextNode('.'));
$(box).insertAfter($('#contentSub'));
}
}
};
// custom list-related stuff
Twinkle.config.listDialog = {};
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow($dlgtable, value, label) {
let $contenttr, $valueInput, $labelInput;
$dlgtable.append(
$contenttr = $('<tr>').append(
$('<td>').append(
$('<button>')
.attr('type', 'button')
.on('click', () => {
$contenttr.remove();
})
.text('Remove')
),
$('<td>').append(
$valueInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-value')
.css('width', '97%')
),
$('<td>').append(
$labelInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-label')
.css('width', '98%')
)
)
);
if (value) {
$valueInput.val(value);
}
if (label) {
$labelInput.val(label);
}
};
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
const $prefbutton = $(e.target);
const curvalue = $prefbutton.data('value');
const curpref = $prefbutton.data('pref');
const dialog = new Morebits.SimpleWindow(720, 400);
dialog.setTitle(curpref.label);
dialog.setScriptName('Twinkle preferences');
let $dlgtbody;
dialog.setContent(
$('<div>').append(
$('<table>')
.addClass('wikitable')
.css({
margin: '1.4em 1em',
width: 'auto'
})
.append(
$dlgtbody = $('<tbody>').append(
// header row
$('<tr>').append(
$('<th>') // top-left cell
.css('width', '5%'),
$('<th>') // value column header
.css('width', '35%')
.text(curpref.customListValueTitle ? curpref.customListValueTitle : 'Value'),
$('<th>') // label column header
.css('width', '60%')
.text(curpref.customListLabelTitle ? curpref.customListLabelTitle : 'Label')
)
),
$('<tfoot>').append(
$('<tr>').append(
$('<td>')
.attr('colspan', '3')
.append(
$('<button>')
.text('Add')
.css('min-width', '8em')
.attr('type', 'button')
.on('click', () => {
Twinkle.config.listDialog.addRow($dlgtbody);
})
)
)
)
),
$('<button>')
.text('Save changes')
.attr('type', 'submit') // so Morebits.SimpleWindow puts the button in the button pane
.on('click', () => {
Twinkle.config.listDialog.save($prefbutton, $dlgtbody);
dialog.close();
}),
$('<button>')
.text('Reset')
.attr('type', 'submit')
.on('click', () => {
Twinkle.config.listDialog.reset($prefbutton, $dlgtbody);
}),
$('<button>')
.text('Cancel')
.attr('type', 'submit')
.on('click', () => {
dialog.close();
})
)[0]
);
// content rows
let gotRow = false;
$.each(curvalue, (k, v) => {
gotRow = true;
Twinkle.config.listDialog.addRow($dlgtbody, v.value, v.label);
});
// if there are no values present, add a blank row to start the user off
if (!gotRow) {
Twinkle.config.listDialog.addRow($dlgtbody);
}
dialog.display();
};
// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset($button, $tbody) {
// reset value on button
const curpref = $button.data('pref');
const oldvalue = $button.data('value');
Twinkle.config.resetPref(curpref);
// reset form
$tbody.find('tr').slice(1).remove(); // all rows except the first (header) row
// add the new values
const curvalue = $button.data('value');
$.each(curvalue, (k, v) => {
Twinkle.config.listDialog.addRow($tbody, v.value, v.label);
});
// save the old value
$button.data('value', oldvalue);
};
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave($button, $tbody) {
const result = [];
let current = {};
$tbody.find('input[type="text"]').each((inputkey, input) => {
if ($(input).hasClass('twinkle-config-customlist-value')) {
current = { value: input.value };
} else {
current.label = input.value;
// exclude totally empty rows
if (current.value || current.label) {
result.push(current);
}
}
});
$button.data('value', result);
};
// reset/restore defaults
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
const wantedpref = e.target.id.slice(21); // "twinkle-config-reset-" prefix is stripped
// search tactics
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
let foundit = false;
$(section.preferences).each((prefkey, pref) => {
if (pref.name !== wantedpref) {
return true; // continue
}
Twinkle.config.resetPref(pref);
foundit = true;
return false; // break
});
if (foundit) {
return false; // break
}
});
return false; // stop link from scrolling page
};
Twinkle.config.resetPref = function twinkleconfigResetPref(pref) {
switch (pref.type) {
case 'boolean':
document.getElementById(pref.name).checked = Twinkle.defaultConfig[pref.name];
break;
case 'string':
case 'integer':
case 'enum':
document.getElementById(pref.name).value = Twinkle.defaultConfig[pref.name];
break;
case 'set':
$.each(pref.setValues, (itemkey) => {
if (document.getElementById(pref.name + '_' + itemkey)) {
document.getElementById(pref.name + '_' + itemkey).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
}
});
break;
case 'customList':
$(document.getElementById(pref.name)).data('value', Twinkle.defaultConfig[pref.name]);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
};
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
// no confirmation message - the user can just refresh/close the page to abort
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
$(section.preferences).each((prefkey, pref) => {
if (!pref.adminOnly || Morebits.userIsSysop) {
Twinkle.config.resetPref(pref);
}
});
return true;
});
return false; // stop link from scrolling page
};
Twinkle.config.save = function twinkleconfigSave(e) {
Morebits.Status.init(document.getElementById('twinkle-config-content'));
const userjs = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').user] + ':' + mw.config.get('wgUserName') + '/twinkleoptions.js';
const wikipediaPage = new Morebits.wiki.Page(userjs, 'Saving preferences to ' + userjs);
wikipediaPage.setCallbackParameters(e.target);
wikipediaPage.load(Twinkle.config.writePrefs);
return false;
};
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
const form = pageobj.getCallbackParameters();
// this is the object which gets serialized into JSON; only
// preferences that this script knows about are kept
const newConfig = {optionsVersion: 2.1};
// a comparison function is needed later on
// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
// arrays of strings, and arrays of { value, label })
// and it is not very robust: e.g. compare([2], ["2"]) === true, and
// compare({}, {}) === false, but it's good enough for our purposes here
const compare = function(a, b) {
if (Array.isArray(a)) {
if (a.length !== b.length) {
return false;
}
const asort = a.sort(), bsort = b.sort();
for (let i = 0; asort[i]; ++i) {
// comparison of the two properties of custom lists
if ((typeof asort[i] === 'object') && (asort[i].label !== bsort[i].label ||
asort[i].value !== bsort[i].value)) {
return false;
} else if (asort[i].toString() !== bsort[i].toString()) {
return false;
}
}
return true;
}
return a === b;
};
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.adminOnly && !Morebits.userIsSysop) {
return; // i.e. "continue" in this context
}
// reach each of the preferences from the form
$(section.preferences).each((prefkey, pref) => {
let userValue; // = undefined
// only read form values for those prefs that have them
if (!pref.adminOnly || Morebits.userIsSysop) {
if (!section.hidden) {
switch (pref.type) {
case 'boolean': // read from the checkbox
userValue = form[pref.name].checked;
break;
case 'string': // read from the input box or combo box
case 'enum':
userValue = form[pref.name].value;
break;
case 'integer': // read from the input box
userValue = parseInt(form[pref.name].value, 10);
if (isNaN(userValue)) {
Morebits.Status.warn('Saving', 'The value you specified for ' + pref.name + ' (' + pref.value + ') was invalid. The save will continue, but the invalid data value will be skipped.');
userValue = null;
}
break;
case 'set': // read from the set of check boxes
userValue = [];
if (pref.setDisplayOrder) {
// read only those keys specified in the display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
if (form[pref.name + '_' + item].checked) {
userValue.push(item);
}
});
} else {
// read all the keys in the list of values
$.each(pref.setValues, (itemkey) => {
if (form[pref.name + '_' + itemkey].checked) {
userValue.push(itemkey);
}
});
}
break;
case 'customList': // read from the jQuery data stored on the button object
userValue = $(form[pref.name]).data('value');
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
} else if (Twinkle.prefs) {
// Retain the hidden preferences that may have customised by the user from twinkleoptions.js
// undefined if not set
userValue = Twinkle.prefs[pref.name];
}
}
// only save those preferences that are *different* from the default
if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
newConfig[pref.name] = userValue;
}
});
});
let text =
'// twinkleoptions.js: personal Twinkle preferences file\n' +
'//\n' +
'// NOTE: The easiest way to change your Twinkle preferences is by using the\n' +
'// Twinkle preferences panel, at [[' + Morebits.pageNameNorm + ']].\n' +
'//\n' +
'// This file is AUTOMATICALLY GENERATED. Any changes you make (aside from\n' +
'// changing the configuration parameters in a valid-JavaScript way) will be\n' +
'// overwritten the next time you click "save" in the Twinkle preferences\n' +
'// panel. If modifying this file, make sure to use correct JavaScript.\n' +
// eslint-disable-next-line no-useless-concat
'// <no' + 'wiki>\n' +
'\n' +
'window.Twinkle.prefs = ';
text += JSON.stringify(newConfig, null, 2);
text +=
';\n' +
'\n' +
// eslint-disable-next-line no-useless-concat
'// </no' + 'wiki>\n' +
'// End of twinkleoptions.js\n';
pageobj.setPageText(text);
pageobj.setEditSummary('Saving Twinkle preferences: automatic edit from [[:' + Morebits.pageNameNorm + ']]');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('recreate');
pageobj.save(Twinkle.config.saveSuccess);
};
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
pageobj.getStatusElement().info('successful');
const noticebox = document.createElement('div');
noticebox.className = 'cdx-message cdx-message--success';
noticebox.style.fontSize = '100%';
noticebox.innerHTML = '<p><b>Your Twinkle preferences have been saved.</b> To see the changes, you will need to clear your browser cache entirely (see <a href="' + mw.util.getUrl('WP:BYPASS') + '" title="WP:BYPASS">WP:BYPASS</a> for instructions).</p>';
mw.loader.using('mediawiki.htmlform.codex.styles', () => {
Morebits.Status.root.appendChild(noticebox);
});
const noticeclear = document.createElement('br');
noticeclear.style.clear = 'both';
Morebits.Status.root.appendChild(noticeclear);
};
Twinkle.addInitCallback(Twinkle.config.init);
}());
// </nowiki>
a5nji5o0q5ilzm1uknrh8mfnz210sul
2353450
2353364
2026-05-15T04:05:14Z
Kateru Zakuro
34522
2353450
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinkleconfig.js: Preferences module
****************************************
* Mode of invocation: Adds configuration form to Wikipedia:Twinkle/Preferences,
and adds an ad box to the top of user subpages belonging to the
currently logged-in user which end in '.js'
* Active on: What I just said. Yeah.
*/
Twinkle.config = {};
Twinkle.config.watchlistEnums = {
yes: 'Thêm vào danh sách theo dõi',
no: "Không thêm vào danh sách theo dõi",
default: 'Thực hiện theo các tùy chỉnh trang của bạn',
'1 week': 'Watch for 1 week',
'1 month': 'Watch for 1 month',
'3 months': 'Watch for 3 months',
'6 months': 'Watch for 6 months'
};
Twinkle.config.commonSets = {
csdCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
csdCriteriaNotification: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
},
csdAndImageDeletionCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
namespacesNoSpecial: {
0: 'Entry',
1: 'Talk (entry)',
2: 'User',
3: 'User talk',
4: 'Wiktionary',
5: 'Wiktionary talk',
6: 'File',
7: 'File talk',
8: 'MediaWiki',
9: 'MediaWiki talk',
10: 'Template',
11: 'Template talk',
12: 'Help',
13: 'Help talk',
14: 'Category',
15: 'Category talk',
100: 'Appendix',
101: 'Appendix talk',
710: 'TimedText',
711: 'TimedText talk',
828: 'Module',
829: 'Module talk'
}
};
Twinkle.config.commonSets.csdCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteria );
Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteriaNotification );
Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdAndImageDeletionCriteria );
/**
* Section entry format:
*
* {
* title: <human-readable section title>,
* module: <name of the associated module, used to link to sections>,
* adminOnly: <true for admin-only sections>,
* hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
* preferences: [
* {
* name: <TwinkleConfig property name>,
* label: <human-readable short description - used as a form label>,
* helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
* adminOnly: <true for admin-only preferences>,
* type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
* enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
* customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
* customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
* },
* . . .
* ]
* },
* . . .
*
*/
Twinkle.config.sections = [
{
title: 'Chung',
module: 'general',
preferences: [
// TwinkleConfig.userTalkPageMode may take arguments:
// 'window': open a new window, remember the opened window
// 'tab': opens in a new tab, if possible.
// 'blank': force open in a new window, even if such a window exists
{
name: 'userTalkPageMode',
label: 'Khi mở một trang thảo luận của người dùng, hãy mở trang đó',
type: 'enum',
enumValues: { window: 'Trong một cửa sổ, thay thế các cuộc thảo luận của người dùng khác', tab: 'Trong một tab mới', blank: 'Trong một cửa sổ hoàn toàn mới' }
},
// TwinkleConfig.dialogLargeFont (boolean)
{
name: 'dialogLargeFont',
label: 'Sử dụng văn bản có kích thước lớn hơn trong hộp thoại Twinkle',
type: 'boolean'
},
// Twinkle.config.disabledModules (array)
{
name: 'disabledModules',
label: 'Tắt các mô đun Twinkle đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy hành động cẩn thận. Bỏ chọn để kích hoạt lại.',
type: 'set',
setValues: { arv: 'Báo cáo phá hoại', warn: 'Cảnh báo', welcome: 'Chào mừng thành viên', talkback: 'Hồi âm', speedy: 'Xóa nhanh', prod: 'Đề nghị xóa', xfd: 'Thảo luận xóa', image: 'Đề nghị xóa hình', protect: 'Khóa trang', tag: 'Gắn bảng bảo trì', diff: 'Khác biệt phiên bản', unlink: 'Gỡ liên kết', rollback: 'Lùi sửa và hồi sửa' }
},
// Twinkle.config.disabledSysopModules (array)
{
name: 'disabledSysopModules',
label: 'Tắt các mô-đun chỉ dành cho quản trị viên đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy thao tác cẩn thận. Bỏ chọn để kích hoạt lại.',
adminOnly: true,
type: 'set',
setValues: { block: 'Cấm (Block)', deprod: 'Xóa hàng loạt theo đề xuất (DePROD)', batchdelete: 'Xóa hàng loạt theo thể loại (D-batch)', batchprotect: 'Khóa/mở khóa hàng loạt (P-batch)', batchundelete: 'Phục hồi xóa hàng loạt (Und-batch)' }
}
]
},
{
title: 'ARV',
module: 'arv',
preferences: [
{
name: 'spiWatchReport',
label: 'Thêm các trang báo cáo sockpuppet (rối) vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Cấm người dùng',
module: 'block',
adminOnly: true,
preferences: [
// TwinkleConfig.defaultToBlock64 (boolean)
// Whether to default to just blocking the /64 on or off
{
name: 'defaultToBlock64',
label: 'For IPv6 addresses, select the option to block the /64 range by default',
type: 'boolean'
},
// TwinkleConfig.defaultToPartialBlocks (boolean)
// Whether to default partial blocks on or off
{
name: 'defaultToPartialBlocks',
label: 'Chọn các cấm một phần theo mặc định khi mở menu cấm',
helptip: 'If the user is already blocked, this will be overridden in favor of defaulting to the current block type',
type: 'boolean'
},
// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
// if true, blank the talk page when issuing an indef block notice (per [[WP:UWUL#Indefinitely blocked users]])
{
name: 'blankTalkpageOnIndefBlock',
label: 'Làm trống trang thảo luận khi cấm vô hạn thành viên',
helptip: 'See <a href="' + mw.util.getUrl('Wikipedia:WikiProject_User_warnings/Usage_and_layout#Indefinitely_blocked_users') + '">WP:UWUL</a> for more information.',
type: 'boolean'
}
]
},
{
title: 'Xóa hình ảnh (image deletion - DI)',
module: 'image',
preferences: [
// TwinkleConfig.notifyUserOnDeli (boolean)
// If the user should be notified after placing a file deletion tag
{
name: 'notifyUserOnDeli',
label: 'Kiểm tra hộp "thông báo cho người tải lên đầu tiên" theo mặc định',
type: 'boolean'
},
// TwinkleConfig.deliWatchPage (string)
// The watchlist setting of the page tagged for deletion.
{
name: 'deliWatchPage',
label: 'Thêm hình trang hình ảnh vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.deliWatchUser (string)
// The watchlist setting of the user talk page if a notification is placed.
{
name: 'deliWatchUser',
label: 'Thêm trang thảo luận của người dùng tải lên đầu tiên vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Page protection ' + (Morebits.userIsSysop ? '(PP)' : '(RPP)'),
module: 'protect',
preferences: [
{
name: 'watchRequestedPages',
label: 'Add page to watchlist when requesting protection',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchPPTaggedPages',
label: 'Add page to watchlist when tagging with protection template',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchProtectedPages',
label: 'Add page to watchlist when protecting',
helptip: 'If also tagging the page after protection, that preference will be favored.',
adminOnly: true,
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Đề nghị xóa (PROD)',
module: 'prod',
preferences: [
// TwinkleConfig.watchProdPages (string)
// Watchlist setting when applying prod template to page
{
name: 'watchProdPages',
label: 'Thêm mục từ vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markProdPagesAsPatrolled (boolean)
// If, when applying prod template to page, to mark the page as curated/patrolled (if the page was reached from NewPages)
{
name: 'markProdPagesAsPatrolled',
label: 'Đánh dấu trang đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.prodReasonDefault (string)
// The prefilled PROD reason.
{
name: 'prodReasonDefault',
label: 'Điền trước lý do đề xuất xóa (PROD)',
type: 'string'
},
{
name: 'logProdPages',
label: 'Giữ nhật trình ở không gian người dùng đối với tất cả trang mà bạn gán nhãn theo đề xuất xóa (PROD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật trình không gian người dùng cung cấp một cách tốt để theo dõi tất cả các trang mà bạn gán nhãn đề xuất xóa (PROD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'prodLogPageName',
label: 'Giữ nhật trình không gian người dùng PROD tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký đề xuất xóa (PROD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật chế độ ghi nhật trình không gian người dùng theo đề xuất xóa (PROD).',
type: 'string'
}
]
},
{
title: 'Hồi sửa (revert) và lùi sửa (rollback)',
module: 'rollback',
preferences: [
// TwinkleConfig.autoMenuAfterRollback (bool)
// Option to automatically open the warning menu if the user talk page is opened post-reversion
{
name: 'autoMenuAfterRollback',
label: 'Tự động mở menu cảnh báo Twinkle trên trang thảo luận của người dùng sau khi lùi sửa bằng Twinkle',
helptip: 'Chỉ hoạt động nếu các chức năng tương ứng bên dưới được chọn.',
type: 'boolean'
},
// TwinkleConfig.openTalkPage (array)
// What types of actions that should result in opening of talk page
{
name: 'openTalkPage',
label: 'Mở trang thảo luận người dùng sau các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại' }
},
// TwinkleConfig.openTalkPageOnAutoRevert (bool)
// Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
{
name: 'openTalkPageOnAutoRevert',
label: 'Mở trang thảo luận người dùng khi khôi phục lùi sửa từ các đóng góp người dùng hoặc các thay đổi gần đây',
helptip: 'Khi tính năng này được bật, các tùy chọn mong muốn phải được bật ở cài đặt trước đó để tính năng này hoạt động.',
type: 'boolean'
},
// TwinkleConfig.rollbackInPlace (bool)
//
{
name: 'rollbackInPlace',
label: "Không tải lại trang khi lùi sửa từ các đóng góp hoặc các thay đổi gần đây",
helptip: "Khi tính năng này được bật, Twinkle sẽ không tải lại nguồn cấp dữ liệu các đóng góp hoặc thay đổi gần đây sau khi hồi sửa, cho phép bạn hồi sửa nhiều sửa đổi cùng một lúc.",
type: 'boolean'
},
// TwinkleConfig.markRevertedPagesAsMinor (array)
// What types of actions that should result in marking edit as minor
{
name: 'markRevertedPagesAsMinor',
label: 'Đánh dấu là sửa đổi nhỏ cho các loại đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedPages (array)
// What types of actions that should result in forced addition to watchlist
{
name: 'watchRevertedPages',
label: 'Thêm các trang vào danh sách theo dõi cho các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchRevertedExpiry',
label: 'When reverting a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.offerReasonOnNormalRevert (boolean)
// If to offer a prompt for extra summary reason for normal reverts, default to true
{
name: 'offerReasonOnNormalRevert',
label: 'Nhắc lý do cho các lần lùi sửa bình thường',
helptip: 'Các lùi sửa "bình thường" là những lùi sửa được khôi phục từ liên kết [lùi sửa] nằm ở chính giữa.',
type: 'boolean'
},
{
name: 'confirmOnRollback',
label: 'Yêu cầu một thông báo xác nhận trước khi hồi sửa',
helptip: 'Dành cho những người sử dụng bút hoặc thiết bị cảm ứng và những người thường xuyên thiếu quyết đoán.',
type: 'boolean'
},
{
name: 'confirmOnMobileRollback',
label: 'Require confirmation before reverting (mobile devices only)',
helptip: 'Avoid accidental reversions when on mobile devices.',
type: 'boolean'
},
// TwinkleConfig.showRollbackLinks (array)
// Where Twinkle should show rollback links:
// diff, others, mine, contribs, history, recent
// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
{
name: 'showRollbackLinks',
label: 'Hiển thị liên kết lùi sửa trên các trang này',
type: 'set',
setValues: { diff: 'Các trang khác biệt', others: 'Các trang đóng góp của những người dùng khác', mine: 'Trang đóng góp của tôi', recent: 'Các các trang đặc biệt thay đổi gần đây và các thay đổi liên quan', history: 'Các trang lịch sử' }
}
]
},
{
title: 'Xóa nhanh (CSD)',
module: 'speedy',
preferences: [
{
name: 'speedySelectionStyle',
label: 'Khi nào nên tiếp tục và gán nhãn/xóa trang',
type: 'enum',
enumValues: { buttonClick: 'Khi tôi nhấn nút "Gửi" (hoặc Submit)', radioClick: 'Ngay khi tôi nhấn 1 lựa chọn nào đó' }
},
// TwinkleConfig.watchSpeedyPages (array)
// Whether to add speedy tagged or deleted pages to watchlist
{
name: 'watchSpeedyPages',
label: 'Thêm trang vào danh sách theo dõi khi sử dụng các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
},
// TwinkleConfig.watchSpeedyExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchSpeedyExpiry',
label: 'When tagging a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
// If, when applying speedy template to page, to mark the page as triaged/patrolled (if the page was reached from NewPages)
{
name: 'markSpeedyPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.watchSpeedyUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'watchSpeedyUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
// On what types of speedy deletion notifications shall the user be welcomed
// with a "firstarticle" notice if their talk page has not yet been created.
{
name: 'welcomeUserOnSpeedyDeletionNotification',
label: 'Chào mừng người tạo trang khi thông báo với các tiêu chí này',
helptip: 'Lời chào mừng chỉ được đưa ra nếu người dùng đã được thông báo về việc xóa và chỉ khi trang thảo luận của họ chưa tồn tại. Bản mẫu được dùng là {{firstarticle}}.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
// What types of actions should result in the author of the page being notified of nomination
{
name: 'notifyUserOnSpeedyDeletionNomination',
label: 'Thông báo cho người tạo trang khi gán nhãn với các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.warnUserOnSpeedyDelete (array)
// What types of actions should result in the author of the page being notified of speedy deletion (admin only)
{
name: 'warnUserOnSpeedyDelete',
label: 'Thông báo cho người tạo trang khi xóa theo các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
{
name: 'promptForSpeedyDeletionSummary',
label: 'Cho phép sửa đổi tóm tắt xóa khi xóa theo các tiêu chí này',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
},
// TwinkleConfig.deleteTalkPageOnDelete (boolean)
// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
{
name: 'deleteTalkPageOnDelete',
label: 'Chọn "cũng xóa trang thảo luận" theo mặc định',
adminOnly: true,
type: 'boolean'
},
{
name: 'deleteRedirectsOnDelete',
label: 'Chọn "cũng xóa đổi hướng" theo mặc định',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.deleteSysopDefaultToDelete (boolean)
// Make the CSD screen default to "delete" instead of "tag" (admin only)
{
name: 'deleteSysopDefaultToDelete',
label: 'Mặc định để xóa hẳn thay vì gán nhãn xóa nhanh',
helptip: 'Nếu đã có nhãn tiêu chí xóa nhanh (CSD), Twinkle sẽ luôn mặc định ở chế độ "xóa"',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowWidth',
label: 'Chiều rộng của cửa sổ xóa nhanh (pixel)',
type: 'integer'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowHeight',
label: 'Chiều cao của cửa sổ xóa nhanh (pixel)',
helptip: 'Nếu bạn có một màn hình lớn, bạn có thể muốn tăng giá trị này lên.',
type: 'integer'
},
{
name: 'logSpeedyNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các đề cử theo tiêu chí xóa nhanh (CSD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật ký không gian người dùng cung cấp một cách tốt nhất để theo dõi tất cả các trang đã đề cử theo tiêu chí xóa nhanh (CSD) khi sử dụng Twinkle. Các tập tin được gán nhãn xóa hình (DI) cũng được thêm vào nhật ký này.',
type: 'boolean'
},
{
name: 'speedyLogPageName',
label: 'Giữ nhật trình không gian người dùng theo tiêu chí xóa nhanh (CSD) tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký tiêu chí xóa nhanh (CSD) của mình tại Thành viên:<i>Tên người dùng</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật ký không gian người dùng theo tiêu chí xóa nhanh (CSD).',
type: 'string'
},
{
name: 'noLogOnSpeedyNomination',
label: 'Không tạo mục nhập nhật trình không gian người dùng khi gán nhãn với các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
}
]
},
{
title: 'Gán nhãn',
module: 'tag',
preferences: [
{
name: 'watchTaggedVenues',
label: 'Add page to watchlist when tagging these type of pages',
type: 'set',
setValues: { articles: 'Articles', drafts: 'Drafts', redirects: 'Redirects', files: 'Files' }
},
{
name: 'watchTaggedPages',
label: 'Thêm trang vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchMergeDiscussions',
label: 'Thêm các trang thảo luận vào danh sách theo dõi khi bắt đầu hợp nhất (trộn) thảo luận',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markTaggedPagesAsMinor',
label: 'Mark addition of tags as a minor edit',
type: 'boolean'
},
{
name: 'markTaggedPagesAsPatrolled',
label: 'Chọn chức năng "đánh dấu trang là đã tuần tra/đã xem xét" theo mặc định',
type: 'boolean'
},
{
name: 'groupByDefault',
label: 'Chọn chức năng hộp "gom nhóm thành {{nhiều vấn đề}}" theo mặc định',
type: 'boolean'
},
{
name: 'tagArticleSortOrder',
label: 'Default view order for article tags',
type: 'enum',
enumValues: { cat: 'By categories', alpha: 'In alphabetical order' }
},
{
name: 'customTagList',
label: 'Các nhãn bảo trì mục từ/bản nháp tùy chỉnh để hiển thị',
helptip: "Các nhãn này xuất hiện dưới dạng các tùy chỉnh bổ sung ở cuối danh sách nhãn. Ví dụ: bạn có thể thêm các nhãn bảo trì mới chưa được thêm vào mặc định của Twinkle.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Nhãn'
},
{
name: 'customFileTagList',
label: 'Các nhãn bảo trì tập tin tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho các tập tin.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
},
{
name: 'customRedirectTagList',
label: 'Các nhãn đổi hướng thể loại tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho đổi hướng.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
}
]
},
{
title: 'Hồi âm',
module: 'talkback',
preferences: [
{
name: 'markTalkbackAsMinor',
label: 'Đánh dấu hồi âm là sửa đổi nhỏ',
type: 'boolean'
},
{
name: 'insertTalkbackSignature',
label: 'Chèn chữ ký trong hồi âm',
type: 'boolean'
},
{
name: 'talkbackHeading',
label: 'Phần tiêu đề sử dụng cho các cuộc hồi âm',
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
},
{
name: 'mailHeading',
label: "Phần tiêu đề sử dụng cho các thông báo \"Bạn đã có thư\"",
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
}
]
},
{
title: 'Gỡ liên kết',
module: 'unlink',
preferences: [
// TwinkleConfig.unlinkNamespaces (array)
// In what namespaces unlink should happen, default in 0 (article), 10 (template), 100 (portal), and 118 (draft)
{
name: 'unlinkNamespaces',
label: 'Xóa liên kết khỏi các trang trong các không gian tên này',
helptip: 'Tránh chọn bất kỳ không gian tên thảo luận nào, vì Twinkle có thể kết thúc việc hủy liên kết ở các kho lưu trữ thảo luận (một điều tuyệt đối không).',
type: 'set',
setValues: Twinkle.config.commonSets.namespacesNoSpecial
}
]
},
{
title: 'Cảnh báo người dùng',
module: 'warn',
preferences: [
// TwinkleConfig.defaultWarningGroup (int)
// Which level warning should be the default selected group, default is 1
{
name: 'defaultWarningGroup',
label: 'Mức cảnh báo mặc định',
type: 'enum',
enumValues: {
1: 'Mức 1',
2: 'Mức 2',
3: 'Mức 3',
4: 'Mức 4',
5: 'Mức 4im',
6: 'Thông báo một vấn đề',
7: 'Cảnh báo một vấn đề',
// 8 was used for block templates before #260
9: 'Cảnh báo tùy chỉnh',
10: 'Tất cả bản mẫu cảnh báo',
11: 'Tự chọn mức cảnh báo (1-4)'
}
},
// TwinkleConfig.combinedSingletMenus (boolean)
// if true, show one menu with both single-issue notices and warnings instead of two separately
{
name: 'combinedSingletMenus',
label: 'Thay thế menu hai vấn đề riêng biệt thành một menu kết hợp',
helptip: 'Chọn thông báo một vấn đề hoặc cảnh báo một vấn đề làm mặc định nếu tính năng này được kích hoạt.',
type: 'boolean'
},
// TwinkleConfig.watchWarnings (string)
// Watchlist setting for the page which has been dispatched an warning or notice
{
name: 'watchWarnings',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.oldSelect (boolean)
// if true, use the native select menu rather the select2-based one
{
name: 'oldSelect',
label: 'Sử dụng menu chọn cổ điển không có khả năng tìm kiếm',
type: 'boolean'
},
{
name: 'customWarningList',
label: 'Các bản mẫu cảnh báo tùy chỉnh để hiển thị',
helptip: 'Bạn có thể thêm các bản mẫu riêng lẻ hoặc các trang con người dùng. Cảnh báo tùy chỉnh xuất hiện ở danh mục "Cảnh báo tùy chỉnh" trong hộp thoại cảnh báo.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong danh sách cảnh báo (cũng được sử dụng làm bản tóm tắt chỉnh sửa)'
}
]
},
{
title: 'Chào mừng thành viên',
module: 'welcome',
preferences: [
{
name: 'topWelcomes',
label: 'Đặt nội dung chào mừng phía trên nội dung trang thảo luận của người dùng hiện có',
type: 'boolean'
},
{
name: 'watchWelcomes',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi chào mừng',
helptip: 'Làm như vậy để thêm yếu tố cá nhân của việc chào đón người dùng - bạn sẽ có thể thấy cách họ hoạt động với tư cách là một người mới và có thể giúp họ.',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'insertUsername',
label: 'Thêm tên người dùng của bạn vào mẫu (nếu có)',
helptip: "Một số bản mẫu chào mừng có câu mở đầu như \"Xin chào, tên tôi là <username>. Chào mừng\" .v. Nếu bạn tắt tùy chỉnh này, các bản mẫu này sẽ không hiển thị tên người dùng của bạn theo cách này.",
type: 'boolean'
},
{
name: 'quickWelcomeMode',
label: 'Nhấp vào liên kết "chào mừng" trên một trang khác biệt sửa đổi',
helptip: 'Nếu bạn chọn chào mừng tự động, bản mẫu bạn chỉ định bên dưới sẽ được sử dụng.',
type: 'enum',
enumValues: { auto: 'chào mừng tự động', norm: 'bạn cần chọn một bản mẫu' }
},
{
name: 'quickWelcomeTemplate',
label: 'Bản mẫu để sử dụng khi chào mừng tự động',
helptip: 'Nhập tên của bản mẫu chào mừng, không có dấu ngoặc nhọn. Một liên kết đến mục từ đã cho sẽ được thêm vào.',
type: 'string'
},
{
name: 'customWelcomeList',
label: 'Các bản mẫu chào mừng tùy chỉnh để hiển thị',
helptip: "Bạn có thể thêm các bản mẫu chào mừng khác hoặc các trang con của người dùng là các bản mẫu chào mừng (có tiền tố là \"Thành viên:\"). Đừng quên rằng các bản mẫu này được thay thế trên các trang thảo luận người dùng.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Chào mừng'
},
{
name: 'customWelcomeSignature',
label: 'Tự động ký tên các bản mẫu chào mừng tùy chỉnh',
helptip: 'Nếu các bản mẫu chào mừng tùy chỉnh đã tích hợp chữ ký, hãy tắt tùy chỉnh này.',
type: 'boolean'
}
]
},
{
title: 'XFD (thảo luận xóa)',
module: 'xfd',
preferences: [
{
name: 'logXfdNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các trang mà bạn đề cử thảo luận xóa (XfD)',
helptip: 'Nhật trình không gian người dùng đem đến sự hữu ích khi theo dõi tất cả các trang mà bạn đề cử cho thảo luận xóa (XfD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'xfdLogPageName',
label: 'Giữ nhật trình không gian người dùng thảo luận xóa tại trang con của người dùng này',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký thảo luận xóa (XfD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật trình không gian người dùng thảo luận xóa (XfD)."',
type: 'string'
},
{
name: 'noLogOnXfdNomination',
label: 'Không ghi lại nhật trình không gian người dùng khi đề cử tại nơi này',
type: 'set',
setValues: { afd: 'AfD', tfd: 'TfD', ffd: 'FfD', cfd: 'CfD', cfds: 'CfD/S', mfd: 'MfD', rfd: 'RfD', rm: 'RM' }
},
// TwinkleConfig.xfdWatchPage (string)
// The watchlist setting of the page being nominated for XfD.
{
name: 'xfdWatchPage',
label: 'Thêm trang được đề cử vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchDiscussion (string)
// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
// or the list page for the other processes.
{
name: 'xfdWatchDiscussion',
label: 'Thêm trang thảo luận xóa vào danh sách theo dõi',
helptip: 'Điều này đề cập đến trang con thảo luận (cho AfD và MfD) hoặc trang nhật ký hàng ngày (cho TfD, CfD, RfD và FfD)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchList (string)
// The watchlist setting of the XfD list page, *if* the discussion is on a separate page.
{
name: 'xfdWatchList',
label: 'Thêm trang nhật trình/danh sách hàng ngày vào danh sách theo dõi (nếu có)',
helptip: 'Điều này chỉ áp dụng cho AfD và MfD với các cuộc thảo luận được đưa vào trang nhật trình hàng ngày (đối với AfD) hoặc trang chính MfD (đối với MfD).',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'xfdWatchUser',
label: 'Thêm trang thảo luận người dùng của người đóng góp ban đầu vào danh sách theo dõi (khi thông báo)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchRelated (string)
// The watchlist setting of the target of a redirect being nominated for RfD.
{
name: 'xfdWatchRelated',
label: "Thêm trang đích đổi hướng vào danh sách theo dõi (khi thông báo)",
helptip: 'Điều này chỉ áp dụng cho RfD, khi để lại thông báo trên trang thảo luận về mục tiêu đổi hướng',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markXfdPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét theo đề cử tiêu chí xóa theo thảo luận (AFD) (nếu có thể)',
type: 'boolean'
}
]
},
{
title: 'Hidden',
hidden: true,
preferences: [
// twinklerollback.js: defines how many revision to query maximum, maximum possible is 50, default is 50
{
name: 'revertMaxRevisions',
type: 'integer'
},
// twinklewarn.js: When using the autolevel select option, how many days makes a prior warning stale
// Huggle is three days ([[Special:Diff/918980316]] and [[Special:Diff/919417999]]) while ClueBotNG is two:
// https://github.com/DamianZaremba/cluebotng/blob/4958e25d6874cba01c75f11debd2e511fd5a2ce5/bot/action_functions.php#L62
{
name: 'autolevelStaleDays',
type: 'integer'
},
// How many pages should be queried by deprod and batchdelete/protect/undelete
{
name: 'batchMax',
type: 'integer',
adminOnly: true
},
// How many pages should be processed at a time by deprod and batchdelete/protect/undelete
{
name: 'batchChunks',
type: 'integer',
adminOnly: true
}
]
}
]; // end of Twinkle.config.sections
Twinkle.config.init = function twinkleconfigInit() {
// create the config page at Wikipedia:Twinkle/Preferences
if ((mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').project && mw.config.get('wgTitle') === 'Twinkle/Preferences') &&
mw.config.get('wgAction') === 'view') {
if (!document.getElementById('twinkle-config')) {
return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
}
// set style to nothing to prevent conflict with external css
document.getElementById('twinkle-config').removeAttribute('style');
document.getElementById('twinkle-config-titlebar').removeAttribute('style');
const contentdiv = document.getElementById('twinkle-config-content');
contentdiv.textContent = ''; // clear children
// let user know about possible conflict with skin js/common.js file
// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
if (window.TwinkleConfig || window.FriendlyConfig) {
const contentnotice = document.createElement('div');
contentnotice.className = 'plainlinks twinkle-ombox';
contentnotice.innerHTML =
'<div>' +
'<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/3/38/Imbox_content.png" />' +
'</div>' +
'<div>' +
'<p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
'<p>To do this, you can <a href="' + mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/' + mw.config.get('skin') +
'.js', { action: 'edit' }) + '" target="_blank"><b>edit your personal skin javascript file</b></a> or <a href="' +
mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/common.js', { action: 'edit'}) + '" target="_blank"><b>your common.js file</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
'</div>';
contentdiv.appendChild(contentnotice);
}
// start a table of contents
const toctable = document.createElement('div');
toctable.className = 'toc';
toctable.style.marginLeft = '0.4em';
// create TOC title
const toctitle = document.createElement('div');
toctitle.id = 'toctitle';
const toch2 = document.createElement('h2');
toch2.textContent = 'Nội dung ';
toctitle.appendChild(toch2);
// add TOC show/hide link
const toctoggle = document.createElement('span');
toctoggle.className = 'toctoggle';
toctoggle.appendChild(document.createTextNode('['));
const toctogglelink = document.createElement('a');
toctogglelink.className = 'internal';
toctogglelink.setAttribute('href', '#tw-tocshowhide');
toctogglelink.textContent = 'hide';
toctoggle.appendChild(toctogglelink);
toctoggle.appendChild(document.createTextNode(']'));
toctitle.appendChild(toctoggle);
toctable.appendChild(toctitle);
// create item container: this is what we add stuff to
const tocul = document.createElement('ul');
toctogglelink.addEventListener('click', () => {
const $tocul = $(tocul);
$tocul.toggle();
if ($tocul.find(':visible').length) {
toctogglelink.textContent = 'hide';
} else {
toctogglelink.textContent = 'show';
}
}, false);
toctable.appendChild(tocul);
contentdiv.appendChild(toctable);
const contentform = document.createElement('form');
contentform.setAttribute('action', 'javascript:void(0)'); // was #tw-save - changed to void(0) to work around Chrome issue
contentform.addEventListener('submit', Twinkle.config.save, true);
contentdiv.appendChild(contentform);
const container = document.createElement('table');
container.style.width = '100%';
contentform.appendChild(container);
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // i.e. "continue" in this context
}
// add to TOC
const tocli = document.createElement('li');
tocli.className = 'toclevel-1';
const toca = document.createElement('a');
toca.setAttribute('href', '#' + section.module);
toca.appendChild(document.createTextNode(section.title));
tocli.appendChild(toca);
tocul.appendChild(tocli);
let row = document.createElement('tr');
let cell = document.createElement('td');
cell.setAttribute('colspan', '3');
const heading = document.createElement('h4');
heading.style.borderBottom = '1px solid gray';
heading.style.marginTop = '0.2em';
heading.id = section.module;
heading.appendChild(document.createTextNode(section.title));
cell.appendChild(heading);
row.appendChild(cell);
container.appendChild(row);
let rowcount = 1; // for row banding
// add each of the preferences to the form
$(section.preferences).each((prefkey, pref) => {
if (pref.adminOnly && !Morebits.userIsSysop) {
return true; // i.e. "continue" in this context
}
row = document.createElement('tr');
row.style.marginBottom = '0.2em';
// create odd row banding
if (rowcount++ % 2 === 0) {
row.style.backgroundColor = 'rgba(128, 128, 128, 0.1)';
}
cell = document.createElement('td');
let label, input;
const gotPref = Twinkle.getPref(pref.name);
switch (pref.type) {
case 'boolean': // create a checkbox
cell.setAttribute('colspan', '2');
label = document.createElement('label');
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (gotPref === true) {
input.setAttribute('checked', 'checked');
}
label.appendChild(input);
label.appendChild(document.createTextNode(pref.label));
cell.appendChild(label);
break;
case 'string': // create an input box
case 'integer':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (pref.type === 'integer') {
input.setAttribute('size', 6);
input.setAttribute('type', 'number');
input.setAttribute('step', '1'); // integers only
}
if (gotPref) {
input.setAttribute('value', gotPref);
}
cell.appendChild(input);
break;
case 'enum': // create a combo box
// add label to first column
// note: duplicates the code above, under string/integer
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('select');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
$.each(pref.enumValues, (enumvalue, enumdisplay) => {
const option = document.createElement('option');
option.setAttribute('value', enumvalue);
if ((gotPref === enumvalue) ||
// Hack to convert old boolean watchlist prefs
// to corresponding enums (added in v2.1)
(typeof gotPref === 'boolean' &&
((gotPref && enumvalue === 'yes') ||
(!gotPref && enumvalue === 'no')))) {
option.setAttribute('selected', 'selected');
}
option.appendChild(document.createTextNode(enumdisplay));
input.appendChild(option);
});
cell.appendChild(input);
break;
case 'set': // create a set of check boxes
// add label first of all
cell.setAttribute('colspan', '2');
label = document.createElement('label'); // not really necessary to use a label element here, but we do it for consistency of styling
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
var checkdiv = document.createElement('div');
checkdiv.style.paddingLeft = '1em';
var worker = function(itemkey, itemvalue) {
const checklabel = document.createElement('label');
checklabel.style.marginRight = '0.7em';
checklabel.style.display = 'inline-block';
const check = document.createElement('input');
check.setAttribute('type', 'checkbox');
check.setAttribute('id', pref.name + '_' + itemkey);
check.setAttribute('name', pref.name + '_' + itemkey);
if (gotPref && gotPref.includes(itemkey)) {
check.setAttribute('checked', 'checked');
}
// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
if (pref.name === 'unlinkNamespaces') {
if (gotPref && gotPref.includes(parseInt(itemkey, 10))) {
check.setAttribute('checked', 'checked');
}
}
checklabel.appendChild(check);
checklabel.appendChild(document.createTextNode(itemvalue));
checkdiv.appendChild(checklabel);
};
if (pref.setDisplayOrder) {
// add check boxes according to the given display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
worker(item, pref.setValues[item]);
});
} else {
// add check boxes according to the order it gets fed to us (probably strict alphabetical)
$.each(pref.setValues, worker);
}
cell.appendChild(checkdiv);
break;
case 'customList':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add button to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
var button = document.createElement('button');
button.setAttribute('id', pref.name);
button.setAttribute('name', pref.name);
button.setAttribute('type', 'button');
button.addEventListener('click', Twinkle.config.listDialog.display, false);
// use jQuery data on the button to store the current config value
$(button).data({
value: gotPref,
pref: pref
});
button.appendChild(document.createTextNode('Sửa các mục'));
cell.appendChild(button);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
row.appendChild(cell);
// add help tip
cell = document.createElement('td');
cell.className = 'twinkle-config-helptip';
if (pref.helptip) {
// convert mentions of templates in the helptip to clickable links
cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,
'{{<a href="' + mw.util.getUrl('Template:') + '$1" target="_blank">$1</a>}}');
}
// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
if (pref.type !== 'customList') {
const resetlink = document.createElement('a');
resetlink.setAttribute('href', '#tw-reset');
resetlink.setAttribute('id', 'twinkle-config-reset-' + pref.name);
resetlink.addEventListener('click', Twinkle.config.resetPrefLink, false);
resetlink.style.cssFloat = 'right';
resetlink.style.margin = '0 0.6em';
resetlink.appendChild(document.createTextNode('Thiết lập lại'));
cell.appendChild(resetlink);
}
row.appendChild(cell);
container.appendChild(row);
return true;
});
return true;
});
const footerbox = document.createElement('div');
footerbox.setAttribute('id', 'twinkle-config-buttonpane');
const button = document.createElement('button');
button.setAttribute('id', 'twinkle-config-submit');
button.setAttribute('type', 'submit');
button.appendChild(document.createTextNode('Lưu các thay đổi'));
footerbox.appendChild(button);
const footerspan = document.createElement('span');
footerspan.className = 'plainlinks';
footerspan.style.marginLeft = '2.4em';
footerspan.style.fontSize = '90%';
const footera = document.createElement('a');
footera.setAttribute('href', '#tw-reset-all');
footera.setAttribute('id', 'twinkle-config-resetall');
footera.addEventListener('click', Twinkle.config.resetAllPrefs, false);
footera.appendChild(document.createTextNode('Phục hồi mặc định'));
footerspan.appendChild(footera);
footerbox.appendChild(footerspan);
contentform.appendChild(footerbox);
// since all the section headers exist now, we can try going to the requested anchor
if (window.location.hash) {
const loc = window.location.hash;
window.location.hash = '';
window.location.hash = loc;
}
} else if (mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0 &&
mw.config.get('wgPageName').slice(-3) === '.js') {
const box = document.createElement('div');
// Styled in twinkle.css
box.setAttribute('id', 'twinkle-config-headerbox');
let link;
const scriptPageName = mw.config.get('wgPageName').slice(
mw.config.get('wgPageName').lastIndexOf('/') + 1,
mw.config.get('wgPageName').lastIndexOf('.js')
);
if (scriptPageName === 'twinkleoptions') {
// place "why not try the preference panel" notice
box.setAttribute('class', 'config-twopt-box');
if (mw.config.get('wgArticleId') > 0) { // page exists
box.appendChild(document.createTextNode('Trang này chứa cấu hình Twinkle của bạn. Bạn có thể thay đổi cấu hình ở '));
} else { // page does not exist
box.appendChild(document.createTextNode('Bạn có thể tùy chỉnh Twinkle sao cho phù hợp với sở thích của mình bằng cách sử dụng '));
}
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('hoặc bằng cách chỉnh sửa trang này (nếu bạn biết cách chỉnh sửa).'));
$(box).insertAfter($('#contentSub'));
} else if (['monobook', 'vector', 'vector-2022', 'cologneblue', 'modern', 'timeless', 'minerva', 'common'].includes(scriptPageName)) {
// place "Looking for Twinkle options?" notice
box.setAttribute('class', 'config-userskin-box');
box.appendChild(document.createTextNode('Nếu bạn muốn cài đặt tùy chỉnh Twinkle, bạn có thể sử dụng '));
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('.'));
$(box).insertAfter($('#contentSub'));
}
}
};
// custom list-related stuff
Twinkle.config.listDialog = {};
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow($dlgtable, value, label) {
let $contenttr, $valueInput, $labelInput;
$dlgtable.append(
$contenttr = $('<tr>').append(
$('<td>').append(
$('<button>')
.attr('type', 'button')
.on('click', () => {
$contenttr.remove();
})
.text('Xóa')
),
$('<td>').append(
$valueInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-value')
.css('width', '97%')
),
$('<td>').append(
$labelInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-label')
.css('width', '98%')
)
)
);
if (value) {
$valueInput.val(value);
}
if (label) {
$labelInput.val(label);
}
};
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
const $prefbutton = $(e.target);
const curvalue = $prefbutton.data('value');
const curpref = $prefbutton.data('pref');
const dialog = new Morebits.SimpleWindow(720, 400);
dialog.setTitle(curpref.label);
dialog.setScriptName('Twinkle preferences');
let $dlgtbody;
dialog.setContent(
$('<div>').append(
$('<table>')
.addClass('wikitable')
.css({
margin: '1.4em 1em',
width: 'auto'
})
.append(
$dlgtbody = $('<tbody>').append(
// header row
$('<tr>').append(
$('<th>') // top-left cell
.css('width', '5%'),
$('<th>') // value column header
.css('width', '35%')
.text(curpref.customListValueTitle ? curpref.customListValueTitle : 'Value'),
$('<th>') // label column header
.css('width', '60%')
.text(curpref.customListLabelTitle ? curpref.customListLabelTitle : 'Label')
)
),
$('<tfoot>').append(
$('<tr>').append(
$('<td>')
.attr('colspan', '3')
.append(
$('<button>')
.text('Thêm')
.css('min-width', '8em')
.attr('type', 'button')
.on('click', () => {
Twinkle.config.listDialog.addRow($dlgtbody);
})
)
)
)
),
$('<button>')
.text('Lưu các thay đổi')
.attr('type', 'submit') // so Morebits.SimpleWindow puts the button in the button pane
.on('click', () => {
Twinkle.config.listDialog.save($prefbutton, $dlgtbody);
dialog.close();
}),
$('<button>')
.text('Thiết lập lại')
.attr('type', 'submit')
.on('click', () => {
Twinkle.config.listDialog.reset($prefbutton, $dlgtbody);
}),
$('<button>')
.text('Hủy')
.attr('type', 'submit')
.on('click', () => {
dialog.close();
})
)[0]
);
// content rows
let gotRow = false;
$.each(curvalue, (k, v) => {
gotRow = true;
Twinkle.config.listDialog.addRow($dlgtbody, v.value, v.label);
});
// if there are no values present, add a blank row to start the user off
if (!gotRow) {
Twinkle.config.listDialog.addRow($dlgtbody);
}
dialog.display();
};
// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset($button, $tbody) {
// reset value on button
const curpref = $button.data('pref');
const oldvalue = $button.data('value');
Twinkle.config.resetPref(curpref);
// reset form
$tbody.find('tr').slice(1).remove(); // all rows except the first (header) row
// add the new values
const curvalue = $button.data('value');
$.each(curvalue, (k, v) => {
Twinkle.config.listDialog.addRow($tbody, v.value, v.label);
});
// save the old value
$button.data('value', oldvalue);
};
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave($button, $tbody) {
const result = [];
let current = {};
$tbody.find('input[type="text"]').each((inputkey, input) => {
if ($(input).hasClass('twinkle-config-customlist-value')) {
current = { value: input.value };
} else {
current.label = input.value;
// exclude totally empty rows
if (current.value || current.label) {
result.push(current);
}
}
});
$button.data('value', result);
};
// reset/restore defaults
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
const wantedpref = e.target.id.slice(21); // "twinkle-config-reset-" prefix is stripped
// search tactics
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
let foundit = false;
$(section.preferences).each((prefkey, pref) => {
if (pref.name !== wantedpref) {
return true; // continue
}
Twinkle.config.resetPref(pref);
foundit = true;
return false; // break
});
if (foundit) {
return false; // break
}
});
return false; // stop link from scrolling page
};
Twinkle.config.resetPref = function twinkleconfigResetPref(pref) {
switch (pref.type) {
case 'boolean':
document.getElementById(pref.name).checked = Twinkle.defaultConfig[pref.name];
break;
case 'string':
case 'integer':
case 'enum':
document.getElementById(pref.name).value = Twinkle.defaultConfig[pref.name];
break;
case 'set':
$.each(pref.setValues, (itemkey) => {
if (document.getElementById(pref.name + '_' + itemkey)) {
document.getElementById(pref.name + '_' + itemkey).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
}
});
break;
case 'customList':
$(document.getElementById(pref.name)).data('value', Twinkle.defaultConfig[pref.name]);
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
};
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
// no confirmation message - the user can just refresh/close the page to abort
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
$(section.preferences).each((prefkey, pref) => {
if (!pref.adminOnly || Morebits.userIsSysop) {
Twinkle.config.resetPref(pref);
}
});
return true;
});
return false; // stop link from scrolling page
};
Twinkle.config.save = function twinkleconfigSave(e) {
Morebits.Status.init(document.getElementById('twinkle-config-content'));
const userjs = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').user] + ':' + mw.config.get('wgUserName') + '/twinkleoptions.js';
const wikipediaPage = new Morebits.wiki.Page(userjs, 'Lưu cấu hình vào ' + userjs);
wikipediaPage.setCallbackParameters(e.target);
wikipediaPage.load(Twinkle.config.writePrefs);
return false;
};
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
const form = pageobj.getCallbackParameters();
// this is the object which gets serialized into JSON; only
// preferences that this script knows about are kept
const newConfig = {optionsVersion: 2.1};
// a comparison function is needed later on
// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
// arrays of strings, and arrays of { value, label })
// and it is not very robust: e.g. compare([2], ["2"]) === true, and
// compare({}, {}) === false, but it's good enough for our purposes here
const compare = function(a, b) {
if (Array.isArray(a)) {
if (a.length !== b.length) {
return false;
}
const asort = a.sort(), bsort = b.sort();
for (let i = 0; asort[i]; ++i) {
// comparison of the two properties of custom lists
if ((typeof asort[i] === 'object') && (asort[i].label !== bsort[i].label ||
asort[i].value !== bsort[i].value)) {
return false;
} else if (asort[i].toString() !== bsort[i].toString()) {
return false;
}
}
return true;
}
return a === b;
};
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.adminOnly && !Morebits.userIsSysop) {
return; // i.e. "continue" in this context
}
// reach each of the preferences from the form
$(section.preferences).each((prefkey, pref) => {
let userValue; // = undefined
// only read form values for those prefs that have them
if (!pref.adminOnly || Morebits.userIsSysop) {
if (!section.hidden) {
switch (pref.type) {
case 'boolean': // read from the checkbox
userValue = form[pref.name].checked;
break;
case 'string': // read from the input box or combo box
case 'enum':
userValue = form[pref.name].value;
break;
case 'integer': // read from the input box
userValue = parseInt(form[pref.name].value, 10);
if (isNaN(userValue)) {
Morebits.Status.warn('Đang lưu', 'Giá trị bạn đã đặt cho ' + pref.name + ' (' + pref.value + ') không hợp lệ. Quá trình lưu sẽ tiếp tục, nhưng giá trị dữ liệu không hợp lệ sẽ bị bỏ qua.');
userValue = null;
}
break;
case 'set': // read from the set of check boxes
userValue = [];
if (pref.setDisplayOrder) {
// read only those keys specified in the display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
if (form[pref.name + '_' + item].checked) {
userValue.push(item);
}
});
} else {
// read all the keys in the list of values
$.each(pref.setValues, (itemkey) => {
if (form[pref.name + '_' + itemkey].checked) {
userValue.push(itemkey);
}
});
}
break;
case 'customList': // read from the jQuery data stored on the button object
userValue = $(form[pref.name]).data('value');
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
} else if (Twinkle.prefs) {
// Retain the hidden preferences that may have customised by the user from twinkleoptions.js
// undefined if not set
userValue = Twinkle.prefs[pref.name];
}
}
// only save those preferences that are *different* from the default
if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
newConfig[pref.name] = userValue;
}
});
});
let text =
'// twinkleoptions.js: personal Twinkle preferences file\n' +
'//\n' +
'// NOTE: The easiest way to change your Twinkle preferences is by using the\n' +
'// Twinkle preferences panel, at [[' + Morebits.pageNameNorm + ']].\n' +
'//\n' +
'// This file is AUTOMATICALLY GENERATED. Any changes you make (aside from\n' +
'// changing the configuration parameters in a valid-JavaScript way) will be\n' +
'// overwritten the next time you click "save" in the Twinkle preferences\n' +
'// panel. If modifying this file, make sure to use correct JavaScript.\n' +
// eslint-disable-next-line no-useless-concat
'// <no' + 'wiki>\n' +
'\n' +
'window.Twinkle.prefs = ';
text += JSON.stringify(newConfig, null, 2);
text +=
';\n' +
'\n' +
// eslint-disable-next-line no-useless-concat
'// </no' + 'wiki>\n' +
'// End of twinkleoptions.js\n';
pageobj.setPageText(text);
pageobj.setEditSummary('Lưu cấu hình Twinkle: chỉnh sửa tự động từ [[:' + Morebits.pageNameNorm + ']]');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('recreate');
pageobj.save(Twinkle.config.saveSuccess);
};
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
pageobj.getStatusElement().info('successful');
const noticebox = document.createElement('div');
noticebox.className = 'cdx-message cdx-message--success';
noticebox.style.fontSize = '100%';
noticebox.innerHTML = '<p><b>Các cấu hình Twinkle của bạn đã được lưu lại.</b> Để xem các thay đổi, bạn sẽ cần xóa hoàn toàn bộ đệm trình duyệt (xem <a href="' + mw.util.getUrl('WP:BYPASS') + '" title="WP:BYPASS">WP:BYPASS</a> để có các chỉ dẫn chi tiết).</p>';
mw.loader.using('mediawiki.htmlform.codex.styles', () => {
Morebits.Status.root.appendChild(noticebox);
});
const noticeclear = document.createElement('br');
noticeclear.style.clear = 'both';
Morebits.Status.root.appendChild(noticeclear);
};
Twinkle.addInitCallback(Twinkle.config.init);
}());
// </nowiki>
lm088gd9tqme0xg9kvwxg67wfehe1x7
2353451
2353450
2026-05-15T04:09:06Z
Kateru Zakuro
34522
2353451
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinkleconfig.js: Preferences module
****************************************
* Mode of invocation: Adds configuration form to Wikipedia:Twinkle/Preferences,
and adds an ad box to the top of user subpages belonging to the
currently logged-in user which end in '.js'
* Active on: What I just said. Yeah.
*/
Twinkle.config = {};
Twinkle.config.watchlistEnums = {
yes: 'Thêm vào danh sách theo dõi',
no: "Không thêm vào danh sách theo dõi",
default: 'Thực hiện theo các tùy chỉnh trang của bạn',
'1 week': 'Watch for 1 week',
'1 month': 'Watch for 1 month',
'3 months': 'Watch for 3 months',
'6 months': 'Watch for 6 months'
};
Twinkle.config.commonSets = {
csdCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
csdCriteriaNotification: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
},
csdAndImageDeletionCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
namespacesNoSpecial: {
0: 'Entry',
1: 'Talk (entry)',
2: 'User',
3: 'User talk',
4: 'Wiktionary',
5: 'Wiktionary talk',
6: 'File',
7: 'File talk',
8: 'MediaWiki',
9: 'MediaWiki talk',
10: 'Template',
11: 'Template talk',
12: 'Help',
13: 'Help talk',
14: 'Category',
15: 'Category talk',
100: 'Appendix',
101: 'Appendix talk',
710: 'TimedText',
711: 'TimedText talk',
828: 'Module',
829: 'Module talk'
}
};
Twinkle.config.commonSets.csdCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteria );
Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteriaNotification );
Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdAndImageDeletionCriteria );
/**
* Section entry format:
*
* {
* title: <human-readable section title>,
* module: <name of the associated module, used to link to sections>,
* adminOnly: <true for admin-only sections>,
* hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
* preferences: [
* {
* name: <TwinkleConfig property name>,
* label: <human-readable short description - used as a form label>,
* helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
* adminOnly: <true for admin-only preferences>,
* type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
* enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
* customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
* customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
* },
* . . .
* ]
* },
* . . .
*
*/
Twinkle.config.sections = [
{
title: 'Chung',
module: 'general',
preferences: [
// TwinkleConfig.userTalkPageMode may take arguments:
// 'window': open a new window, remember the opened window
// 'tab': opens in a new tab, if possible.
// 'blank': force open in a new window, even if such a window exists
{
name: 'userTalkPageMode',
label: 'Khi mở một trang thảo luận của người dùng, hãy mở trang đó',
type: 'enum',
enumValues: { window: 'Trong một cửa sổ, thay thế các cuộc thảo luận của người dùng khác', tab: 'Trong một tab mới', blank: 'Trong một cửa sổ hoàn toàn mới' }
},
// TwinkleConfig.dialogLargeFont (boolean)
{
name: 'dialogLargeFont',
label: 'Sử dụng văn bản có kích thước lớn hơn trong hộp thoại Twinkle',
type: 'boolean'
},
// Twinkle.config.disabledModules (array)
{
name: 'disabledModules',
label: 'Tắt các mô đun Twinkle đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy hành động cẩn thận. Bỏ chọn để kích hoạt lại.',
type: 'set',
setValues: { arv: 'Báo cáo phá hoại', warn: 'Cảnh báo', welcome: 'Chào mừng thành viên', talkback: 'Hồi âm', speedy: 'Xóa nhanh', prod: 'Đề nghị xóa', xfd: 'Thảo luận xóa', image: 'Đề nghị xóa hình', protect: 'Khóa trang', tag: 'Gắn bảng bảo trì', diff: 'Khác biệt phiên bản', unlink: 'Gỡ liên kết', rollback: 'Lùi sửa và hồi sửa' }
},
// Twinkle.config.disabledSysopModules (array)
{
name: 'disabledSysopModules',
label: 'Tắt các mô-đun chỉ dành cho quản trị viên đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy thao tác cẩn thận. Bỏ chọn để kích hoạt lại.',
adminOnly: true,
type: 'set',
setValues: { block: 'Cấm (Block)', deprod: 'Xóa hàng loạt theo đề xuất (DePROD)', batchdelete: 'Xóa hàng loạt theo thể loại (D-batch)', batchprotect: 'Khóa/mở khóa hàng loạt (P-batch)', batchundelete: 'Phục hồi xóa hàng loạt (Und-batch)' }
}
]
},
{
title: 'ARV',
module: 'arv',
preferences: [
{
name: 'spiWatchReport',
label: 'Thêm các trang báo cáo sockpuppet (rối) vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Cấm người dùng',
module: 'block',
adminOnly: true,
preferences: [
// TwinkleConfig.defaultToBlock64 (boolean)
// Whether to default to just blocking the /64 on or off
{
name: 'defaultToBlock64',
label: 'For IPv6 addresses, select the option to block the /64 range by default',
type: 'boolean'
},
// TwinkleConfig.defaultToPartialBlocks (boolean)
// Whether to default partial blocks on or off
{
name: 'defaultToPartialBlocks',
label: 'Chọn các cấm một phần theo mặc định khi mở menu cấm',
helptip: 'If the user is already blocked, this will be overridden in favor of defaulting to the current block type',
type: 'boolean'
},
// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
// if true, blank the talk page when issuing an indef block notice (per [[WP:UWUL#Indefinitely blocked users]])
{
name: 'blankTalkpageOnIndefBlock',
label: 'Làm trống trang thảo luận khi cấm vô hạn thành viên',
helptip: 'See <a href="' + mw.util.getUrl('Wikipedia:WikiProject_User_warnings/Usage_and_layout#Indefinitely_blocked_users') + '">WP:UWUL</a> for more information.',
type: 'boolean'
}
]
},
{
title: 'Xóa hình ảnh (image deletion - DI)',
module: 'image',
preferences: [
// TwinkleConfig.notifyUserOnDeli (boolean)
// If the user should be notified after placing a file deletion tag
{
name: 'notifyUserOnDeli',
label: 'Kiểm tra hộp "thông báo cho người tải lên đầu tiên" theo mặc định',
type: 'boolean'
},
// TwinkleConfig.deliWatchPage (string)
// The watchlist setting of the page tagged for deletion.
{
name: 'deliWatchPage',
label: 'Thêm hình trang hình ảnh vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.deliWatchUser (string)
// The watchlist setting of the user talk page if a notification is placed.
{
name: 'deliWatchUser',
label: 'Thêm trang thảo luận của người dùng tải lên đầu tiên vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Page protection ' + (Morebits.userIsSysop ? '(PP)' : '(RPP)'),
module: 'protect',
preferences: [
{
name: 'watchRequestedPages',
label: 'Add page to watchlist when requesting protection',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchPPTaggedPages',
label: 'Add page to watchlist when tagging with protection template',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchProtectedPages',
label: 'Add page to watchlist when protecting',
helptip: 'If also tagging the page after protection, that preference will be favored.',
adminOnly: true,
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Đề nghị xóa (PROD)',
module: 'prod',
preferences: [
// TwinkleConfig.watchProdPages (string)
// Watchlist setting when applying prod template to page
{
name: 'watchProdPages',
label: 'Thêm mục từ vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markProdPagesAsPatrolled (boolean)
// If, when applying prod template to page, to mark the page as curated/patrolled (if the page was reached from NewPages)
{
name: 'markProdPagesAsPatrolled',
label: 'Đánh dấu trang đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.prodReasonDefault (string)
// The prefilled PROD reason.
{
name: 'prodReasonDefault',
label: 'Điền trước lý do đề xuất xóa (PROD)',
type: 'string'
},
{
name: 'logProdPages',
label: 'Giữ nhật trình ở không gian người dùng đối với tất cả trang mà bạn gán nhãn theo đề xuất xóa (PROD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật trình không gian người dùng cung cấp một cách tốt để theo dõi tất cả các trang mà bạn gán nhãn đề xuất xóa (PROD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'prodLogPageName',
label: 'Giữ nhật trình không gian người dùng PROD tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký đề xuất xóa (PROD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật chế độ ghi nhật trình không gian người dùng theo đề xuất xóa (PROD).',
type: 'string'
}
]
},
{
title: 'Hồi sửa (revert) và lùi sửa (rollback)',
module: 'rollback',
preferences: [
// TwinkleConfig.autoMenuAfterRollback (bool)
// Option to automatically open the warning menu if the user talk page is opened post-reversion
{
name: 'autoMenuAfterRollback',
label: 'Tự động mở menu cảnh báo Twinkle trên trang thảo luận của người dùng sau khi lùi sửa bằng Twinkle',
helptip: 'Chỉ hoạt động nếu các chức năng tương ứng bên dưới được chọn.',
type: 'boolean'
},
// TwinkleConfig.openTalkPage (array)
// What types of actions that should result in opening of talk page
{
name: 'openTalkPage',
label: 'Mở trang thảo luận người dùng sau các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại' }
},
// TwinkleConfig.openTalkPageOnAutoRevert (bool)
// Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
{
name: 'openTalkPageOnAutoRevert',
label: 'Mở trang thảo luận người dùng khi khôi phục lùi sửa từ các đóng góp người dùng hoặc các thay đổi gần đây',
helptip: 'Khi tính năng này được bật, các tùy chọn mong muốn phải được bật ở cài đặt trước đó để tính năng này hoạt động.',
type: 'boolean'
},
// TwinkleConfig.rollbackInPlace (bool)
//
{
name: 'rollbackInPlace',
label: "Không tải lại trang khi lùi sửa từ các đóng góp hoặc các thay đổi gần đây",
helptip: "Khi tính năng này được bật, Twinkle sẽ không tải lại nguồn cấp dữ liệu các đóng góp hoặc thay đổi gần đây sau khi hồi sửa, cho phép bạn hồi sửa nhiều sửa đổi cùng một lúc.",
type: 'boolean'
},
// TwinkleConfig.markRevertedPagesAsMinor (array)
// What types of actions that should result in marking edit as minor
{
name: 'markRevertedPagesAsMinor',
label: 'Đánh dấu là sửa đổi nhỏ cho các loại đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedPages (array)
// What types of actions that should result in forced addition to watchlist
{
name: 'watchRevertedPages',
label: 'Thêm các trang vào danh sách theo dõi cho các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchRevertedExpiry',
label: 'When reverting a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.offerReasonOnNormalRevert (boolean)
// If to offer a prompt for extra summary reason for normal reverts, default to true
{
name: 'offerReasonOnNormalRevert',
label: 'Nhắc lý do cho các lần lùi sửa bình thường',
helptip: 'Các lùi sửa "bình thường" là những lùi sửa được khôi phục từ liên kết [lùi sửa] nằm ở chính giữa.',
type: 'boolean'
},
{
name: 'confirmOnRollback',
label: 'Yêu cầu một thông báo xác nhận trước khi hồi sửa',
helptip: 'Dành cho những người sử dụng bút hoặc thiết bị cảm ứng và những người thường xuyên thiếu quyết đoán.',
type: 'boolean'
},
{
name: 'confirmOnMobileRollback',
label: 'Require confirmation before reverting (mobile devices only)',
helptip: 'Avoid accidental reversions when on mobile devices.',
type: 'boolean'
},
// TwinkleConfig.showRollbackLinks (array)
// Where Twinkle should show rollback links:
// diff, others, mine, contribs, history, recent
// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
{
name: 'showRollbackLinks',
label: 'Hiển thị liên kết lùi sửa trên các trang này',
type: 'set',
setValues: { diff: 'Các trang khác biệt', others: 'Các trang đóng góp của những người dùng khác', mine: 'Trang đóng góp của tôi', recent: 'Các các trang đặc biệt thay đổi gần đây và các thay đổi liên quan', history: 'Các trang lịch sử' }
}
]
},
{
title: 'Xóa nhanh (CSD)',
module: 'speedy',
preferences: [
{
name: 'speedySelectionStyle',
label: 'Khi nào nên tiếp tục và gán nhãn/xóa trang',
type: 'enum',
enumValues: { buttonClick: 'Khi tôi nhấn nút "Gửi" (hoặc Submit)', radioClick: 'Ngay khi tôi nhấn 1 lựa chọn nào đó' }
},
// TwinkleConfig.watchSpeedyPages (array)
// Whether to add speedy tagged or deleted pages to watchlist
{
name: 'watchSpeedyPages',
label: 'Thêm trang vào danh sách theo dõi khi sử dụng các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
},
// TwinkleConfig.watchSpeedyExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchSpeedyExpiry',
label: 'When tagging a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
// If, when applying speedy template to page, to mark the page as triaged/patrolled (if the page was reached from NewPages)
{
name: 'markSpeedyPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.watchSpeedyUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'watchSpeedyUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
// On what types of speedy deletion notifications shall the user be welcomed
// with a "firstarticle" notice if their talk page has not yet been created.
{
name: 'welcomeUserOnSpeedyDeletionNotification',
label: 'Chào mừng người tạo trang khi thông báo với các tiêu chí này',
helptip: 'Lời chào mừng chỉ được đưa ra nếu người dùng đã được thông báo về việc xóa và chỉ khi trang thảo luận của họ chưa tồn tại. Bản mẫu được dùng là {{firstarticle}}.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
// What types of actions should result in the author of the page being notified of nomination
{
name: 'notifyUserOnSpeedyDeletionNomination',
label: 'Thông báo cho người tạo trang khi gán nhãn với các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.warnUserOnSpeedyDelete (array)
// What types of actions should result in the author of the page being notified of speedy deletion (admin only)
{
name: 'warnUserOnSpeedyDelete',
label: 'Thông báo cho người tạo trang khi xóa theo các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
{
name: 'promptForSpeedyDeletionSummary',
label: 'Cho phép sửa đổi tóm tắt xóa khi xóa theo các tiêu chí này',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
},
// TwinkleConfig.deleteTalkPageOnDelete (boolean)
// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
{
name: 'deleteTalkPageOnDelete',
label: 'Chọn "cũng xóa trang thảo luận" theo mặc định',
adminOnly: true,
type: 'boolean'
},
{
name: 'deleteRedirectsOnDelete',
label: 'Chọn "cũng xóa đổi hướng" theo mặc định',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.deleteSysopDefaultToDelete (boolean)
// Make the CSD screen default to "delete" instead of "tag" (admin only)
{
name: 'deleteSysopDefaultToDelete',
label: 'Mặc định để xóa hẳn thay vì gán nhãn xóa nhanh',
helptip: 'Nếu đã có nhãn tiêu chí xóa nhanh (CSD), Twinkle sẽ luôn mặc định ở chế độ "xóa"',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowWidth',
label: 'Chiều rộng của cửa sổ xóa nhanh (pixel)',
type: 'integer'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowHeight',
label: 'Chiều cao của cửa sổ xóa nhanh (pixel)',
helptip: 'Nếu bạn có một màn hình lớn, bạn có thể muốn tăng giá trị này lên.',
type: 'integer'
},
{
name: 'logSpeedyNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các đề cử theo tiêu chí xóa nhanh (CSD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật ký không gian người dùng cung cấp một cách tốt nhất để theo dõi tất cả các trang đã đề cử theo tiêu chí xóa nhanh (CSD) khi sử dụng Twinkle. Các tập tin được gán nhãn xóa hình (DI) cũng được thêm vào nhật ký này.',
type: 'boolean'
},
{
name: 'speedyLogPageName',
label: 'Giữ nhật trình không gian người dùng theo tiêu chí xóa nhanh (CSD) tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký tiêu chí xóa nhanh (CSD) của mình tại Thành viên:<i>Tên người dùng</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật ký không gian người dùng theo tiêu chí xóa nhanh (CSD).',
type: 'string'
},
{
name: 'noLogOnSpeedyNomination',
label: 'Không tạo mục nhập nhật trình không gian người dùng khi gán nhãn với các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
}
]
},
{
title: 'Gán nhãn',
module: 'tag',
preferences: [
{
name: 'watchTaggedVenues',
label: 'Add page to watchlist when tagging these type of pages',
type: 'set',
setValues: { articles: 'Articles', drafts: 'Drafts', redirects: 'Redirects', files: 'Files' }
},
{
name: 'watchTaggedPages',
label: 'Thêm trang vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchMergeDiscussions',
label: 'Thêm các trang thảo luận vào danh sách theo dõi khi bắt đầu hợp nhất (trộn) thảo luận',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markTaggedPagesAsMinor',
label: 'Đánh dấu việc thêm nhãn là chỉnh sửa nhỏ',
type: 'boolean'
},
{
name: 'markTaggedPagesAsPatrolled',
label: 'Chọn chức năng "đánh dấu trang là đã tuần tra/đã xem xét" theo mặc định',
type: 'boolean'
},
{
name: 'groupByDefault',
label: 'Chọn chức năng hộp "gom nhóm thành {{nhiều vấn đề}}" theo mặc định',
type: 'boolean'
},
{
name: 'tagArticleSortOrder',
label: 'Thứ tự xem mặc định cho các nhãn mục từ',
type: 'enum',
enumValues: { cat: 'Theo thể loại', alpha: 'Theo thứ tự ABC' }
},
{
name: 'customTagList',
label: 'Các nhãn bảo trì mục từ/bản nháp tùy chỉnh để hiển thị',
helptip: "Các nhãn này xuất hiện dưới dạng các tùy chỉnh bổ sung ở cuối danh sách nhãn. Ví dụ: bạn có thể thêm các nhãn bảo trì mới chưa được thêm vào mặc định của Twinkle.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Nhãn'
},
{
name: 'customFileTagList',
label: 'Các nhãn bảo trì tập tin tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho các tập tin.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
},
{
name: 'customRedirectTagList',
label: 'Các nhãn đổi hướng thể loại tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho đổi hướng.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
}
]
},
{
title: 'Hồi âm',
module: 'talkback',
preferences: [
{
name: 'markTalkbackAsMinor',
label: 'Đánh dấu hồi âm là sửa đổi nhỏ',
type: 'boolean'
},
{
name: 'insertTalkbackSignature',
label: 'Chèn chữ ký trong hồi âm',
type: 'boolean'
},
{
name: 'talkbackHeading',
label: 'Phần tiêu đề sử dụng cho các cuộc hồi âm',
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
},
{
name: 'mailHeading',
label: "Phần tiêu đề sử dụng cho các thông báo \"Bạn đã có thư\"",
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
}
]
},
{
title: 'Gỡ liên kết',
module: 'unlink',
preferences: [
// TwinkleConfig.unlinkNamespaces (array)
// In what namespaces unlink should happen, default in 0 (article), 10 (template), 100 (portal), and 118 (draft)
{
name: 'unlinkNamespaces',
label: 'Xóa liên kết khỏi các trang trong các không gian tên này',
helptip: 'Tránh chọn bất kỳ không gian tên thảo luận nào, vì Twinkle có thể kết thúc việc hủy liên kết ở các kho lưu trữ thảo luận (một điều tuyệt đối không).',
type: 'set',
setValues: Twinkle.config.commonSets.namespacesNoSpecial
}
]
},
{
title: 'Cảnh báo người dùng',
module: 'warn',
preferences: [
// TwinkleConfig.defaultWarningGroup (int)
// Which level warning should be the default selected group, default is 1
{
name: 'defaultWarningGroup',
label: 'Mức cảnh báo mặc định',
type: 'enum',
enumValues: {
1: 'Mức 1',
2: 'Mức 2',
3: 'Mức 3',
4: 'Mức 4',
5: 'Mức 4im',
6: 'Thông báo một vấn đề',
7: 'Cảnh báo một vấn đề',
// 8 was used for block templates before #260
9: 'Cảnh báo tùy chỉnh',
10: 'Tất cả bản mẫu cảnh báo',
11: 'Tự chọn mức cảnh báo (1-4)'
}
},
// TwinkleConfig.combinedSingletMenus (boolean)
// if true, show one menu with both single-issue notices and warnings instead of two separately
{
name: 'combinedSingletMenus',
label: 'Thay thế menu hai vấn đề riêng biệt thành một menu kết hợp',
helptip: 'Chọn thông báo một vấn đề hoặc cảnh báo một vấn đề làm mặc định nếu tính năng này được kích hoạt.',
type: 'boolean'
},
// TwinkleConfig.watchWarnings (string)
// Watchlist setting for the page which has been dispatched an warning or notice
{
name: 'watchWarnings',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.oldSelect (boolean)
// if true, use the native select menu rather the select2-based one
{
name: 'oldSelect',
label: 'Sử dụng menu chọn cổ điển không có khả năng tìm kiếm',
type: 'boolean'
},
{
name: 'customWarningList',
label: 'Các bản mẫu cảnh báo tùy chỉnh để hiển thị',
helptip: 'Bạn có thể thêm các bản mẫu riêng lẻ hoặc các trang con người dùng. Cảnh báo tùy chỉnh xuất hiện ở danh mục "Cảnh báo tùy chỉnh" trong hộp thoại cảnh báo.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong danh sách cảnh báo (cũng được sử dụng làm bản tóm tắt chỉnh sửa)'
}
]
},
{
title: 'Chào mừng thành viên',
module: 'welcome',
preferences: [
{
name: 'topWelcomes',
label: 'Đặt nội dung chào mừng phía trên nội dung trang thảo luận của người dùng hiện có',
type: 'boolean'
},
{
name: 'watchWelcomes',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi chào mừng',
helptip: 'Làm như vậy để thêm yếu tố cá nhân của việc chào đón người dùng - bạn sẽ có thể thấy cách họ hoạt động với tư cách là một người mới và có thể giúp họ.',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'insertUsername',
label: 'Thêm tên người dùng của bạn vào mẫu (nếu có)',
helptip: "Một số bản mẫu chào mừng có câu mở đầu như \"Xin chào, tên tôi là <username>. Chào mừng\" .v. Nếu bạn tắt tùy chỉnh này, các bản mẫu này sẽ không hiển thị tên người dùng của bạn theo cách này.",
type: 'boolean'
},
{
name: 'quickWelcomeMode',
label: 'Nhấp vào liên kết "chào mừng" trên một trang khác biệt sửa đổi',
helptip: 'Nếu bạn chọn chào mừng tự động, bản mẫu bạn chỉ định bên dưới sẽ được sử dụng.',
type: 'enum',
enumValues: { auto: 'chào mừng tự động', norm: 'bạn cần chọn một bản mẫu' }
},
{
name: 'quickWelcomeTemplate',
label: 'Bản mẫu để sử dụng khi chào mừng tự động',
helptip: 'Nhập tên của bản mẫu chào mừng, không có dấu ngoặc nhọn. Một liên kết đến mục từ đã cho sẽ được thêm vào.',
type: 'string'
},
{
name: 'customWelcomeList',
label: 'Các bản mẫu chào mừng tùy chỉnh để hiển thị',
helptip: "Bạn có thể thêm các bản mẫu chào mừng khác hoặc các trang con của người dùng là các bản mẫu chào mừng (có tiền tố là \"Thành viên:\"). Đừng quên rằng các bản mẫu này được thay thế trên các trang thảo luận người dùng.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Chào mừng'
},
{
name: 'customWelcomeSignature',
label: 'Tự động ký tên các bản mẫu chào mừng tùy chỉnh',
helptip: 'Nếu các bản mẫu chào mừng tùy chỉnh đã tích hợp chữ ký, hãy tắt tùy chỉnh này.',
type: 'boolean'
}
]
},
{
title: 'XFD (thảo luận xóa)',
module: 'xfd',
preferences: [
{
name: 'logXfdNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các trang mà bạn đề cử thảo luận xóa (XfD)',
helptip: 'Nhật trình không gian người dùng đem đến sự hữu ích khi theo dõi tất cả các trang mà bạn đề cử cho thảo luận xóa (XfD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'xfdLogPageName',
label: 'Giữ nhật trình không gian người dùng thảo luận xóa tại trang con của người dùng này',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký thảo luận xóa (XfD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật trình không gian người dùng thảo luận xóa (XfD)."',
type: 'string'
},
{
name: 'noLogOnXfdNomination',
label: 'Không ghi lại nhật trình không gian người dùng khi đề cử tại nơi này',
type: 'set',
setValues: { afd: 'AfD', tfd: 'TfD', ffd: 'FfD', cfd: 'CfD', cfds: 'CfD/S', mfd: 'MfD', rfd: 'RfD', rm: 'RM' }
},
// TwinkleConfig.xfdWatchPage (string)
// The watchlist setting of the page being nominated for XfD.
{
name: 'xfdWatchPage',
label: 'Thêm trang được đề cử vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchDiscussion (string)
// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
// or the list page for the other processes.
{
name: 'xfdWatchDiscussion',
label: 'Thêm trang thảo luận xóa vào danh sách theo dõi',
helptip: 'Điều này đề cập đến trang con thảo luận (cho AfD và MfD) hoặc trang nhật ký hàng ngày (cho TfD, CfD, RfD và FfD)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchList (string)
// The watchlist setting of the XfD list page, *if* the discussion is on a separate page.
{
name: 'xfdWatchList',
label: 'Thêm trang nhật trình/danh sách hàng ngày vào danh sách theo dõi (nếu có)',
helptip: 'Điều này chỉ áp dụng cho AfD và MfD với các cuộc thảo luận được đưa vào trang nhật trình hàng ngày (đối với AfD) hoặc trang chính MfD (đối với MfD).',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'xfdWatchUser',
label: 'Thêm trang thảo luận người dùng của người đóng góp ban đầu vào danh sách theo dõi (khi thông báo)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchRelated (string)
// The watchlist setting of the target of a redirect being nominated for RfD.
{
name: 'xfdWatchRelated',
label: "Thêm trang đích đổi hướng vào danh sách theo dõi (khi thông báo)",
helptip: 'Điều này chỉ áp dụng cho RfD, khi để lại thông báo trên trang thảo luận về mục tiêu đổi hướng',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markXfdPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét theo đề cử tiêu chí xóa theo thảo luận (AFD) (nếu có thể)',
type: 'boolean'
}
]
},
{
title: 'Hidden',
hidden: true,
preferences: [
// twinklerollback.js: defines how many revision to query maximum, maximum possible is 50, default is 50
{
name: 'revertMaxRevisions',
type: 'integer'
},
// twinklewarn.js: When using the autolevel select option, how many days makes a prior warning stale
// Huggle is three days ([[Special:Diff/918980316]] and [[Special:Diff/919417999]]) while ClueBotNG is two:
// https://github.com/DamianZaremba/cluebotng/blob/4958e25d6874cba01c75f11debd2e511fd5a2ce5/bot/action_functions.php#L62
{
name: 'autolevelStaleDays',
type: 'integer'
},
// How many pages should be queried by deprod and batchdelete/protect/undelete
{
name: 'batchMax',
type: 'integer',
adminOnly: true
},
// How many pages should be processed at a time by deprod and batchdelete/protect/undelete
{
name: 'batchChunks',
type: 'integer',
adminOnly: true
}
]
}
]; // end of Twinkle.config.sections
Twinkle.config.init = function twinkleconfigInit() {
// create the config page at Wikipedia:Twinkle/Preferences
if ((mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').project && mw.config.get('wgTitle') === 'Twinkle/Preferences') &&
mw.config.get('wgAction') === 'view') {
if (!document.getElementById('twinkle-config')) {
return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
}
// set style to nothing to prevent conflict with external css
document.getElementById('twinkle-config').removeAttribute('style');
document.getElementById('twinkle-config-titlebar').removeAttribute('style');
const contentdiv = document.getElementById('twinkle-config-content');
contentdiv.textContent = ''; // clear children
// let user know about possible conflict with skin js/common.js file
// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
if (window.TwinkleConfig || window.FriendlyConfig) {
const contentnotice = document.createElement('div');
contentnotice.className = 'plainlinks twinkle-ombox';
contentnotice.innerHTML =
'<div>' +
'<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/3/38/Imbox_content.png" />' +
'</div>' +
'<div>' +
'<p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
'<p>To do this, you can <a href="' + mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/' + mw.config.get('skin') +
'.js', { action: 'edit' }) + '" target="_blank"><b>edit your personal skin javascript file</b></a> or <a href="' +
mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/common.js', { action: 'edit'}) + '" target="_blank"><b>your common.js file</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
'</div>';
contentdiv.appendChild(contentnotice);
}
// start a table of contents
const toctable = document.createElement('div');
toctable.className = 'toc';
toctable.style.marginLeft = '0.4em';
// create TOC title
const toctitle = document.createElement('div');
toctitle.id = 'toctitle';
const toch2 = document.createElement('h2');
toch2.textContent = 'Nội dung ';
toctitle.appendChild(toch2);
// add TOC show/hide link
const toctoggle = document.createElement('span');
toctoggle.className = 'toctoggle';
toctoggle.appendChild(document.createTextNode('['));
const toctogglelink = document.createElement('a');
toctogglelink.className = 'internal';
toctogglelink.setAttribute('href', '#tw-tocshowhide');
toctogglelink.textContent = 'hide';
toctoggle.appendChild(toctogglelink);
toctoggle.appendChild(document.createTextNode(']'));
toctitle.appendChild(toctoggle);
toctable.appendChild(toctitle);
// create item container: this is what we add stuff to
const tocul = document.createElement('ul');
toctogglelink.addEventListener('click', () => {
const $tocul = $(tocul);
$tocul.toggle();
if ($tocul.find(':visible').length) {
toctogglelink.textContent = 'hide';
} else {
toctogglelink.textContent = 'show';
}
}, false);
toctable.appendChild(tocul);
contentdiv.appendChild(toctable);
const contentform = document.createElement('form');
contentform.setAttribute('action', 'javascript:void(0)'); // was #tw-save - changed to void(0) to work around Chrome issue
contentform.addEventListener('submit', Twinkle.config.save, true);
contentdiv.appendChild(contentform);
const container = document.createElement('table');
container.style.width = '100%';
contentform.appendChild(container);
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // i.e. "continue" in this context
}
// add to TOC
const tocli = document.createElement('li');
tocli.className = 'toclevel-1';
const toca = document.createElement('a');
toca.setAttribute('href', '#' + section.module);
toca.appendChild(document.createTextNode(section.title));
tocli.appendChild(toca);
tocul.appendChild(tocli);
let row = document.createElement('tr');
let cell = document.createElement('td');
cell.setAttribute('colspan', '3');
const heading = document.createElement('h4');
heading.style.borderBottom = '1px solid gray';
heading.style.marginTop = '0.2em';
heading.id = section.module;
heading.appendChild(document.createTextNode(section.title));
cell.appendChild(heading);
row.appendChild(cell);
container.appendChild(row);
let rowcount = 1; // for row banding
// add each of the preferences to the form
$(section.preferences).each((prefkey, pref) => {
if (pref.adminOnly && !Morebits.userIsSysop) {
return true; // i.e. "continue" in this context
}
row = document.createElement('tr');
row.style.marginBottom = '0.2em';
// create odd row banding
if (rowcount++ % 2 === 0) {
row.style.backgroundColor = 'rgba(128, 128, 128, 0.1)';
}
cell = document.createElement('td');
let label, input;
const gotPref = Twinkle.getPref(pref.name);
switch (pref.type) {
case 'boolean': // create a checkbox
cell.setAttribute('colspan', '2');
label = document.createElement('label');
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (gotPref === true) {
input.setAttribute('checked', 'checked');
}
label.appendChild(input);
label.appendChild(document.createTextNode(pref.label));
cell.appendChild(label);
break;
case 'string': // create an input box
case 'integer':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (pref.type === 'integer') {
input.setAttribute('size', 6);
input.setAttribute('type', 'number');
input.setAttribute('step', '1'); // integers only
}
if (gotPref) {
input.setAttribute('value', gotPref);
}
cell.appendChild(input);
break;
case 'enum': // create a combo box
// add label to first column
// note: duplicates the code above, under string/integer
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('select');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
$.each(pref.enumValues, (enumvalue, enumdisplay) => {
const option = document.createElement('option');
option.setAttribute('value', enumvalue);
if ((gotPref === enumvalue) ||
// Hack to convert old boolean watchlist prefs
// to corresponding enums (added in v2.1)
(typeof gotPref === 'boolean' &&
((gotPref && enumvalue === 'yes') ||
(!gotPref && enumvalue === 'no')))) {
option.setAttribute('selected', 'selected');
}
option.appendChild(document.createTextNode(enumdisplay));
input.appendChild(option);
});
cell.appendChild(input);
break;
case 'set': // create a set of check boxes
// add label first of all
cell.setAttribute('colspan', '2');
label = document.createElement('label'); // not really necessary to use a label element here, but we do it for consistency of styling
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
var checkdiv = document.createElement('div');
checkdiv.style.paddingLeft = '1em';
var worker = function(itemkey, itemvalue) {
const checklabel = document.createElement('label');
checklabel.style.marginRight = '0.7em';
checklabel.style.display = 'inline-block';
const check = document.createElement('input');
check.setAttribute('type', 'checkbox');
check.setAttribute('id', pref.name + '_' + itemkey);
check.setAttribute('name', pref.name + '_' + itemkey);
if (gotPref && gotPref.includes(itemkey)) {
check.setAttribute('checked', 'checked');
}
// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
if (pref.name === 'unlinkNamespaces') {
if (gotPref && gotPref.includes(parseInt(itemkey, 10))) {
check.setAttribute('checked', 'checked');
}
}
checklabel.appendChild(check);
checklabel.appendChild(document.createTextNode(itemvalue));
checkdiv.appendChild(checklabel);
};
if (pref.setDisplayOrder) {
// add check boxes according to the given display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
worker(item, pref.setValues[item]);
});
} else {
// add check boxes according to the order it gets fed to us (probably strict alphabetical)
$.each(pref.setValues, worker);
}
cell.appendChild(checkdiv);
break;
case 'customList':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add button to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
var button = document.createElement('button');
button.setAttribute('id', pref.name);
button.setAttribute('name', pref.name);
button.setAttribute('type', 'button');
button.addEventListener('click', Twinkle.config.listDialog.display, false);
// use jQuery data on the button to store the current config value
$(button).data({
value: gotPref,
pref: pref
});
button.appendChild(document.createTextNode('Sửa các mục'));
cell.appendChild(button);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
row.appendChild(cell);
// add help tip
cell = document.createElement('td');
cell.className = 'twinkle-config-helptip';
if (pref.helptip) {
// convert mentions of templates in the helptip to clickable links
cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,
'{{<a href="' + mw.util.getUrl('Template:') + '$1" target="_blank">$1</a>}}');
}
// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
if (pref.type !== 'customList') {
const resetlink = document.createElement('a');
resetlink.setAttribute('href', '#tw-reset');
resetlink.setAttribute('id', 'twinkle-config-reset-' + pref.name);
resetlink.addEventListener('click', Twinkle.config.resetPrefLink, false);
resetlink.style.cssFloat = 'right';
resetlink.style.margin = '0 0.6em';
resetlink.appendChild(document.createTextNode('Thiết lập lại'));
cell.appendChild(resetlink);
}
row.appendChild(cell);
container.appendChild(row);
return true;
});
return true;
});
const footerbox = document.createElement('div');
footerbox.setAttribute('id', 'twinkle-config-buttonpane');
const button = document.createElement('button');
button.setAttribute('id', 'twinkle-config-submit');
button.setAttribute('type', 'submit');
button.appendChild(document.createTextNode('Lưu các thay đổi'));
footerbox.appendChild(button);
const footerspan = document.createElement('span');
footerspan.className = 'plainlinks';
footerspan.style.marginLeft = '2.4em';
footerspan.style.fontSize = '90%';
const footera = document.createElement('a');
footera.setAttribute('href', '#tw-reset-all');
footera.setAttribute('id', 'twinkle-config-resetall');
footera.addEventListener('click', Twinkle.config.resetAllPrefs, false);
footera.appendChild(document.createTextNode('Phục hồi mặc định'));
footerspan.appendChild(footera);
footerbox.appendChild(footerspan);
contentform.appendChild(footerbox);
// since all the section headers exist now, we can try going to the requested anchor
if (window.location.hash) {
const loc = window.location.hash;
window.location.hash = '';
window.location.hash = loc;
}
} else if (mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0 &&
mw.config.get('wgPageName').slice(-3) === '.js') {
const box = document.createElement('div');
// Styled in twinkle.css
box.setAttribute('id', 'twinkle-config-headerbox');
let link;
const scriptPageName = mw.config.get('wgPageName').slice(
mw.config.get('wgPageName').lastIndexOf('/') + 1,
mw.config.get('wgPageName').lastIndexOf('.js')
);
if (scriptPageName === 'twinkleoptions') {
// place "why not try the preference panel" notice
box.setAttribute('class', 'config-twopt-box');
if (mw.config.get('wgArticleId') > 0) { // page exists
box.appendChild(document.createTextNode('Trang này chứa cấu hình Twinkle của bạn. Bạn có thể thay đổi cấu hình ở '));
} else { // page does not exist
box.appendChild(document.createTextNode('Bạn có thể tùy chỉnh Twinkle sao cho phù hợp với sở thích của mình bằng cách sử dụng '));
}
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('hoặc bằng cách chỉnh sửa trang này (nếu bạn biết cách chỉnh sửa).'));
$(box).insertAfter($('#contentSub'));
} else if (['monobook', 'vector', 'vector-2022', 'cologneblue', 'modern', 'timeless', 'minerva', 'common'].includes(scriptPageName)) {
// place "Looking for Twinkle options?" notice
box.setAttribute('class', 'config-userskin-box');
box.appendChild(document.createTextNode('Nếu bạn muốn cài đặt tùy chỉnh Twinkle, bạn có thể sử dụng '));
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('.'));
$(box).insertAfter($('#contentSub'));
}
}
};
// custom list-related stuff
Twinkle.config.listDialog = {};
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow($dlgtable, value, label) {
let $contenttr, $valueInput, $labelInput;
$dlgtable.append(
$contenttr = $('<tr>').append(
$('<td>').append(
$('<button>')
.attr('type', 'button')
.on('click', () => {
$contenttr.remove();
})
.text('Xóa')
),
$('<td>').append(
$valueInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-value')
.css('width', '97%')
),
$('<td>').append(
$labelInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-label')
.css('width', '98%')
)
)
);
if (value) {
$valueInput.val(value);
}
if (label) {
$labelInput.val(label);
}
};
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
const $prefbutton = $(e.target);
const curvalue = $prefbutton.data('value');
const curpref = $prefbutton.data('pref');
const dialog = new Morebits.SimpleWindow(720, 400);
dialog.setTitle(curpref.label);
dialog.setScriptName('Twinkle preferences');
let $dlgtbody;
dialog.setContent(
$('<div>').append(
$('<table>')
.addClass('wikitable')
.css({
margin: '1.4em 1em',
width: 'auto'
})
.append(
$dlgtbody = $('<tbody>').append(
// header row
$('<tr>').append(
$('<th>') // top-left cell
.css('width', '5%'),
$('<th>') // value column header
.css('width', '35%')
.text(curpref.customListValueTitle ? curpref.customListValueTitle : 'Value'),
$('<th>') // label column header
.css('width', '60%')
.text(curpref.customListLabelTitle ? curpref.customListLabelTitle : 'Label')
)
),
$('<tfoot>').append(
$('<tr>').append(
$('<td>')
.attr('colspan', '3')
.append(
$('<button>')
.text('Thêm')
.css('min-width', '8em')
.attr('type', 'button')
.on('click', () => {
Twinkle.config.listDialog.addRow($dlgtbody);
})
)
)
)
),
$('<button>')
.text('Lưu các thay đổi')
.attr('type', 'submit') // so Morebits.SimpleWindow puts the button in the button pane
.on('click', () => {
Twinkle.config.listDialog.save($prefbutton, $dlgtbody);
dialog.close();
}),
$('<button>')
.text('Thiết lập lại')
.attr('type', 'submit')
.on('click', () => {
Twinkle.config.listDialog.reset($prefbutton, $dlgtbody);
}),
$('<button>')
.text('Hủy')
.attr('type', 'submit')
.on('click', () => {
dialog.close();
})
)[0]
);
// content rows
let gotRow = false;
$.each(curvalue, (k, v) => {
gotRow = true;
Twinkle.config.listDialog.addRow($dlgtbody, v.value, v.label);
});
// if there are no values present, add a blank row to start the user off
if (!gotRow) {
Twinkle.config.listDialog.addRow($dlgtbody);
}
dialog.display();
};
// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset($button, $tbody) {
// reset value on button
const curpref = $button.data('pref');
const oldvalue = $button.data('value');
Twinkle.config.resetPref(curpref);
// reset form
$tbody.find('tr').slice(1).remove(); // all rows except the first (header) row
// add the new values
const curvalue = $button.data('value');
$.each(curvalue, (k, v) => {
Twinkle.config.listDialog.addRow($tbody, v.value, v.label);
});
// save the old value
$button.data('value', oldvalue);
};
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave($button, $tbody) {
const result = [];
let current = {};
$tbody.find('input[type="text"]').each((inputkey, input) => {
if ($(input).hasClass('twinkle-config-customlist-value')) {
current = { value: input.value };
} else {
current.label = input.value;
// exclude totally empty rows
if (current.value || current.label) {
result.push(current);
}
}
});
$button.data('value', result);
};
// reset/restore defaults
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
const wantedpref = e.target.id.slice(21); // "twinkle-config-reset-" prefix is stripped
// search tactics
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
let foundit = false;
$(section.preferences).each((prefkey, pref) => {
if (pref.name !== wantedpref) {
return true; // continue
}
Twinkle.config.resetPref(pref);
foundit = true;
return false; // break
});
if (foundit) {
return false; // break
}
});
return false; // stop link from scrolling page
};
Twinkle.config.resetPref = function twinkleconfigResetPref(pref) {
switch (pref.type) {
case 'boolean':
document.getElementById(pref.name).checked = Twinkle.defaultConfig[pref.name];
break;
case 'string':
case 'integer':
case 'enum':
document.getElementById(pref.name).value = Twinkle.defaultConfig[pref.name];
break;
case 'set':
$.each(pref.setValues, (itemkey) => {
if (document.getElementById(pref.name + '_' + itemkey)) {
document.getElementById(pref.name + '_' + itemkey).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
}
});
break;
case 'customList':
$(document.getElementById(pref.name)).data('value', Twinkle.defaultConfig[pref.name]);
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
};
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
// no confirmation message - the user can just refresh/close the page to abort
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
$(section.preferences).each((prefkey, pref) => {
if (!pref.adminOnly || Morebits.userIsSysop) {
Twinkle.config.resetPref(pref);
}
});
return true;
});
return false; // stop link from scrolling page
};
Twinkle.config.save = function twinkleconfigSave(e) {
Morebits.Status.init(document.getElementById('twinkle-config-content'));
const userjs = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').user] + ':' + mw.config.get('wgUserName') + '/twinkleoptions.js';
const wikipediaPage = new Morebits.wiki.Page(userjs, 'Lưu cấu hình vào ' + userjs);
wikipediaPage.setCallbackParameters(e.target);
wikipediaPage.load(Twinkle.config.writePrefs);
return false;
};
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
const form = pageobj.getCallbackParameters();
// this is the object which gets serialized into JSON; only
// preferences that this script knows about are kept
const newConfig = {optionsVersion: 2.1};
// a comparison function is needed later on
// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
// arrays of strings, and arrays of { value, label })
// and it is not very robust: e.g. compare([2], ["2"]) === true, and
// compare({}, {}) === false, but it's good enough for our purposes here
const compare = function(a, b) {
if (Array.isArray(a)) {
if (a.length !== b.length) {
return false;
}
const asort = a.sort(), bsort = b.sort();
for (let i = 0; asort[i]; ++i) {
// comparison of the two properties of custom lists
if ((typeof asort[i] === 'object') && (asort[i].label !== bsort[i].label ||
asort[i].value !== bsort[i].value)) {
return false;
} else if (asort[i].toString() !== bsort[i].toString()) {
return false;
}
}
return true;
}
return a === b;
};
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.adminOnly && !Morebits.userIsSysop) {
return; // i.e. "continue" in this context
}
// reach each of the preferences from the form
$(section.preferences).each((prefkey, pref) => {
let userValue; // = undefined
// only read form values for those prefs that have them
if (!pref.adminOnly || Morebits.userIsSysop) {
if (!section.hidden) {
switch (pref.type) {
case 'boolean': // read from the checkbox
userValue = form[pref.name].checked;
break;
case 'string': // read from the input box or combo box
case 'enum':
userValue = form[pref.name].value;
break;
case 'integer': // read from the input box
userValue = parseInt(form[pref.name].value, 10);
if (isNaN(userValue)) {
Morebits.Status.warn('Đang lưu', 'Giá trị bạn đã đặt cho ' + pref.name + ' (' + pref.value + ') không hợp lệ. Quá trình lưu sẽ tiếp tục, nhưng giá trị dữ liệu không hợp lệ sẽ bị bỏ qua.');
userValue = null;
}
break;
case 'set': // read from the set of check boxes
userValue = [];
if (pref.setDisplayOrder) {
// read only those keys specified in the display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
if (form[pref.name + '_' + item].checked) {
userValue.push(item);
}
});
} else {
// read all the keys in the list of values
$.each(pref.setValues, (itemkey) => {
if (form[pref.name + '_' + itemkey].checked) {
userValue.push(itemkey);
}
});
}
break;
case 'customList': // read from the jQuery data stored on the button object
userValue = $(form[pref.name]).data('value');
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
} else if (Twinkle.prefs) {
// Retain the hidden preferences that may have customised by the user from twinkleoptions.js
// undefined if not set
userValue = Twinkle.prefs[pref.name];
}
}
// only save those preferences that are *different* from the default
if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
newConfig[pref.name] = userValue;
}
});
});
let text =
'// twinkleoptions.js: personal Twinkle preferences file\n' +
'//\n' +
'// NOTE: The easiest way to change your Twinkle preferences is by using the\n' +
'// Twinkle preferences panel, at [[' + Morebits.pageNameNorm + ']].\n' +
'//\n' +
'// This file is AUTOMATICALLY GENERATED. Any changes you make (aside from\n' +
'// changing the configuration parameters in a valid-JavaScript way) will be\n' +
'// overwritten the next time you click "save" in the Twinkle preferences\n' +
'// panel. If modifying this file, make sure to use correct JavaScript.\n' +
// eslint-disable-next-line no-useless-concat
'// <no' + 'wiki>\n' +
'\n' +
'window.Twinkle.prefs = ';
text += JSON.stringify(newConfig, null, 2);
text +=
';\n' +
'\n' +
// eslint-disable-next-line no-useless-concat
'// </no' + 'wiki>\n' +
'// End of twinkleoptions.js\n';
pageobj.setPageText(text);
pageobj.setEditSummary('Lưu cấu hình Twinkle: chỉnh sửa tự động từ [[:' + Morebits.pageNameNorm + ']]');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('recreate');
pageobj.save(Twinkle.config.saveSuccess);
};
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
pageobj.getStatusElement().info('successful');
const noticebox = document.createElement('div');
noticebox.className = 'cdx-message cdx-message--success';
noticebox.style.fontSize = '100%';
noticebox.innerHTML = '<p><b>Các cấu hình Twinkle của bạn đã được lưu lại.</b> Để xem các thay đổi, bạn sẽ cần xóa hoàn toàn bộ đệm trình duyệt (xem <a href="' + mw.util.getUrl('WP:BYPASS') + '" title="WP:BYPASS">WP:BYPASS</a> để có các chỉ dẫn chi tiết).</p>';
mw.loader.using('mediawiki.htmlform.codex.styles', () => {
Morebits.Status.root.appendChild(noticebox);
});
const noticeclear = document.createElement('br');
noticeclear.style.clear = 'both';
Morebits.Status.root.appendChild(noticeclear);
};
Twinkle.addInitCallback(Twinkle.config.init);
}());
// </nowiki>
az25lhn3hg79kqicoqliync5kso63ty
2353453
2353451
2026-05-15T04:58:15Z
Kateru Zakuro
34522
2353453
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinkleconfig.js: Preferences module
****************************************
* Mode of invocation: Adds configuration form to Wikipedia:Twinkle/Preferences,
and adds an ad box to the top of user subpages belonging to the
currently logged-in user which end in '.js'
* Active on: What I just said. Yeah.
*/
Twinkle.config = {};
Twinkle.config.watchlistEnums = {
yes: 'Thêm vào danh sách theo dõi',
no: "Không thêm vào danh sách theo dõi",
default: 'Thực hiện theo các tùy chỉnh trang của bạn',
'1 week': 'Watch for 1 week',
'1 month': 'Watch for 1 month',
'3 months': 'Watch for 3 months',
'6 months': 'Watch for 6 months'
};
Twinkle.config.commonSets = {
csdCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
csdCriteriaNotification: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
},
csdAndImageDeletionCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3', dh4: 'ĐH4',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
namespacesNoSpecial: {
0: 'Entry',
1: 'Talk (entry)',
2: 'User',
3: 'User talk',
4: 'Wiktionary',
5: 'Wiktionary talk',
6: 'File',
7: 'File talk',
8: 'MediaWiki',
9: 'MediaWiki talk',
10: 'Template',
11: 'Template talk',
12: 'Help',
13: 'Help talk',
14: 'Category',
15: 'Category talk',
100: 'Appendix',
101: 'Appendix talk',
710: 'TimedText',
711: 'TimedText talk',
828: 'Module',
829: 'Module talk'
}
};
Twinkle.config.commonSets.csdCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteria );
Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteriaNotification );
Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdAndImageDeletionCriteria );
/**
* Section entry format:
*
* {
* title: <human-readable section title>,
* module: <name of the associated module, used to link to sections>,
* adminOnly: <true for admin-only sections>,
* hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
* preferences: [
* {
* name: <TwinkleConfig property name>,
* label: <human-readable short description - used as a form label>,
* helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
* adminOnly: <true for admin-only preferences>,
* type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
* enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
* customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
* customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
* },
* . . .
* ]
* },
* . . .
*
*/
Twinkle.config.sections = [
{
title: 'Chung',
module: 'general',
preferences: [
// TwinkleConfig.userTalkPageMode may take arguments:
// 'window': open a new window, remember the opened window
// 'tab': opens in a new tab, if possible.
// 'blank': force open in a new window, even if such a window exists
{
name: 'userTalkPageMode',
label: 'Khi mở một trang thảo luận của người dùng, hãy mở trang đó',
type: 'enum',
enumValues: { window: 'Trong một cửa sổ, thay thế các cuộc thảo luận của người dùng khác', tab: 'Trong một tab mới', blank: 'Trong một cửa sổ hoàn toàn mới' }
},
// TwinkleConfig.dialogLargeFont (boolean)
{
name: 'dialogLargeFont',
label: 'Sử dụng văn bản có kích thước lớn hơn trong hộp thoại Twinkle',
type: 'boolean'
},
// Twinkle.config.disabledModules (array)
{
name: 'disabledModules',
label: 'Tắt các mô đun Twinkle đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy hành động cẩn thận. Bỏ chọn để kích hoạt lại.',
type: 'set',
setValues: { arv: 'Báo cáo phá hoại', warn: 'Cảnh báo', welcome: 'Chào mừng thành viên', talkback: 'Hồi âm', speedy: 'Xóa nhanh', prod: 'Đề nghị xóa', xfd: 'Thảo luận xóa', image: 'Đề nghị xóa hình', protect: 'Khóa trang', tag: 'Gắn bảng bảo trì', diff: 'Khác biệt phiên bản', unlink: 'Gỡ liên kết', rollback: 'Lùi sửa và hồi sửa' }
},
// Twinkle.config.disabledSysopModules (array)
{
name: 'disabledSysopModules',
label: 'Tắt các mô-đun chỉ dành cho quản trị viên đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy thao tác cẩn thận. Bỏ chọn để kích hoạt lại.',
adminOnly: true,
type: 'set',
setValues: { block: 'Cấm (Block)', deprod: 'Xóa hàng loạt theo đề xuất (DePROD)', batchdelete: 'Xóa hàng loạt theo thể loại (D-batch)', batchprotect: 'Khóa/mở khóa hàng loạt (P-batch)', batchundelete: 'Phục hồi xóa hàng loạt (Und-batch)' }
}
]
},
{
title: 'ARV',
module: 'arv',
preferences: [
{
name: 'spiWatchReport',
label: 'Thêm các trang báo cáo sockpuppet (rối) vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Cấm người dùng',
module: 'block',
adminOnly: true,
preferences: [
// TwinkleConfig.defaultToBlock64 (boolean)
// Whether to default to just blocking the /64 on or off
{
name: 'defaultToBlock64',
label: 'For IPv6 addresses, select the option to block the /64 range by default',
type: 'boolean'
},
// TwinkleConfig.defaultToPartialBlocks (boolean)
// Whether to default partial blocks on or off
{
name: 'defaultToPartialBlocks',
label: 'Chọn các cấm một phần theo mặc định khi mở menu cấm',
helptip: 'If the user is already blocked, this will be overridden in favor of defaulting to the current block type',
type: 'boolean'
},
// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
// if true, blank the talk page when issuing an indef block notice (per [[WP:UWUL#Indefinitely blocked users]])
{
name: 'blankTalkpageOnIndefBlock',
label: 'Làm trống trang thảo luận khi cấm vô hạn thành viên',
helptip: 'Xem <a href="' + mw.util.getUrl('Wikipedia:WikiProject_User_warnings/Usage_and_layout#Indefinitely_blocked_users') + '">WP:UWUL</a> để có thêm thông tin.',
type: 'boolean'
}
]
},
{
title: 'Xóa hình ảnh (image deletion - DI)',
module: 'image',
preferences: [
// TwinkleConfig.notifyUserOnDeli (boolean)
// If the user should be notified after placing a file deletion tag
{
name: 'notifyUserOnDeli',
label: 'Kiểm tra hộp "thông báo cho người tải lên đầu tiên" theo mặc định',
type: 'boolean'
},
// TwinkleConfig.deliWatchPage (string)
// The watchlist setting of the page tagged for deletion.
{
name: 'deliWatchPage',
label: 'Thêm hình trang hình ảnh vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.deliWatchUser (string)
// The watchlist setting of the user talk page if a notification is placed.
{
name: 'deliWatchUser',
label: 'Thêm trang thảo luận của người dùng tải lên đầu tiên vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Page protection ' + (Morebits.userIsSysop ? '(PP)' : '(RPP)'),
module: 'protect',
preferences: [
{
name: 'watchRequestedPages',
label: 'Add page to watchlist when requesting protection',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchPPTaggedPages',
label: 'Add page to watchlist when tagging with protection template',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchProtectedPages',
label: 'Add page to watchlist when protecting',
helptip: 'If also tagging the page after protection, that preference will be favored.',
adminOnly: true,
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Đề nghị xóa (PROD)',
module: 'prod',
preferences: [
// TwinkleConfig.watchProdPages (string)
// Watchlist setting when applying prod template to page
{
name: 'watchProdPages',
label: 'Thêm mục từ vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markProdPagesAsPatrolled (boolean)
// If, when applying prod template to page, to mark the page as curated/patrolled (if the page was reached from NewPages)
{
name: 'markProdPagesAsPatrolled',
label: 'Đánh dấu trang đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.prodReasonDefault (string)
// The prefilled PROD reason.
{
name: 'prodReasonDefault',
label: 'Điền trước lý do đề xuất xóa (PROD)',
type: 'string'
},
{
name: 'logProdPages',
label: 'Giữ nhật trình ở không gian người dùng đối với tất cả trang mà bạn gán nhãn theo đề xuất xóa (PROD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật trình không gian người dùng cung cấp một cách tốt để theo dõi tất cả các trang mà bạn gán nhãn đề xuất xóa (PROD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'prodLogPageName',
label: 'Giữ nhật trình không gian người dùng PROD tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký đề xuất xóa (PROD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật chế độ ghi nhật trình không gian người dùng theo đề xuất xóa (PROD).',
type: 'string'
}
]
},
{
title: 'Hồi sửa (revert) và lùi sửa (rollback)',
module: 'rollback',
preferences: [
// TwinkleConfig.autoMenuAfterRollback (bool)
// Option to automatically open the warning menu if the user talk page is opened post-reversion
{
name: 'autoMenuAfterRollback',
label: 'Tự động mở menu cảnh báo Twinkle trên trang thảo luận của người dùng sau khi lùi sửa bằng Twinkle',
helptip: 'Chỉ hoạt động nếu các chức năng tương ứng bên dưới được chọn.',
type: 'boolean'
},
// TwinkleConfig.openTalkPage (array)
// What types of actions that should result in opening of talk page
{
name: 'openTalkPage',
label: 'Mở trang thảo luận người dùng sau các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại' }
},
// TwinkleConfig.openTalkPageOnAutoRevert (bool)
// Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
{
name: 'openTalkPageOnAutoRevert',
label: 'Mở trang thảo luận người dùng khi khôi phục lùi sửa từ các đóng góp người dùng hoặc các thay đổi gần đây',
helptip: 'Khi tính năng này được bật, các tùy chọn mong muốn phải được bật ở cài đặt trước đó để tính năng này hoạt động.',
type: 'boolean'
},
// TwinkleConfig.rollbackInPlace (bool)
//
{
name: 'rollbackInPlace',
label: "Không tải lại trang khi lùi sửa từ các đóng góp hoặc các thay đổi gần đây",
helptip: "Khi tính năng này được bật, Twinkle sẽ không tải lại nguồn cấp dữ liệu các đóng góp hoặc thay đổi gần đây sau khi hồi sửa, cho phép bạn hồi sửa nhiều sửa đổi cùng một lúc.",
type: 'boolean'
},
// TwinkleConfig.markRevertedPagesAsMinor (array)
// What types of actions that should result in marking edit as minor
{
name: 'markRevertedPagesAsMinor',
label: 'Đánh dấu là sửa đổi nhỏ cho các loại đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedPages (array)
// What types of actions that should result in forced addition to watchlist
{
name: 'watchRevertedPages',
label: 'Thêm các trang vào danh sách theo dõi cho các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchRevertedExpiry',
label: 'When reverting a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.offerReasonOnNormalRevert (boolean)
// If to offer a prompt for extra summary reason for normal reverts, default to true
{
name: 'offerReasonOnNormalRevert',
label: 'Nhắc lý do cho các lần lùi sửa bình thường',
helptip: 'Các lùi sửa "bình thường" là những lùi sửa được khôi phục từ liên kết [lùi sửa] nằm ở chính giữa.',
type: 'boolean'
},
{
name: 'confirmOnRollback',
label: 'Yêu cầu một thông báo xác nhận trước khi hồi sửa',
helptip: 'Dành cho những người sử dụng bút hoặc thiết bị cảm ứng và những người thường xuyên thiếu quyết đoán.',
type: 'boolean'
},
{
name: 'confirmOnMobileRollback',
label: 'Require confirmation before reverting (mobile devices only)',
helptip: 'Avoid accidental reversions when on mobile devices.',
type: 'boolean'
},
// TwinkleConfig.showRollbackLinks (array)
// Where Twinkle should show rollback links:
// diff, others, mine, contribs, history, recent
// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
{
name: 'showRollbackLinks',
label: 'Hiển thị liên kết lùi sửa trên các trang này',
type: 'set',
setValues: { diff: 'Các trang khác biệt', others: 'Các trang đóng góp của những người dùng khác', mine: 'Trang đóng góp của tôi', recent: 'Các các trang đặc biệt thay đổi gần đây và các thay đổi liên quan', history: 'Các trang lịch sử' }
}
]
},
{
title: 'Xóa nhanh (CSD)',
module: 'speedy',
preferences: [
{
name: 'speedySelectionStyle',
label: 'Khi nào nên tiếp tục và gán nhãn/xóa trang',
type: 'enum',
enumValues: { buttonClick: 'Khi tôi nhấn nút "Gửi" (hoặc Submit)', radioClick: 'Ngay khi tôi nhấn 1 lựa chọn nào đó' }
},
// TwinkleConfig.watchSpeedyPages (array)
// Whether to add speedy tagged or deleted pages to watchlist
{
name: 'watchSpeedyPages',
label: 'Thêm trang vào danh sách theo dõi khi sử dụng các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
},
// TwinkleConfig.watchSpeedyExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchSpeedyExpiry',
label: 'When tagging a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
// If, when applying speedy template to page, to mark the page as triaged/patrolled (if the page was reached from NewPages)
{
name: 'markSpeedyPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.watchSpeedyUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'watchSpeedyUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
// On what types of speedy deletion notifications shall the user be welcomed
// with a "firstarticle" notice if their talk page has not yet been created.
{
name: 'welcomeUserOnSpeedyDeletionNotification',
label: 'Chào mừng người tạo trang khi thông báo với các tiêu chí này',
helptip: 'Lời chào mừng chỉ được đưa ra nếu người dùng đã được thông báo về việc xóa và chỉ khi trang thảo luận của họ chưa tồn tại. Bản mẫu được dùng là {{firstarticle}}.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
// What types of actions should result in the author of the page being notified of nomination
{
name: 'notifyUserOnSpeedyDeletionNomination',
label: 'Thông báo cho người tạo trang khi gán nhãn với các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.warnUserOnSpeedyDelete (array)
// What types of actions should result in the author of the page being notified of speedy deletion (admin only)
{
name: 'warnUserOnSpeedyDelete',
label: 'Thông báo cho người tạo trang khi xóa theo các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
{
name: 'promptForSpeedyDeletionSummary',
label: 'Cho phép sửa đổi tóm tắt xóa khi xóa theo các tiêu chí này',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
},
// TwinkleConfig.deleteTalkPageOnDelete (boolean)
// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
{
name: 'deleteTalkPageOnDelete',
label: 'Chọn "cũng xóa trang thảo luận" theo mặc định',
adminOnly: true,
type: 'boolean'
},
{
name: 'deleteRedirectsOnDelete',
label: 'Chọn "cũng xóa đổi hướng" theo mặc định',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.deleteSysopDefaultToDelete (boolean)
// Make the CSD screen default to "delete" instead of "tag" (admin only)
{
name: 'deleteSysopDefaultToDelete',
label: 'Mặc định để xóa hẳn thay vì gán nhãn xóa nhanh',
helptip: 'Nếu đã có nhãn tiêu chí xóa nhanh (CSD), Twinkle sẽ luôn mặc định ở chế độ "xóa"',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowWidth',
label: 'Chiều rộng của cửa sổ xóa nhanh (pixel)',
type: 'integer'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowHeight',
label: 'Chiều cao của cửa sổ xóa nhanh (pixel)',
helptip: 'Nếu bạn có một màn hình lớn, bạn có thể muốn tăng giá trị này lên.',
type: 'integer'
},
{
name: 'logSpeedyNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các đề cử theo tiêu chí xóa nhanh (CSD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật ký không gian người dùng cung cấp một cách tốt nhất để theo dõi tất cả các trang đã đề cử theo tiêu chí xóa nhanh (CSD) khi sử dụng Twinkle. Các tập tin được gán nhãn xóa hình (DI) cũng được thêm vào nhật ký này.',
type: 'boolean'
},
{
name: 'speedyLogPageName',
label: 'Giữ nhật trình không gian người dùng theo tiêu chí xóa nhanh (CSD) tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký tiêu chí xóa nhanh (CSD) của mình tại Thành viên:<i>Tên người dùng</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật ký không gian người dùng theo tiêu chí xóa nhanh (CSD).',
type: 'string'
},
{
name: 'noLogOnSpeedyNomination',
label: 'Không tạo mục nhập nhật trình không gian người dùng khi gán nhãn với các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
}
]
},
{
title: 'Gán nhãn',
module: 'tag',
preferences: [
{
name: 'watchTaggedVenues',
label: 'Add page to watchlist when tagging these type of pages',
type: 'set',
setValues: { articles: 'Articles', drafts: 'Drafts', redirects: 'Redirects', files: 'Files' }
},
{
name: 'watchTaggedPages',
label: 'Thêm trang vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchMergeDiscussions',
label: 'Thêm các trang thảo luận vào danh sách theo dõi khi bắt đầu hợp nhất (trộn) thảo luận',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markTaggedPagesAsMinor',
label: 'Đánh dấu việc thêm nhãn là chỉnh sửa nhỏ',
type: 'boolean'
},
{
name: 'markTaggedPagesAsPatrolled',
label: 'Chọn chức năng "đánh dấu trang là đã tuần tra/đã xem xét" theo mặc định',
type: 'boolean'
},
{
name: 'groupByDefault',
label: 'Chọn chức năng hộp "gom nhóm thành {{nhiều vấn đề}}" theo mặc định',
type: 'boolean'
},
{
name: 'tagArticleSortOrder',
label: 'Thứ tự xem mặc định cho các nhãn mục từ',
type: 'enum',
enumValues: { cat: 'Theo thể loại', alpha: 'Theo thứ tự ABC' }
},
{
name: 'customTagList',
label: 'Các nhãn bảo trì mục từ/bản nháp tùy chỉnh để hiển thị',
helptip: "Các nhãn này xuất hiện dưới dạng các tùy chỉnh bổ sung ở cuối danh sách nhãn. Ví dụ: bạn có thể thêm các nhãn bảo trì mới chưa được thêm vào mặc định của Twinkle.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Nhãn'
},
{
name: 'customFileTagList',
label: 'Các nhãn bảo trì tập tin tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho các tập tin.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
},
{
name: 'customRedirectTagList',
label: 'Các nhãn đổi hướng thể loại tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho đổi hướng.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
}
]
},
{
title: 'Hồi âm',
module: 'talkback',
preferences: [
{
name: 'markTalkbackAsMinor',
label: 'Đánh dấu hồi âm là sửa đổi nhỏ',
type: 'boolean'
},
{
name: 'insertTalkbackSignature',
label: 'Chèn chữ ký trong hồi âm',
type: 'boolean'
},
{
name: 'talkbackHeading',
label: 'Phần tiêu đề sử dụng cho các cuộc hồi âm',
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
},
{
name: 'mailHeading',
label: "Phần tiêu đề sử dụng cho các thông báo \"Bạn đã có thư\"",
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
}
]
},
{
title: 'Gỡ liên kết',
module: 'unlink',
preferences: [
// TwinkleConfig.unlinkNamespaces (array)
// In what namespaces unlink should happen, default in 0 (article), 10 (template), 100 (portal), and 118 (draft)
{
name: 'unlinkNamespaces',
label: 'Xóa liên kết khỏi các trang trong các không gian tên này',
helptip: 'Tránh chọn bất kỳ không gian tên thảo luận nào, vì Twinkle có thể kết thúc việc hủy liên kết ở các kho lưu trữ thảo luận (một điều tuyệt đối không).',
type: 'set',
setValues: Twinkle.config.commonSets.namespacesNoSpecial
}
]
},
{
title: 'Cảnh báo người dùng',
module: 'warn',
preferences: [
// TwinkleConfig.defaultWarningGroup (int)
// Which level warning should be the default selected group, default is 1
{
name: 'defaultWarningGroup',
label: 'Mức cảnh báo mặc định',
type: 'enum',
enumValues: {
1: 'Mức 1',
2: 'Mức 2',
3: 'Mức 3',
4: 'Mức 4',
5: 'Mức 4im',
6: 'Thông báo một vấn đề',
7: 'Cảnh báo một vấn đề',
// 8 was used for block templates before #260
9: 'Cảnh báo tùy chỉnh',
10: 'Tất cả bản mẫu cảnh báo',
11: 'Tự chọn mức cảnh báo (1-4)'
}
},
// TwinkleConfig.combinedSingletMenus (boolean)
// if true, show one menu with both single-issue notices and warnings instead of two separately
{
name: 'combinedSingletMenus',
label: 'Thay thế menu hai vấn đề riêng biệt thành một menu kết hợp',
helptip: 'Chọn thông báo một vấn đề hoặc cảnh báo một vấn đề làm mặc định nếu tính năng này được kích hoạt.',
type: 'boolean'
},
// TwinkleConfig.watchWarnings (string)
// Watchlist setting for the page which has been dispatched an warning or notice
{
name: 'watchWarnings',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.oldSelect (boolean)
// if true, use the native select menu rather the select2-based one
{
name: 'oldSelect',
label: 'Sử dụng menu chọn cổ điển không có khả năng tìm kiếm',
type: 'boolean'
},
{
name: 'customWarningList',
label: 'Các bản mẫu cảnh báo tùy chỉnh để hiển thị',
helptip: 'Bạn có thể thêm các bản mẫu riêng lẻ hoặc các trang con người dùng. Cảnh báo tùy chỉnh xuất hiện ở danh mục "Cảnh báo tùy chỉnh" trong hộp thoại cảnh báo.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong danh sách cảnh báo (cũng được sử dụng làm bản tóm tắt chỉnh sửa)'
}
]
},
{
title: 'Chào mừng thành viên',
module: 'welcome',
preferences: [
{
name: 'topWelcomes',
label: 'Đặt nội dung chào mừng phía trên nội dung trang thảo luận của người dùng hiện có',
type: 'boolean'
},
{
name: 'watchWelcomes',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi chào mừng',
helptip: 'Làm như vậy để thêm yếu tố cá nhân của việc chào đón người dùng - bạn sẽ có thể thấy cách họ hoạt động với tư cách là một người mới và có thể giúp họ.',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'insertUsername',
label: 'Thêm tên người dùng của bạn vào mẫu (nếu có)',
helptip: "Một số bản mẫu chào mừng có câu mở đầu như \"Xin chào, tên tôi là <username>. Chào mừng\" .v. Nếu bạn tắt tùy chỉnh này, các bản mẫu này sẽ không hiển thị tên người dùng của bạn theo cách này.",
type: 'boolean'
},
{
name: 'quickWelcomeMode',
label: 'Nhấp vào liên kết "chào mừng" trên một trang khác biệt sửa đổi',
helptip: 'Nếu bạn chọn chào mừng tự động, bản mẫu bạn chỉ định bên dưới sẽ được sử dụng.',
type: 'enum',
enumValues: { auto: 'chào mừng tự động', norm: 'bạn cần chọn một bản mẫu' }
},
{
name: 'quickWelcomeTemplate',
label: 'Bản mẫu để sử dụng khi chào mừng tự động',
helptip: 'Nhập tên của bản mẫu chào mừng, không có dấu ngoặc nhọn. Một liên kết đến mục từ đã cho sẽ được thêm vào.',
type: 'string'
},
{
name: 'customWelcomeList',
label: 'Các bản mẫu chào mừng tùy chỉnh để hiển thị',
helptip: "Bạn có thể thêm các bản mẫu chào mừng khác hoặc các trang con của người dùng là các bản mẫu chào mừng (có tiền tố là \"Thành viên:\"). Đừng quên rằng các bản mẫu này được thay thế trên các trang thảo luận người dùng.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Chào mừng'
},
{
name: 'customWelcomeSignature',
label: 'Tự động ký tên các bản mẫu chào mừng tùy chỉnh',
helptip: 'Nếu các bản mẫu chào mừng tùy chỉnh đã tích hợp chữ ký, hãy tắt tùy chỉnh này.',
type: 'boolean'
}
]
},
{
title: 'XFD (thảo luận xóa)',
module: 'xfd',
preferences: [
{
name: 'logXfdNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các trang mà bạn đề cử thảo luận xóa (XfD)',
helptip: 'Nhật trình không gian người dùng đem đến sự hữu ích khi theo dõi tất cả các trang mà bạn đề cử cho thảo luận xóa (XfD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'xfdLogPageName',
label: 'Giữ nhật trình không gian người dùng thảo luận xóa tại trang con của người dùng này',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký thảo luận xóa (XfD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật trình không gian người dùng thảo luận xóa (XfD)."',
type: 'string'
},
{
name: 'noLogOnXfdNomination',
label: 'Không ghi lại nhật trình không gian người dùng khi đề cử tại nơi này',
type: 'set',
setValues: { afd: 'AfD', tfd: 'TfD', ffd: 'FfD', cfd: 'CfD', cfds: 'CfD/S', mfd: 'MfD', rfd: 'RfD', rm: 'RM' }
},
// TwinkleConfig.xfdWatchPage (string)
// The watchlist setting of the page being nominated for XfD.
{
name: 'xfdWatchPage',
label: 'Thêm trang được đề cử vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchDiscussion (string)
// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
// or the list page for the other processes.
{
name: 'xfdWatchDiscussion',
label: 'Thêm trang thảo luận xóa vào danh sách theo dõi',
helptip: 'Điều này đề cập đến trang con thảo luận (cho AfD và MfD) hoặc trang nhật ký hàng ngày (cho TfD, CfD, RfD và FfD)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchList (string)
// The watchlist setting of the XfD list page, *if* the discussion is on a separate page.
{
name: 'xfdWatchList',
label: 'Thêm trang nhật trình/danh sách hàng ngày vào danh sách theo dõi (nếu có)',
helptip: 'Điều này chỉ áp dụng cho AfD và MfD với các cuộc thảo luận được đưa vào trang nhật trình hàng ngày (đối với AfD) hoặc trang chính MfD (đối với MfD).',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'xfdWatchUser',
label: 'Thêm trang thảo luận người dùng của người đóng góp ban đầu vào danh sách theo dõi (khi thông báo)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchRelated (string)
// The watchlist setting of the target of a redirect being nominated for RfD.
{
name: 'xfdWatchRelated',
label: "Thêm trang đích đổi hướng vào danh sách theo dõi (khi thông báo)",
helptip: 'Điều này chỉ áp dụng cho RfD, khi để lại thông báo trên trang thảo luận về mục tiêu đổi hướng',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markXfdPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét theo đề cử tiêu chí xóa theo thảo luận (AFD) (nếu có thể)',
type: 'boolean'
}
]
},
{
title: 'Hidden',
hidden: true,
preferences: [
// twinklerollback.js: defines how many revision to query maximum, maximum possible is 50, default is 50
{
name: 'revertMaxRevisions',
type: 'integer'
},
// twinklewarn.js: When using the autolevel select option, how many days makes a prior warning stale
// Huggle is three days ([[Special:Diff/918980316]] and [[Special:Diff/919417999]]) while ClueBotNG is two:
// https://github.com/DamianZaremba/cluebotng/blob/4958e25d6874cba01c75f11debd2e511fd5a2ce5/bot/action_functions.php#L62
{
name: 'autolevelStaleDays',
type: 'integer'
},
// How many pages should be queried by deprod and batchdelete/protect/undelete
{
name: 'batchMax',
type: 'integer',
adminOnly: true
},
// How many pages should be processed at a time by deprod and batchdelete/protect/undelete
{
name: 'batchChunks',
type: 'integer',
adminOnly: true
}
]
}
]; // end of Twinkle.config.sections
Twinkle.config.init = function twinkleconfigInit() {
// create the config page at Wikipedia:Twinkle/Preferences
if ((mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').project && mw.config.get('wgTitle') === 'Twinkle/Preferences') &&
mw.config.get('wgAction') === 'view') {
if (!document.getElementById('twinkle-config')) {
return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
}
// set style to nothing to prevent conflict with external css
document.getElementById('twinkle-config').removeAttribute('style');
document.getElementById('twinkle-config-titlebar').removeAttribute('style');
const contentdiv = document.getElementById('twinkle-config-content');
contentdiv.textContent = ''; // clear children
// let user know about possible conflict with skin js/common.js file
// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
if (window.TwinkleConfig || window.FriendlyConfig) {
const contentnotice = document.createElement('div');
contentnotice.className = 'plainlinks twinkle-ombox';
contentnotice.innerHTML =
'<div>' +
'<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/3/38/Imbox_content.png" />' +
'</div>' +
'<div>' +
'<p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
'<p>To do this, you can <a href="' + mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/' + mw.config.get('skin') +
'.js', { action: 'edit' }) + '" target="_blank"><b>edit your personal skin javascript file</b></a> or <a href="' +
mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/common.js', { action: 'edit'}) + '" target="_blank"><b>your common.js file</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
'</div>';
contentdiv.appendChild(contentnotice);
}
// start a table of contents
const toctable = document.createElement('div');
toctable.className = 'toc';
toctable.style.marginLeft = '0.4em';
// create TOC title
const toctitle = document.createElement('div');
toctitle.id = 'toctitle';
const toch2 = document.createElement('h2');
toch2.textContent = 'Nội dung ';
toctitle.appendChild(toch2);
// add TOC show/hide link
const toctoggle = document.createElement('span');
toctoggle.className = 'toctoggle';
toctoggle.appendChild(document.createTextNode('['));
const toctogglelink = document.createElement('a');
toctogglelink.className = 'internal';
toctogglelink.setAttribute('href', '#tw-tocshowhide');
toctogglelink.textContent = 'hide';
toctoggle.appendChild(toctogglelink);
toctoggle.appendChild(document.createTextNode(']'));
toctitle.appendChild(toctoggle);
toctable.appendChild(toctitle);
// create item container: this is what we add stuff to
const tocul = document.createElement('ul');
toctogglelink.addEventListener('click', () => {
const $tocul = $(tocul);
$tocul.toggle();
if ($tocul.find(':visible').length) {
toctogglelink.textContent = 'hide';
} else {
toctogglelink.textContent = 'show';
}
}, false);
toctable.appendChild(tocul);
contentdiv.appendChild(toctable);
const contentform = document.createElement('form');
contentform.setAttribute('action', 'javascript:void(0)'); // was #tw-save - changed to void(0) to work around Chrome issue
contentform.addEventListener('submit', Twinkle.config.save, true);
contentdiv.appendChild(contentform);
const container = document.createElement('table');
container.style.width = '100%';
contentform.appendChild(container);
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // i.e. "continue" in this context
}
// add to TOC
const tocli = document.createElement('li');
tocli.className = 'toclevel-1';
const toca = document.createElement('a');
toca.setAttribute('href', '#' + section.module);
toca.appendChild(document.createTextNode(section.title));
tocli.appendChild(toca);
tocul.appendChild(tocli);
let row = document.createElement('tr');
let cell = document.createElement('td');
cell.setAttribute('colspan', '3');
const heading = document.createElement('h4');
heading.style.borderBottom = '1px solid gray';
heading.style.marginTop = '0.2em';
heading.id = section.module;
heading.appendChild(document.createTextNode(section.title));
cell.appendChild(heading);
row.appendChild(cell);
container.appendChild(row);
let rowcount = 1; // for row banding
// add each of the preferences to the form
$(section.preferences).each((prefkey, pref) => {
if (pref.adminOnly && !Morebits.userIsSysop) {
return true; // i.e. "continue" in this context
}
row = document.createElement('tr');
row.style.marginBottom = '0.2em';
// create odd row banding
if (rowcount++ % 2 === 0) {
row.style.backgroundColor = 'rgba(128, 128, 128, 0.1)';
}
cell = document.createElement('td');
let label, input;
const gotPref = Twinkle.getPref(pref.name);
switch (pref.type) {
case 'boolean': // create a checkbox
cell.setAttribute('colspan', '2');
label = document.createElement('label');
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (gotPref === true) {
input.setAttribute('checked', 'checked');
}
label.appendChild(input);
label.appendChild(document.createTextNode(pref.label));
cell.appendChild(label);
break;
case 'string': // create an input box
case 'integer':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (pref.type === 'integer') {
input.setAttribute('size', 6);
input.setAttribute('type', 'number');
input.setAttribute('step', '1'); // integers only
}
if (gotPref) {
input.setAttribute('value', gotPref);
}
cell.appendChild(input);
break;
case 'enum': // create a combo box
// add label to first column
// note: duplicates the code above, under string/integer
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('select');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
$.each(pref.enumValues, (enumvalue, enumdisplay) => {
const option = document.createElement('option');
option.setAttribute('value', enumvalue);
if ((gotPref === enumvalue) ||
// Hack to convert old boolean watchlist prefs
// to corresponding enums (added in v2.1)
(typeof gotPref === 'boolean' &&
((gotPref && enumvalue === 'yes') ||
(!gotPref && enumvalue === 'no')))) {
option.setAttribute('selected', 'selected');
}
option.appendChild(document.createTextNode(enumdisplay));
input.appendChild(option);
});
cell.appendChild(input);
break;
case 'set': // create a set of check boxes
// add label first of all
cell.setAttribute('colspan', '2');
label = document.createElement('label'); // not really necessary to use a label element here, but we do it for consistency of styling
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
var checkdiv = document.createElement('div');
checkdiv.style.paddingLeft = '1em';
var worker = function(itemkey, itemvalue) {
const checklabel = document.createElement('label');
checklabel.style.marginRight = '0.7em';
checklabel.style.display = 'inline-block';
const check = document.createElement('input');
check.setAttribute('type', 'checkbox');
check.setAttribute('id', pref.name + '_' + itemkey);
check.setAttribute('name', pref.name + '_' + itemkey);
if (gotPref && gotPref.includes(itemkey)) {
check.setAttribute('checked', 'checked');
}
// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
if (pref.name === 'unlinkNamespaces') {
if (gotPref && gotPref.includes(parseInt(itemkey, 10))) {
check.setAttribute('checked', 'checked');
}
}
checklabel.appendChild(check);
checklabel.appendChild(document.createTextNode(itemvalue));
checkdiv.appendChild(checklabel);
};
if (pref.setDisplayOrder) {
// add check boxes according to the given display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
worker(item, pref.setValues[item]);
});
} else {
// add check boxes according to the order it gets fed to us (probably strict alphabetical)
$.each(pref.setValues, worker);
}
cell.appendChild(checkdiv);
break;
case 'customList':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add button to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
var button = document.createElement('button');
button.setAttribute('id', pref.name);
button.setAttribute('name', pref.name);
button.setAttribute('type', 'button');
button.addEventListener('click', Twinkle.config.listDialog.display, false);
// use jQuery data on the button to store the current config value
$(button).data({
value: gotPref,
pref: pref
});
button.appendChild(document.createTextNode('Sửa các mục'));
cell.appendChild(button);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
row.appendChild(cell);
// add help tip
cell = document.createElement('td');
cell.className = 'twinkle-config-helptip';
if (pref.helptip) {
// convert mentions of templates in the helptip to clickable links
cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,
'{{<a href="' + mw.util.getUrl('Template:') + '$1" target="_blank">$1</a>}}');
}
// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
if (pref.type !== 'customList') {
const resetlink = document.createElement('a');
resetlink.setAttribute('href', '#tw-reset');
resetlink.setAttribute('id', 'twinkle-config-reset-' + pref.name);
resetlink.addEventListener('click', Twinkle.config.resetPrefLink, false);
resetlink.style.cssFloat = 'right';
resetlink.style.margin = '0 0.6em';
resetlink.appendChild(document.createTextNode('Thiết lập lại'));
cell.appendChild(resetlink);
}
row.appendChild(cell);
container.appendChild(row);
return true;
});
return true;
});
const footerbox = document.createElement('div');
footerbox.setAttribute('id', 'twinkle-config-buttonpane');
const button = document.createElement('button');
button.setAttribute('id', 'twinkle-config-submit');
button.setAttribute('type', 'submit');
button.appendChild(document.createTextNode('Lưu các thay đổi'));
footerbox.appendChild(button);
const footerspan = document.createElement('span');
footerspan.className = 'plainlinks';
footerspan.style.marginLeft = '2.4em';
footerspan.style.fontSize = '90%';
const footera = document.createElement('a');
footera.setAttribute('href', '#tw-reset-all');
footera.setAttribute('id', 'twinkle-config-resetall');
footera.addEventListener('click', Twinkle.config.resetAllPrefs, false);
footera.appendChild(document.createTextNode('Phục hồi mặc định'));
footerspan.appendChild(footera);
footerbox.appendChild(footerspan);
contentform.appendChild(footerbox);
// since all the section headers exist now, we can try going to the requested anchor
if (window.location.hash) {
const loc = window.location.hash;
window.location.hash = '';
window.location.hash = loc;
}
} else if (mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0 &&
mw.config.get('wgPageName').slice(-3) === '.js') {
const box = document.createElement('div');
// Styled in twinkle.css
box.setAttribute('id', 'twinkle-config-headerbox');
let link;
const scriptPageName = mw.config.get('wgPageName').slice(
mw.config.get('wgPageName').lastIndexOf('/') + 1,
mw.config.get('wgPageName').lastIndexOf('.js')
);
if (scriptPageName === 'twinkleoptions') {
// place "why not try the preference panel" notice
box.setAttribute('class', 'config-twopt-box');
if (mw.config.get('wgArticleId') > 0) { // page exists
box.appendChild(document.createTextNode('Trang này chứa cấu hình Twinkle của bạn. Bạn có thể thay đổi cấu hình ở '));
} else { // page does not exist
box.appendChild(document.createTextNode('Bạn có thể tùy chỉnh Twinkle sao cho phù hợp với sở thích của mình bằng cách sử dụng '));
}
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('hoặc bằng cách chỉnh sửa trang này (nếu bạn biết cách chỉnh sửa).'));
$(box).insertAfter($('#contentSub'));
} else if (['monobook', 'vector', 'vector-2022', 'cologneblue', 'modern', 'timeless', 'minerva', 'common'].includes(scriptPageName)) {
// place "Looking for Twinkle options?" notice
box.setAttribute('class', 'config-userskin-box');
box.appendChild(document.createTextNode('Nếu bạn muốn cài đặt tùy chỉnh Twinkle, bạn có thể sử dụng '));
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('.'));
$(box).insertAfter($('#contentSub'));
}
}
};
// custom list-related stuff
Twinkle.config.listDialog = {};
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow($dlgtable, value, label) {
let $contenttr, $valueInput, $labelInput;
$dlgtable.append(
$contenttr = $('<tr>').append(
$('<td>').append(
$('<button>')
.attr('type', 'button')
.on('click', () => {
$contenttr.remove();
})
.text('Xóa')
),
$('<td>').append(
$valueInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-value')
.css('width', '97%')
),
$('<td>').append(
$labelInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-label')
.css('width', '98%')
)
)
);
if (value) {
$valueInput.val(value);
}
if (label) {
$labelInput.val(label);
}
};
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
const $prefbutton = $(e.target);
const curvalue = $prefbutton.data('value');
const curpref = $prefbutton.data('pref');
const dialog = new Morebits.SimpleWindow(720, 400);
dialog.setTitle(curpref.label);
dialog.setScriptName('Twinkle preferences');
let $dlgtbody;
dialog.setContent(
$('<div>').append(
$('<table>')
.addClass('wikitable')
.css({
margin: '1.4em 1em',
width: 'auto'
})
.append(
$dlgtbody = $('<tbody>').append(
// header row
$('<tr>').append(
$('<th>') // top-left cell
.css('width', '5%'),
$('<th>') // value column header
.css('width', '35%')
.text(curpref.customListValueTitle ? curpref.customListValueTitle : 'Value'),
$('<th>') // label column header
.css('width', '60%')
.text(curpref.customListLabelTitle ? curpref.customListLabelTitle : 'Label')
)
),
$('<tfoot>').append(
$('<tr>').append(
$('<td>')
.attr('colspan', '3')
.append(
$('<button>')
.text('Thêm')
.css('min-width', '8em')
.attr('type', 'button')
.on('click', () => {
Twinkle.config.listDialog.addRow($dlgtbody);
})
)
)
)
),
$('<button>')
.text('Lưu các thay đổi')
.attr('type', 'submit') // so Morebits.SimpleWindow puts the button in the button pane
.on('click', () => {
Twinkle.config.listDialog.save($prefbutton, $dlgtbody);
dialog.close();
}),
$('<button>')
.text('Thiết lập lại')
.attr('type', 'submit')
.on('click', () => {
Twinkle.config.listDialog.reset($prefbutton, $dlgtbody);
}),
$('<button>')
.text('Hủy')
.attr('type', 'submit')
.on('click', () => {
dialog.close();
})
)[0]
);
// content rows
let gotRow = false;
$.each(curvalue, (k, v) => {
gotRow = true;
Twinkle.config.listDialog.addRow($dlgtbody, v.value, v.label);
});
// if there are no values present, add a blank row to start the user off
if (!gotRow) {
Twinkle.config.listDialog.addRow($dlgtbody);
}
dialog.display();
};
// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset($button, $tbody) {
// reset value on button
const curpref = $button.data('pref');
const oldvalue = $button.data('value');
Twinkle.config.resetPref(curpref);
// reset form
$tbody.find('tr').slice(1).remove(); // all rows except the first (header) row
// add the new values
const curvalue = $button.data('value');
$.each(curvalue, (k, v) => {
Twinkle.config.listDialog.addRow($tbody, v.value, v.label);
});
// save the old value
$button.data('value', oldvalue);
};
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave($button, $tbody) {
const result = [];
let current = {};
$tbody.find('input[type="text"]').each((inputkey, input) => {
if ($(input).hasClass('twinkle-config-customlist-value')) {
current = { value: input.value };
} else {
current.label = input.value;
// exclude totally empty rows
if (current.value || current.label) {
result.push(current);
}
}
});
$button.data('value', result);
};
// reset/restore defaults
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
const wantedpref = e.target.id.slice(21); // "twinkle-config-reset-" prefix is stripped
// search tactics
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
let foundit = false;
$(section.preferences).each((prefkey, pref) => {
if (pref.name !== wantedpref) {
return true; // continue
}
Twinkle.config.resetPref(pref);
foundit = true;
return false; // break
});
if (foundit) {
return false; // break
}
});
return false; // stop link from scrolling page
};
Twinkle.config.resetPref = function twinkleconfigResetPref(pref) {
switch (pref.type) {
case 'boolean':
document.getElementById(pref.name).checked = Twinkle.defaultConfig[pref.name];
break;
case 'string':
case 'integer':
case 'enum':
document.getElementById(pref.name).value = Twinkle.defaultConfig[pref.name];
break;
case 'set':
$.each(pref.setValues, (itemkey) => {
if (document.getElementById(pref.name + '_' + itemkey)) {
document.getElementById(pref.name + '_' + itemkey).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
}
});
break;
case 'customList':
$(document.getElementById(pref.name)).data('value', Twinkle.defaultConfig[pref.name]);
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
};
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
// no confirmation message - the user can just refresh/close the page to abort
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
$(section.preferences).each((prefkey, pref) => {
if (!pref.adminOnly || Morebits.userIsSysop) {
Twinkle.config.resetPref(pref);
}
});
return true;
});
return false; // stop link from scrolling page
};
Twinkle.config.save = function twinkleconfigSave(e) {
Morebits.Status.init(document.getElementById('twinkle-config-content'));
const userjs = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').user] + ':' + mw.config.get('wgUserName') + '/twinkleoptions.js';
const wikipediaPage = new Morebits.wiki.Page(userjs, 'Lưu cấu hình vào ' + userjs);
wikipediaPage.setCallbackParameters(e.target);
wikipediaPage.load(Twinkle.config.writePrefs);
return false;
};
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
const form = pageobj.getCallbackParameters();
// this is the object which gets serialized into JSON; only
// preferences that this script knows about are kept
const newConfig = {optionsVersion: 2.1};
// a comparison function is needed later on
// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
// arrays of strings, and arrays of { value, label })
// and it is not very robust: e.g. compare([2], ["2"]) === true, and
// compare({}, {}) === false, but it's good enough for our purposes here
const compare = function(a, b) {
if (Array.isArray(a)) {
if (a.length !== b.length) {
return false;
}
const asort = a.sort(), bsort = b.sort();
for (let i = 0; asort[i]; ++i) {
// comparison of the two properties of custom lists
if ((typeof asort[i] === 'object') && (asort[i].label !== bsort[i].label ||
asort[i].value !== bsort[i].value)) {
return false;
} else if (asort[i].toString() !== bsort[i].toString()) {
return false;
}
}
return true;
}
return a === b;
};
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.adminOnly && !Morebits.userIsSysop) {
return; // i.e. "continue" in this context
}
// reach each of the preferences from the form
$(section.preferences).each((prefkey, pref) => {
let userValue; // = undefined
// only read form values for those prefs that have them
if (!pref.adminOnly || Morebits.userIsSysop) {
if (!section.hidden) {
switch (pref.type) {
case 'boolean': // read from the checkbox
userValue = form[pref.name].checked;
break;
case 'string': // read from the input box or combo box
case 'enum':
userValue = form[pref.name].value;
break;
case 'integer': // read from the input box
userValue = parseInt(form[pref.name].value, 10);
if (isNaN(userValue)) {
Morebits.Status.warn('Đang lưu', 'Giá trị bạn đã đặt cho ' + pref.name + ' (' + pref.value + ') không hợp lệ. Quá trình lưu sẽ tiếp tục, nhưng giá trị dữ liệu không hợp lệ sẽ bị bỏ qua.');
userValue = null;
}
break;
case 'set': // read from the set of check boxes
userValue = [];
if (pref.setDisplayOrder) {
// read only those keys specified in the display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
if (form[pref.name + '_' + item].checked) {
userValue.push(item);
}
});
} else {
// read all the keys in the list of values
$.each(pref.setValues, (itemkey) => {
if (form[pref.name + '_' + itemkey].checked) {
userValue.push(itemkey);
}
});
}
break;
case 'customList': // read from the jQuery data stored on the button object
userValue = $(form[pref.name]).data('value');
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
} else if (Twinkle.prefs) {
// Retain the hidden preferences that may have customised by the user from twinkleoptions.js
// undefined if not set
userValue = Twinkle.prefs[pref.name];
}
}
// only save those preferences that are *different* from the default
if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
newConfig[pref.name] = userValue;
}
});
});
let text =
'// twinkleoptions.js: personal Twinkle preferences file\n' +
'//\n' +
'// NOTE: The easiest way to change your Twinkle preferences is by using the\n' +
'// Twinkle preferences panel, at [[' + Morebits.pageNameNorm + ']].\n' +
'//\n' +
'// This file is AUTOMATICALLY GENERATED. Any changes you make (aside from\n' +
'// changing the configuration parameters in a valid-JavaScript way) will be\n' +
'// overwritten the next time you click "save" in the Twinkle preferences\n' +
'// panel. If modifying this file, make sure to use correct JavaScript.\n' +
// eslint-disable-next-line no-useless-concat
'// <no' + 'wiki>\n' +
'\n' +
'window.Twinkle.prefs = ';
text += JSON.stringify(newConfig, null, 2);
text +=
';\n' +
'\n' +
// eslint-disable-next-line no-useless-concat
'// </no' + 'wiki>\n' +
'// End of twinkleoptions.js\n';
pageobj.setPageText(text);
pageobj.setEditSummary('Lưu cấu hình Twinkle: chỉnh sửa tự động từ [[:' + Morebits.pageNameNorm + ']]');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('recreate');
pageobj.save(Twinkle.config.saveSuccess);
};
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
pageobj.getStatusElement().info('successful');
const noticebox = document.createElement('div');
noticebox.className = 'cdx-message cdx-message--success';
noticebox.style.fontSize = '100%';
noticebox.innerHTML = '<p><b>Các cấu hình Twinkle của bạn đã được lưu lại.</b> Để xem các thay đổi, bạn sẽ cần xóa hoàn toàn bộ đệm trình duyệt (xem <a href="' + mw.util.getUrl('WP:BYPASS') + '" title="WP:BYPASS">WP:BYPASS</a> để có các chỉ dẫn chi tiết).</p>';
mw.loader.using('mediawiki.htmlform.codex.styles', () => {
Morebits.Status.root.appendChild(noticebox);
});
const noticeclear = document.createElement('br');
noticeclear.style.clear = 'both';
Morebits.Status.root.appendChild(noticeclear);
};
Twinkle.addInitCallback(Twinkle.config.init);
}());
// </nowiki>
g87kowwf667w5kszo8kg1dr0b6emq4k
2353454
2353453
2026-05-15T05:01:11Z
Kateru Zakuro
34522
2353454
javascript
text/javascript
// <nowiki>
(function() {
/*
****************************************
*** twinkleconfig.js: Preferences module
****************************************
* Mode of invocation: Adds configuration form to Wikipedia:Twinkle/Preferences,
and adds an ad box to the top of user subpages belonging to the
currently logged-in user which end in '.js'
* Active on: What I just said. Yeah.
*/
Twinkle.config = {};
Twinkle.config.watchlistEnums = {
yes: 'Thêm vào danh sách theo dõi',
no: "Không thêm vào danh sách theo dõi",
default: 'Thực hiện theo các tùy chỉnh trang của bạn',
'1 week': 'Watch for 1 week',
'1 month': 'Watch for 1 month',
'3 months': 'Watch for 3 months',
'6 months': 'Watch for 6 months'
};
Twinkle.config.commonSets = {
csdCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
csdCriteriaNotification: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3',
},
csdAndImageDeletionCriteria: {
db: 'Lý do tùy chỉnh ({{db}})',
mt1: 'MT1', mt2: 'MT2', mt3: 'MT3', mt7: 'A7', mt10: 'MT10',
tl1: 'TL1',
c1: 'C1', c2: 'C2', c3: 'C3', c4: 'C4', c5: 'C5', c6: 'C6', c7: 'C7', c8: 'C8', c10: 'C10', c11: 'C11', c12: 'C12',
dh2: 'ĐH2', dh3: 'ĐH3',
bm1: 'BM1', bm2: 'BM2',
tv1: 'TV1', tv2: 'TV2'
},
namespacesNoSpecial: {
0: 'Entry',
1: 'Talk (entry)',
2: 'User',
3: 'User talk',
4: 'Wiktionary',
5: 'Wiktionary talk',
6: 'File',
7: 'File talk',
8: 'MediaWiki',
9: 'MediaWiki talk',
10: 'Template',
11: 'Template talk',
12: 'Help',
13: 'Help talk',
14: 'Category',
15: 'Category talk',
100: 'Appendix',
101: 'Appendix talk',
710: 'TimedText',
711: 'TimedText talk',
828: 'Module',
829: 'Module talk'
}
};
Twinkle.config.commonSets.csdCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteria );
Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder = Object.keys( Twinkle.config.commonSets.csdCriteriaNotification );
Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder = Object.keys( Twinkle.config.commonSets.csdAndImageDeletionCriteria );
/**
* Section entry format:
*
* {
* title: <human-readable section title>,
* module: <name of the associated module, used to link to sections>,
* adminOnly: <true for admin-only sections>,
* hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
* preferences: [
* {
* name: <TwinkleConfig property name>,
* label: <human-readable short description - used as a form label>,
* helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
* adminOnly: <true for admin-only preferences>,
* type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
* enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
* customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
* customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
* },
* . . .
* ]
* },
* . . .
*
*/
Twinkle.config.sections = [
{
title: 'Chung',
module: 'general',
preferences: [
// TwinkleConfig.userTalkPageMode may take arguments:
// 'window': open a new window, remember the opened window
// 'tab': opens in a new tab, if possible.
// 'blank': force open in a new window, even if such a window exists
{
name: 'userTalkPageMode',
label: 'Khi mở một trang thảo luận của người dùng, hãy mở trang đó',
type: 'enum',
enumValues: { window: 'Trong một cửa sổ, thay thế các cuộc thảo luận của người dùng khác', tab: 'Trong một tab mới', blank: 'Trong một cửa sổ hoàn toàn mới' }
},
// TwinkleConfig.dialogLargeFont (boolean)
{
name: 'dialogLargeFont',
label: 'Sử dụng văn bản có kích thước lớn hơn trong hộp thoại Twinkle',
type: 'boolean'
},
// Twinkle.config.disabledModules (array)
{
name: 'disabledModules',
label: 'Tắt các mô đun Twinkle đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy hành động cẩn thận. Bỏ chọn để kích hoạt lại.',
type: 'set',
setValues: { arv: 'Báo cáo phá hoại', warn: 'Cảnh báo', welcome: 'Chào mừng thành viên', talkback: 'Hồi âm', speedy: 'Xóa nhanh', prod: 'Đề nghị xóa', xfd: 'Thảo luận xóa', image: 'Đề nghị xóa hình', protect: 'Khóa trang', tag: 'Gắn bảng bảo trì', diff: 'Khác biệt phiên bản', unlink: 'Gỡ liên kết', rollback: 'Lùi sửa và hồi sửa' }
},
// Twinkle.config.disabledSysopModules (array)
{
name: 'disabledSysopModules',
label: 'Tắt các mô-đun chỉ dành cho quản trị viên đã chọn',
helptip: 'Bất kỳ thứ gì bạn chọn ở đây sẽ KHÔNG có sẵn để sử dụng, vì vậy hãy thao tác cẩn thận. Bỏ chọn để kích hoạt lại.',
adminOnly: true,
type: 'set',
setValues: { block: 'Cấm (Block)', deprod: 'Xóa hàng loạt theo đề xuất (DePROD)', batchdelete: 'Xóa hàng loạt theo thể loại (D-batch)', batchprotect: 'Khóa/mở khóa hàng loạt (P-batch)', batchundelete: 'Phục hồi xóa hàng loạt (Und-batch)' }
}
]
},
{
title: 'ARV',
module: 'arv',
preferences: [
{
name: 'spiWatchReport',
label: 'Thêm các trang báo cáo sockpuppet (rối) vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Cấm người dùng',
module: 'block',
adminOnly: true,
preferences: [
// TwinkleConfig.defaultToBlock64 (boolean)
// Whether to default to just blocking the /64 on or off
{
name: 'defaultToBlock64',
label: 'For IPv6 addresses, select the option to block the /64 range by default',
type: 'boolean'
},
// TwinkleConfig.defaultToPartialBlocks (boolean)
// Whether to default partial blocks on or off
{
name: 'defaultToPartialBlocks',
label: 'Chọn các cấm một phần theo mặc định khi mở menu cấm',
helptip: 'If the user is already blocked, this will be overridden in favor of defaulting to the current block type',
type: 'boolean'
},
// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
// if true, blank the talk page when issuing an indef block notice (per [[WP:UWUL#Indefinitely blocked users]])
{
name: 'blankTalkpageOnIndefBlock',
label: 'Làm trống trang thảo luận khi cấm vô hạn thành viên',
helptip: 'Xem <a href="' + mw.util.getUrl('Wikipedia:WikiProject_User_warnings/Usage_and_layout#Indefinitely_blocked_users') + '">WP:UWUL</a> để có thêm thông tin.',
type: 'boolean'
}
]
},
{
title: 'Xóa hình ảnh (image deletion - DI)',
module: 'image',
preferences: [
// TwinkleConfig.notifyUserOnDeli (boolean)
// If the user should be notified after placing a file deletion tag
{
name: 'notifyUserOnDeli',
label: 'Kiểm tra hộp "thông báo cho người tải lên đầu tiên" theo mặc định',
type: 'boolean'
},
// TwinkleConfig.deliWatchPage (string)
// The watchlist setting of the page tagged for deletion.
{
name: 'deliWatchPage',
label: 'Thêm hình trang hình ảnh vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.deliWatchUser (string)
// The watchlist setting of the user talk page if a notification is placed.
{
name: 'deliWatchUser',
label: 'Thêm trang thảo luận của người dùng tải lên đầu tiên vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Page protection ' + (Morebits.userIsSysop ? '(PP)' : '(RPP)'),
module: 'protect',
preferences: [
{
name: 'watchRequestedPages',
label: 'Add page to watchlist when requesting protection',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchPPTaggedPages',
label: 'Add page to watchlist when tagging with protection template',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchProtectedPages',
label: 'Add page to watchlist when protecting',
helptip: 'If also tagging the page after protection, that preference will be favored.',
adminOnly: true,
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Đề nghị xóa (PROD)',
module: 'prod',
preferences: [
// TwinkleConfig.watchProdPages (string)
// Watchlist setting when applying prod template to page
{
name: 'watchProdPages',
label: 'Thêm mục từ vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markProdPagesAsPatrolled (boolean)
// If, when applying prod template to page, to mark the page as curated/patrolled (if the page was reached from NewPages)
{
name: 'markProdPagesAsPatrolled',
label: 'Đánh dấu trang đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.prodReasonDefault (string)
// The prefilled PROD reason.
{
name: 'prodReasonDefault',
label: 'Điền trước lý do đề xuất xóa (PROD)',
type: 'string'
},
{
name: 'logProdPages',
label: 'Giữ nhật trình ở không gian người dùng đối với tất cả trang mà bạn gán nhãn theo đề xuất xóa (PROD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật trình không gian người dùng cung cấp một cách tốt để theo dõi tất cả các trang mà bạn gán nhãn đề xuất xóa (PROD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'prodLogPageName',
label: 'Giữ nhật trình không gian người dùng PROD tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký đề xuất xóa (PROD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật chế độ ghi nhật trình không gian người dùng theo đề xuất xóa (PROD).',
type: 'string'
}
]
},
{
title: 'Hồi sửa (revert) và lùi sửa (rollback)',
module: 'rollback',
preferences: [
// TwinkleConfig.autoMenuAfterRollback (bool)
// Option to automatically open the warning menu if the user talk page is opened post-reversion
{
name: 'autoMenuAfterRollback',
label: 'Tự động mở menu cảnh báo Twinkle trên trang thảo luận của người dùng sau khi lùi sửa bằng Twinkle',
helptip: 'Chỉ hoạt động nếu các chức năng tương ứng bên dưới được chọn.',
type: 'boolean'
},
// TwinkleConfig.openTalkPage (array)
// What types of actions that should result in opening of talk page
{
name: 'openTalkPage',
label: 'Mở trang thảo luận người dùng sau các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại' }
},
// TwinkleConfig.openTalkPageOnAutoRevert (bool)
// Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
{
name: 'openTalkPageOnAutoRevert',
label: 'Mở trang thảo luận người dùng khi khôi phục lùi sửa từ các đóng góp người dùng hoặc các thay đổi gần đây',
helptip: 'Khi tính năng này được bật, các tùy chọn mong muốn phải được bật ở cài đặt trước đó để tính năng này hoạt động.',
type: 'boolean'
},
// TwinkleConfig.rollbackInPlace (bool)
//
{
name: 'rollbackInPlace',
label: "Không tải lại trang khi lùi sửa từ các đóng góp hoặc các thay đổi gần đây",
helptip: "Khi tính năng này được bật, Twinkle sẽ không tải lại nguồn cấp dữ liệu các đóng góp hoặc thay đổi gần đây sau khi hồi sửa, cho phép bạn hồi sửa nhiều sửa đổi cùng một lúc.",
type: 'boolean'
},
// TwinkleConfig.markRevertedPagesAsMinor (array)
// What types of actions that should result in marking edit as minor
{
name: 'markRevertedPagesAsMinor',
label: 'Đánh dấu là sửa đổi nhỏ cho các loại đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedPages (array)
// What types of actions that should result in forced addition to watchlist
{
name: 'watchRevertedPages',
label: 'Thêm các trang vào danh sách theo dõi cho các dạng đảo ngược (reversion) này',
type: 'set',
setValues: { agf: 'Lùi sửa thiện chí (Assume Good Faith - AGF)', norm: 'Lùi sửa bình thường', vand: 'Lùi sửa phá hoại', torev: '"Khôi phục phiên bản"' }
},
// TwinkleConfig.watchRevertedExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchRevertedExpiry',
label: 'When reverting a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.offerReasonOnNormalRevert (boolean)
// If to offer a prompt for extra summary reason for normal reverts, default to true
{
name: 'offerReasonOnNormalRevert',
label: 'Nhắc lý do cho các lần lùi sửa bình thường',
helptip: 'Các lùi sửa "bình thường" là những lùi sửa được khôi phục từ liên kết [lùi sửa] nằm ở chính giữa.',
type: 'boolean'
},
{
name: 'confirmOnRollback',
label: 'Yêu cầu một thông báo xác nhận trước khi hồi sửa',
helptip: 'Dành cho những người sử dụng bút hoặc thiết bị cảm ứng và những người thường xuyên thiếu quyết đoán.',
type: 'boolean'
},
{
name: 'confirmOnMobileRollback',
label: 'Require confirmation before reverting (mobile devices only)',
helptip: 'Avoid accidental reversions when on mobile devices.',
type: 'boolean'
},
// TwinkleConfig.showRollbackLinks (array)
// Where Twinkle should show rollback links:
// diff, others, mine, contribs, history, recent
// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
{
name: 'showRollbackLinks',
label: 'Hiển thị liên kết lùi sửa trên các trang này',
type: 'set',
setValues: { diff: 'Các trang khác biệt', others: 'Các trang đóng góp của những người dùng khác', mine: 'Trang đóng góp của tôi', recent: 'Các các trang đặc biệt thay đổi gần đây và các thay đổi liên quan', history: 'Các trang lịch sử' }
}
]
},
{
title: 'Xóa nhanh (CSD)',
module: 'speedy',
preferences: [
{
name: 'speedySelectionStyle',
label: 'Khi nào nên tiếp tục và gán nhãn/xóa trang',
type: 'enum',
enumValues: { buttonClick: 'Khi tôi nhấn nút "Gửi" (hoặc Submit)', radioClick: 'Ngay khi tôi nhấn 1 lựa chọn nào đó' }
},
// TwinkleConfig.watchSpeedyPages (array)
// Whether to add speedy tagged or deleted pages to watchlist
{
name: 'watchSpeedyPages',
label: 'Thêm trang vào danh sách theo dõi khi sử dụng các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
},
// TwinkleConfig.watchSpeedyExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchSpeedyExpiry',
label: 'When tagging a page, how long to watch it for',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
// If, when applying speedy template to page, to mark the page as triaged/patrolled (if the page was reached from NewPages)
{
name: 'markSpeedyPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét khi gán nhãn (nếu có thể)',
helptip: 'Điều này có lẽ không nên làm vì đi ngược lại phương pháp tốt nhất là đồng thuận',
type: 'boolean'
},
// TwinkleConfig.watchSpeedyUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'watchSpeedyUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
// On what types of speedy deletion notifications shall the user be welcomed
// with a "firstarticle" notice if their talk page has not yet been created.
{
name: 'welcomeUserOnSpeedyDeletionNotification',
label: 'Chào mừng người tạo trang khi thông báo với các tiêu chí này',
helptip: 'Lời chào mừng chỉ được đưa ra nếu người dùng đã được thông báo về việc xóa và chỉ khi trang thảo luận của họ chưa tồn tại. Bản mẫu được dùng là {{firstarticle}}.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
// What types of actions should result in the author of the page being notified of nomination
{
name: 'notifyUserOnSpeedyDeletionNomination',
label: 'Thông báo cho người tạo trang khi gán nhãn với các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.warnUserOnSpeedyDelete (array)
// What types of actions should result in the author of the page being notified of speedy deletion (admin only)
{
name: 'warnUserOnSpeedyDelete',
label: 'Thông báo cho người tạo trang khi xóa theo các tiêu chí này',
helptip: 'Ngay cả khi bạn chọn thông báo từ màn hình tiêu chí xóa nhanh (CSD), thông báo sẽ chỉ diễn ra đối với những tiêu chí được chọn ở đây.',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
{
name: 'promptForSpeedyDeletionSummary',
label: 'Cho phép sửa đổi tóm tắt xóa khi xóa theo các tiêu chí này',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
},
// TwinkleConfig.deleteTalkPageOnDelete (boolean)
// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
{
name: 'deleteTalkPageOnDelete',
label: 'Chọn "cũng xóa trang thảo luận" theo mặc định',
adminOnly: true,
type: 'boolean'
},
{
name: 'deleteRedirectsOnDelete',
label: 'Chọn "cũng xóa đổi hướng" theo mặc định',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.deleteSysopDefaultToDelete (boolean)
// Make the CSD screen default to "delete" instead of "tag" (admin only)
{
name: 'deleteSysopDefaultToDelete',
label: 'Mặc định để xóa hẳn thay vì gán nhãn xóa nhanh',
helptip: 'Nếu đã có nhãn tiêu chí xóa nhanh (CSD), Twinkle sẽ luôn mặc định ở chế độ "xóa"',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowWidth',
label: 'Chiều rộng của cửa sổ xóa nhanh (pixel)',
type: 'integer'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowHeight',
label: 'Chiều cao của cửa sổ xóa nhanh (pixel)',
helptip: 'Nếu bạn có một màn hình lớn, bạn có thể muốn tăng giá trị này lên.',
type: 'integer'
},
{
name: 'logSpeedyNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các đề cử theo tiêu chí xóa nhanh (CSD)',
helptip: 'Vì những người không phải là quản trị viên không có quyền truy cập vào các đóng góp đã bị xóa, nhật ký không gian người dùng cung cấp một cách tốt nhất để theo dõi tất cả các trang đã đề cử theo tiêu chí xóa nhanh (CSD) khi sử dụng Twinkle. Các tập tin được gán nhãn xóa hình (DI) cũng được thêm vào nhật ký này.',
type: 'boolean'
},
{
name: 'speedyLogPageName',
label: 'Giữ nhật trình không gian người dùng theo tiêu chí xóa nhanh (CSD) tại trang con',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký tiêu chí xóa nhanh (CSD) của mình tại Thành viên:<i>Tên người dùng</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật ký không gian người dùng theo tiêu chí xóa nhanh (CSD).',
type: 'string'
},
{
name: 'noLogOnSpeedyNomination',
label: 'Không tạo mục nhập nhật trình không gian người dùng khi gán nhãn với các tiêu chí này',
type: 'set',
setValues: Twinkle.config.commonSets.csdAndImageDeletionCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndImageDeletionCriteriaDisplayOrder
}
]
},
{
title: 'Gán nhãn',
module: 'tag',
preferences: [
{
name: 'watchTaggedVenues',
label: 'Add page to watchlist when tagging these type of pages',
type: 'set',
setValues: { articles: 'Articles', drafts: 'Drafts', redirects: 'Redirects', files: 'Files' }
},
{
name: 'watchTaggedPages',
label: 'Thêm trang vào danh sách theo dõi khi gán nhãn',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchMergeDiscussions',
label: 'Thêm các trang thảo luận vào danh sách theo dõi khi bắt đầu hợp nhất (trộn) thảo luận',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markTaggedPagesAsMinor',
label: 'Đánh dấu việc thêm nhãn là chỉnh sửa nhỏ',
type: 'boolean'
},
{
name: 'markTaggedPagesAsPatrolled',
label: 'Chọn chức năng "đánh dấu trang là đã tuần tra/đã xem xét" theo mặc định',
type: 'boolean'
},
{
name: 'groupByDefault',
label: 'Chọn chức năng hộp "gom nhóm thành {{nhiều vấn đề}}" theo mặc định',
type: 'boolean'
},
{
name: 'tagArticleSortOrder',
label: 'Thứ tự xem mặc định cho các nhãn mục từ',
type: 'enum',
enumValues: { cat: 'Theo thể loại', alpha: 'Theo thứ tự ABC' }
},
{
name: 'customTagList',
label: 'Các nhãn bảo trì mục từ/bản nháp tùy chỉnh để hiển thị',
helptip: "Các nhãn này xuất hiện dưới dạng các tùy chỉnh bổ sung ở cuối danh sách nhãn. Ví dụ: bạn có thể thêm các nhãn bảo trì mới chưa được thêm vào mặc định của Twinkle.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Nhãn'
},
{
name: 'customFileTagList',
label: 'Các nhãn bảo trì tập tin tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho các tập tin.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
},
{
name: 'customRedirectTagList',
label: 'Các nhãn đổi hướng thể loại tùy chỉnh để hiển thị',
helptip: 'Các nhãn bổ sung mà bạn muốn thêm cho đổi hướng.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Văn bản hiển thị trong hộp thoại Nhãn'
}
]
},
{
title: 'Hồi âm',
module: 'talkback',
preferences: [
{
name: 'markTalkbackAsMinor',
label: 'Đánh dấu hồi âm là sửa đổi nhỏ',
type: 'boolean'
},
{
name: 'insertTalkbackSignature',
label: 'Chèn chữ ký trong hồi âm',
type: 'boolean'
},
{
name: 'talkbackHeading',
label: 'Phần tiêu đề sử dụng cho các cuộc hồi âm',
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
},
{
name: 'mailHeading',
label: "Phần tiêu đề sử dụng cho các thông báo \"Bạn đã có thư\"",
tooltip: 'Should NOT include the equals signs ("==") used for wikitext formatting',
type: 'string'
}
]
},
{
title: 'Gỡ liên kết',
module: 'unlink',
preferences: [
// TwinkleConfig.unlinkNamespaces (array)
// In what namespaces unlink should happen, default in 0 (article), 10 (template), 100 (portal), and 118 (draft)
{
name: 'unlinkNamespaces',
label: 'Xóa liên kết khỏi các trang trong các không gian tên này',
helptip: 'Tránh chọn bất kỳ không gian tên thảo luận nào, vì Twinkle có thể kết thúc việc hủy liên kết ở các kho lưu trữ thảo luận (một điều tuyệt đối không).',
type: 'set',
setValues: Twinkle.config.commonSets.namespacesNoSpecial
}
]
},
{
title: 'Cảnh báo người dùng',
module: 'warn',
preferences: [
// TwinkleConfig.defaultWarningGroup (int)
// Which level warning should be the default selected group, default is 1
{
name: 'defaultWarningGroup',
label: 'Mức cảnh báo mặc định',
type: 'enum',
enumValues: {
1: 'Mức 1',
2: 'Mức 2',
3: 'Mức 3',
4: 'Mức 4',
5: 'Mức 4im',
6: 'Thông báo một vấn đề',
7: 'Cảnh báo một vấn đề',
// 8 was used for block templates before #260
9: 'Cảnh báo tùy chỉnh',
10: 'Tất cả bản mẫu cảnh báo',
11: 'Tự chọn mức cảnh báo (1-4)'
}
},
// TwinkleConfig.combinedSingletMenus (boolean)
// if true, show one menu with both single-issue notices and warnings instead of two separately
{
name: 'combinedSingletMenus',
label: 'Thay thế menu hai vấn đề riêng biệt thành một menu kết hợp',
helptip: 'Chọn thông báo một vấn đề hoặc cảnh báo một vấn đề làm mặc định nếu tính năng này được kích hoạt.',
type: 'boolean'
},
// TwinkleConfig.watchWarnings (string)
// Watchlist setting for the page which has been dispatched an warning or notice
{
name: 'watchWarnings',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi thông báo',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.oldSelect (boolean)
// if true, use the native select menu rather the select2-based one
{
name: 'oldSelect',
label: 'Sử dụng menu chọn cổ điển không có khả năng tìm kiếm',
type: 'boolean'
},
{
name: 'customWarningList',
label: 'Các bản mẫu cảnh báo tùy chỉnh để hiển thị',
helptip: 'Bạn có thể thêm các bản mẫu riêng lẻ hoặc các trang con người dùng. Cảnh báo tùy chỉnh xuất hiện ở danh mục "Cảnh báo tùy chỉnh" trong hộp thoại cảnh báo.',
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong danh sách cảnh báo (cũng được sử dụng làm bản tóm tắt chỉnh sửa)'
}
]
},
{
title: 'Chào mừng thành viên',
module: 'welcome',
preferences: [
{
name: 'topWelcomes',
label: 'Đặt nội dung chào mừng phía trên nội dung trang thảo luận của người dùng hiện có',
type: 'boolean'
},
{
name: 'watchWelcomes',
label: 'Thêm trang thảo luận người dùng vào danh sách theo dõi khi chào mừng',
helptip: 'Làm như vậy để thêm yếu tố cá nhân của việc chào đón người dùng - bạn sẽ có thể thấy cách họ hoạt động với tư cách là một người mới và có thể giúp họ.',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'insertUsername',
label: 'Thêm tên người dùng của bạn vào mẫu (nếu có)',
helptip: "Một số bản mẫu chào mừng có câu mở đầu như \"Xin chào, tên tôi là <username>. Chào mừng\" .v. Nếu bạn tắt tùy chỉnh này, các bản mẫu này sẽ không hiển thị tên người dùng của bạn theo cách này.",
type: 'boolean'
},
{
name: 'quickWelcomeMode',
label: 'Nhấp vào liên kết "chào mừng" trên một trang khác biệt sửa đổi',
helptip: 'Nếu bạn chọn chào mừng tự động, bản mẫu bạn chỉ định bên dưới sẽ được sử dụng.',
type: 'enum',
enumValues: { auto: 'chào mừng tự động', norm: 'bạn cần chọn một bản mẫu' }
},
{
name: 'quickWelcomeTemplate',
label: 'Bản mẫu để sử dụng khi chào mừng tự động',
helptip: 'Nhập tên của bản mẫu chào mừng, không có dấu ngoặc nhọn. Một liên kết đến mục từ đã cho sẽ được thêm vào.',
type: 'string'
},
{
name: 'customWelcomeList',
label: 'Các bản mẫu chào mừng tùy chỉnh để hiển thị',
helptip: "Bạn có thể thêm các bản mẫu chào mừng khác hoặc các trang con của người dùng là các bản mẫu chào mừng (có tiền tố là \"Thành viên:\"). Đừng quên rằng các bản mẫu này được thay thế trên các trang thảo luận người dùng.",
type: 'customList',
customListValueTitle: 'Tên bản mẫu (không có dấu ngoặc nhọn)',
customListLabelTitle: 'Nội dung hiển thị trong hộp thoại Chào mừng'
},
{
name: 'customWelcomeSignature',
label: 'Tự động ký tên các bản mẫu chào mừng tùy chỉnh',
helptip: 'Nếu các bản mẫu chào mừng tùy chỉnh đã tích hợp chữ ký, hãy tắt tùy chỉnh này.',
type: 'boolean'
}
]
},
{
title: 'XFD (thảo luận xóa)',
module: 'xfd',
preferences: [
{
name: 'logXfdNominations',
label: 'Giữ nhật trình trong không gian người dùng của tất cả các trang mà bạn đề cử thảo luận xóa (XfD)',
helptip: 'Nhật trình không gian người dùng đem đến sự hữu ích khi theo dõi tất cả các trang mà bạn đề cử cho thảo luận xóa (XfD) bằng Twinkle.',
type: 'boolean'
},
{
name: 'xfdLogPageName',
label: 'Giữ nhật trình không gian người dùng thảo luận xóa tại trang con của người dùng này',
helptip: 'Nhập tên trang con vào ô này. Bạn sẽ tìm thấy nhật ký thảo luận xóa (XfD) của mình tại Thành viên:<i>Tên thành viên</i>/<i>Tên trang con</i>. Chỉ hoạt động nếu bạn bật nhật trình không gian người dùng thảo luận xóa (XfD)."',
type: 'string'
},
{
name: 'noLogOnXfdNomination',
label: 'Không ghi lại nhật trình không gian người dùng khi đề cử tại nơi này',
type: 'set',
setValues: { afd: 'AfD', tfd: 'TfD', ffd: 'FfD', cfd: 'CfD', cfds: 'CfD/S', mfd: 'MfD', rfd: 'RfD', rm: 'RM' }
},
// TwinkleConfig.xfdWatchPage (string)
// The watchlist setting of the page being nominated for XfD.
{
name: 'xfdWatchPage',
label: 'Thêm trang được đề cử vào danh sách theo dõi',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchDiscussion (string)
// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
// or the list page for the other processes.
{
name: 'xfdWatchDiscussion',
label: 'Thêm trang thảo luận xóa vào danh sách theo dõi',
helptip: 'Điều này đề cập đến trang con thảo luận (cho AfD và MfD) hoặc trang nhật ký hàng ngày (cho TfD, CfD, RfD và FfD)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchList (string)
// The watchlist setting of the XfD list page, *if* the discussion is on a separate page.
{
name: 'xfdWatchList',
label: 'Thêm trang nhật trình/danh sách hàng ngày vào danh sách theo dõi (nếu có)',
helptip: 'Điều này chỉ áp dụng cho AfD và MfD với các cuộc thảo luận được đưa vào trang nhật trình hàng ngày (đối với AfD) hoặc trang chính MfD (đối với MfD).',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'xfdWatchUser',
label: 'Thêm trang thảo luận người dùng của người đóng góp ban đầu vào danh sách theo dõi (khi thông báo)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchRelated (string)
// The watchlist setting of the target of a redirect being nominated for RfD.
{
name: 'xfdWatchRelated',
label: "Thêm trang đích đổi hướng vào danh sách theo dõi (khi thông báo)",
helptip: 'Điều này chỉ áp dụng cho RfD, khi để lại thông báo trên trang thảo luận về mục tiêu đổi hướng',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'markXfdPagesAsPatrolled',
label: 'Đánh dấu trang là đã được tuần tra/xem xét theo đề cử tiêu chí xóa theo thảo luận (AFD) (nếu có thể)',
type: 'boolean'
}
]
},
{
title: 'Hidden',
hidden: true,
preferences: [
// twinklerollback.js: defines how many revision to query maximum, maximum possible is 50, default is 50
{
name: 'revertMaxRevisions',
type: 'integer'
},
// twinklewarn.js: When using the autolevel select option, how many days makes a prior warning stale
// Huggle is three days ([[Special:Diff/918980316]] and [[Special:Diff/919417999]]) while ClueBotNG is two:
// https://github.com/DamianZaremba/cluebotng/blob/4958e25d6874cba01c75f11debd2e511fd5a2ce5/bot/action_functions.php#L62
{
name: 'autolevelStaleDays',
type: 'integer'
},
// How many pages should be queried by deprod and batchdelete/protect/undelete
{
name: 'batchMax',
type: 'integer',
adminOnly: true
},
// How many pages should be processed at a time by deprod and batchdelete/protect/undelete
{
name: 'batchChunks',
type: 'integer',
adminOnly: true
}
]
}
]; // end of Twinkle.config.sections
Twinkle.config.init = function twinkleconfigInit() {
// create the config page at Wikipedia:Twinkle/Preferences
if ((mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').project && mw.config.get('wgTitle') === 'Twinkle/Preferences') &&
mw.config.get('wgAction') === 'view') {
if (!document.getElementById('twinkle-config')) {
return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
}
// set style to nothing to prevent conflict with external css
document.getElementById('twinkle-config').removeAttribute('style');
document.getElementById('twinkle-config-titlebar').removeAttribute('style');
const contentdiv = document.getElementById('twinkle-config-content');
contentdiv.textContent = ''; // clear children
// let user know about possible conflict with skin js/common.js file
// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
if (window.TwinkleConfig || window.FriendlyConfig) {
const contentnotice = document.createElement('div');
contentnotice.className = 'plainlinks twinkle-ombox';
contentnotice.innerHTML =
'<div>' +
'<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/3/38/Imbox_content.png" />' +
'</div>' +
'<div>' +
'<p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
'<p>To do this, you can <a href="' + mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/' + mw.config.get('skin') +
'.js', { action: 'edit' }) + '" target="_blank"><b>edit your personal skin javascript file</b></a> or <a href="' +
mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/common.js', { action: 'edit'}) + '" target="_blank"><b>your common.js file</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
'</div>';
contentdiv.appendChild(contentnotice);
}
// start a table of contents
const toctable = document.createElement('div');
toctable.className = 'toc';
toctable.style.marginLeft = '0.4em';
// create TOC title
const toctitle = document.createElement('div');
toctitle.id = 'toctitle';
const toch2 = document.createElement('h2');
toch2.textContent = 'Nội dung ';
toctitle.appendChild(toch2);
// add TOC show/hide link
const toctoggle = document.createElement('span');
toctoggle.className = 'toctoggle';
toctoggle.appendChild(document.createTextNode('['));
const toctogglelink = document.createElement('a');
toctogglelink.className = 'internal';
toctogglelink.setAttribute('href', '#tw-tocshowhide');
toctogglelink.textContent = 'hide';
toctoggle.appendChild(toctogglelink);
toctoggle.appendChild(document.createTextNode(']'));
toctitle.appendChild(toctoggle);
toctable.appendChild(toctitle);
// create item container: this is what we add stuff to
const tocul = document.createElement('ul');
toctogglelink.addEventListener('click', () => {
const $tocul = $(tocul);
$tocul.toggle();
if ($tocul.find(':visible').length) {
toctogglelink.textContent = 'hide';
} else {
toctogglelink.textContent = 'show';
}
}, false);
toctable.appendChild(tocul);
contentdiv.appendChild(toctable);
const contentform = document.createElement('form');
contentform.setAttribute('action', 'javascript:void(0)'); // was #tw-save - changed to void(0) to work around Chrome issue
contentform.addEventListener('submit', Twinkle.config.save, true);
contentdiv.appendChild(contentform);
const container = document.createElement('table');
container.style.width = '100%';
contentform.appendChild(container);
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // i.e. "continue" in this context
}
// add to TOC
const tocli = document.createElement('li');
tocli.className = 'toclevel-1';
const toca = document.createElement('a');
toca.setAttribute('href', '#' + section.module);
toca.appendChild(document.createTextNode(section.title));
tocli.appendChild(toca);
tocul.appendChild(tocli);
let row = document.createElement('tr');
let cell = document.createElement('td');
cell.setAttribute('colspan', '3');
const heading = document.createElement('h4');
heading.style.borderBottom = '1px solid gray';
heading.style.marginTop = '0.2em';
heading.id = section.module;
heading.appendChild(document.createTextNode(section.title));
cell.appendChild(heading);
row.appendChild(cell);
container.appendChild(row);
let rowcount = 1; // for row banding
// add each of the preferences to the form
$(section.preferences).each((prefkey, pref) => {
if (pref.adminOnly && !Morebits.userIsSysop) {
return true; // i.e. "continue" in this context
}
row = document.createElement('tr');
row.style.marginBottom = '0.2em';
// create odd row banding
if (rowcount++ % 2 === 0) {
row.style.backgroundColor = 'rgba(128, 128, 128, 0.1)';
}
cell = document.createElement('td');
let label, input;
const gotPref = Twinkle.getPref(pref.name);
switch (pref.type) {
case 'boolean': // create a checkbox
cell.setAttribute('colspan', '2');
label = document.createElement('label');
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (gotPref === true) {
input.setAttribute('checked', 'checked');
}
label.appendChild(input);
label.appendChild(document.createTextNode(pref.label));
cell.appendChild(label);
break;
case 'string': // create an input box
case 'integer':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (pref.type === 'integer') {
input.setAttribute('size', 6);
input.setAttribute('type', 'number');
input.setAttribute('step', '1'); // integers only
}
if (gotPref) {
input.setAttribute('value', gotPref);
}
cell.appendChild(input);
break;
case 'enum': // create a combo box
// add label to first column
// note: duplicates the code above, under string/integer
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('select');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
$.each(pref.enumValues, (enumvalue, enumdisplay) => {
const option = document.createElement('option');
option.setAttribute('value', enumvalue);
if ((gotPref === enumvalue) ||
// Hack to convert old boolean watchlist prefs
// to corresponding enums (added in v2.1)
(typeof gotPref === 'boolean' &&
((gotPref && enumvalue === 'yes') ||
(!gotPref && enumvalue === 'no')))) {
option.setAttribute('selected', 'selected');
}
option.appendChild(document.createTextNode(enumdisplay));
input.appendChild(option);
});
cell.appendChild(input);
break;
case 'set': // create a set of check boxes
// add label first of all
cell.setAttribute('colspan', '2');
label = document.createElement('label'); // not really necessary to use a label element here, but we do it for consistency of styling
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
var checkdiv = document.createElement('div');
checkdiv.style.paddingLeft = '1em';
var worker = function(itemkey, itemvalue) {
const checklabel = document.createElement('label');
checklabel.style.marginRight = '0.7em';
checklabel.style.display = 'inline-block';
const check = document.createElement('input');
check.setAttribute('type', 'checkbox');
check.setAttribute('id', pref.name + '_' + itemkey);
check.setAttribute('name', pref.name + '_' + itemkey);
if (gotPref && gotPref.includes(itemkey)) {
check.setAttribute('checked', 'checked');
}
// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
if (pref.name === 'unlinkNamespaces') {
if (gotPref && gotPref.includes(parseInt(itemkey, 10))) {
check.setAttribute('checked', 'checked');
}
}
checklabel.appendChild(check);
checklabel.appendChild(document.createTextNode(itemvalue));
checkdiv.appendChild(checklabel);
};
if (pref.setDisplayOrder) {
// add check boxes according to the given display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
worker(item, pref.setValues[item]);
});
} else {
// add check boxes according to the order it gets fed to us (probably strict alphabetical)
$.each(pref.setValues, worker);
}
cell.appendChild(checkdiv);
break;
case 'customList':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add button to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
var button = document.createElement('button');
button.setAttribute('id', pref.name);
button.setAttribute('name', pref.name);
button.setAttribute('type', 'button');
button.addEventListener('click', Twinkle.config.listDialog.display, false);
// use jQuery data on the button to store the current config value
$(button).data({
value: gotPref,
pref: pref
});
button.appendChild(document.createTextNode('Sửa các mục'));
cell.appendChild(button);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
row.appendChild(cell);
// add help tip
cell = document.createElement('td');
cell.className = 'twinkle-config-helptip';
if (pref.helptip) {
// convert mentions of templates in the helptip to clickable links
cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,
'{{<a href="' + mw.util.getUrl('Template:') + '$1" target="_blank">$1</a>}}');
}
// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
if (pref.type !== 'customList') {
const resetlink = document.createElement('a');
resetlink.setAttribute('href', '#tw-reset');
resetlink.setAttribute('id', 'twinkle-config-reset-' + pref.name);
resetlink.addEventListener('click', Twinkle.config.resetPrefLink, false);
resetlink.style.cssFloat = 'right';
resetlink.style.margin = '0 0.6em';
resetlink.appendChild(document.createTextNode('Thiết lập lại'));
cell.appendChild(resetlink);
}
row.appendChild(cell);
container.appendChild(row);
return true;
});
return true;
});
const footerbox = document.createElement('div');
footerbox.setAttribute('id', 'twinkle-config-buttonpane');
const button = document.createElement('button');
button.setAttribute('id', 'twinkle-config-submit');
button.setAttribute('type', 'submit');
button.appendChild(document.createTextNode('Lưu các thay đổi'));
footerbox.appendChild(button);
const footerspan = document.createElement('span');
footerspan.className = 'plainlinks';
footerspan.style.marginLeft = '2.4em';
footerspan.style.fontSize = '90%';
const footera = document.createElement('a');
footera.setAttribute('href', '#tw-reset-all');
footera.setAttribute('id', 'twinkle-config-resetall');
footera.addEventListener('click', Twinkle.config.resetAllPrefs, false);
footera.appendChild(document.createTextNode('Phục hồi mặc định'));
footerspan.appendChild(footera);
footerbox.appendChild(footerspan);
contentform.appendChild(footerbox);
// since all the section headers exist now, we can try going to the requested anchor
if (window.location.hash) {
const loc = window.location.hash;
window.location.hash = '';
window.location.hash = loc;
}
} else if (mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0 &&
mw.config.get('wgPageName').slice(-3) === '.js') {
const box = document.createElement('div');
// Styled in twinkle.css
box.setAttribute('id', 'twinkle-config-headerbox');
let link;
const scriptPageName = mw.config.get('wgPageName').slice(
mw.config.get('wgPageName').lastIndexOf('/') + 1,
mw.config.get('wgPageName').lastIndexOf('.js')
);
if (scriptPageName === 'twinkleoptions') {
// place "why not try the preference panel" notice
box.setAttribute('class', 'config-twopt-box');
if (mw.config.get('wgArticleId') > 0) { // page exists
box.appendChild(document.createTextNode('Trang này chứa cấu hình Twinkle của bạn. Bạn có thể thay đổi cấu hình ở '));
} else { // page does not exist
box.appendChild(document.createTextNode('Bạn có thể tùy chỉnh Twinkle sao cho phù hợp với sở thích của mình bằng cách sử dụng '));
}
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('hoặc bằng cách chỉnh sửa trang này (nếu bạn biết cách chỉnh sửa).'));
$(box).insertAfter($('#contentSub'));
} else if (['monobook', 'vector', 'vector-2022', 'cologneblue', 'modern', 'timeless', 'minerva', 'common'].includes(scriptPageName)) {
// place "Looking for Twinkle options?" notice
box.setAttribute('class', 'config-userskin-box');
box.appendChild(document.createTextNode('Nếu bạn muốn cài đặt tùy chỉnh Twinkle, bạn có thể sử dụng '));
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Preferences'));
link.appendChild(document.createTextNode('Bảng cấu hình Twinkle'));
box.appendChild(link);
box.appendChild(document.createTextNode('.'));
$(box).insertAfter($('#contentSub'));
}
}
};
// custom list-related stuff
Twinkle.config.listDialog = {};
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow($dlgtable, value, label) {
let $contenttr, $valueInput, $labelInput;
$dlgtable.append(
$contenttr = $('<tr>').append(
$('<td>').append(
$('<button>')
.attr('type', 'button')
.on('click', () => {
$contenttr.remove();
})
.text('Xóa')
),
$('<td>').append(
$valueInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-value')
.css('width', '97%')
),
$('<td>').append(
$labelInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-label')
.css('width', '98%')
)
)
);
if (value) {
$valueInput.val(value);
}
if (label) {
$labelInput.val(label);
}
};
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
const $prefbutton = $(e.target);
const curvalue = $prefbutton.data('value');
const curpref = $prefbutton.data('pref');
const dialog = new Morebits.SimpleWindow(720, 400);
dialog.setTitle(curpref.label);
dialog.setScriptName('Twinkle preferences');
let $dlgtbody;
dialog.setContent(
$('<div>').append(
$('<table>')
.addClass('wikitable')
.css({
margin: '1.4em 1em',
width: 'auto'
})
.append(
$dlgtbody = $('<tbody>').append(
// header row
$('<tr>').append(
$('<th>') // top-left cell
.css('width', '5%'),
$('<th>') // value column header
.css('width', '35%')
.text(curpref.customListValueTitle ? curpref.customListValueTitle : 'Value'),
$('<th>') // label column header
.css('width', '60%')
.text(curpref.customListLabelTitle ? curpref.customListLabelTitle : 'Label')
)
),
$('<tfoot>').append(
$('<tr>').append(
$('<td>')
.attr('colspan', '3')
.append(
$('<button>')
.text('Thêm')
.css('min-width', '8em')
.attr('type', 'button')
.on('click', () => {
Twinkle.config.listDialog.addRow($dlgtbody);
})
)
)
)
),
$('<button>')
.text('Lưu các thay đổi')
.attr('type', 'submit') // so Morebits.SimpleWindow puts the button in the button pane
.on('click', () => {
Twinkle.config.listDialog.save($prefbutton, $dlgtbody);
dialog.close();
}),
$('<button>')
.text('Thiết lập lại')
.attr('type', 'submit')
.on('click', () => {
Twinkle.config.listDialog.reset($prefbutton, $dlgtbody);
}),
$('<button>')
.text('Hủy')
.attr('type', 'submit')
.on('click', () => {
dialog.close();
})
)[0]
);
// content rows
let gotRow = false;
$.each(curvalue, (k, v) => {
gotRow = true;
Twinkle.config.listDialog.addRow($dlgtbody, v.value, v.label);
});
// if there are no values present, add a blank row to start the user off
if (!gotRow) {
Twinkle.config.listDialog.addRow($dlgtbody);
}
dialog.display();
};
// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset($button, $tbody) {
// reset value on button
const curpref = $button.data('pref');
const oldvalue = $button.data('value');
Twinkle.config.resetPref(curpref);
// reset form
$tbody.find('tr').slice(1).remove(); // all rows except the first (header) row
// add the new values
const curvalue = $button.data('value');
$.each(curvalue, (k, v) => {
Twinkle.config.listDialog.addRow($tbody, v.value, v.label);
});
// save the old value
$button.data('value', oldvalue);
};
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave($button, $tbody) {
const result = [];
let current = {};
$tbody.find('input[type="text"]').each((inputkey, input) => {
if ($(input).hasClass('twinkle-config-customlist-value')) {
current = { value: input.value };
} else {
current.label = input.value;
// exclude totally empty rows
if (current.value || current.label) {
result.push(current);
}
}
});
$button.data('value', result);
};
// reset/restore defaults
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
const wantedpref = e.target.id.slice(21); // "twinkle-config-reset-" prefix is stripped
// search tactics
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
let foundit = false;
$(section.preferences).each((prefkey, pref) => {
if (pref.name !== wantedpref) {
return true; // continue
}
Twinkle.config.resetPref(pref);
foundit = true;
return false; // break
});
if (foundit) {
return false; // break
}
});
return false; // stop link from scrolling page
};
Twinkle.config.resetPref = function twinkleconfigResetPref(pref) {
switch (pref.type) {
case 'boolean':
document.getElementById(pref.name).checked = Twinkle.defaultConfig[pref.name];
break;
case 'string':
case 'integer':
case 'enum':
document.getElementById(pref.name).value = Twinkle.defaultConfig[pref.name];
break;
case 'set':
$.each(pref.setValues, (itemkey) => {
if (document.getElementById(pref.name + '_' + itemkey)) {
document.getElementById(pref.name + '_' + itemkey).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
}
});
break;
case 'customList':
$(document.getElementById(pref.name)).data('value', Twinkle.defaultConfig[pref.name]);
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
};
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
// no confirmation message - the user can just refresh/close the page to abort
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
$(section.preferences).each((prefkey, pref) => {
if (!pref.adminOnly || Morebits.userIsSysop) {
Twinkle.config.resetPref(pref);
}
});
return true;
});
return false; // stop link from scrolling page
};
Twinkle.config.save = function twinkleconfigSave(e) {
Morebits.Status.init(document.getElementById('twinkle-config-content'));
const userjs = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').user] + ':' + mw.config.get('wgUserName') + '/twinkleoptions.js';
const wikipediaPage = new Morebits.wiki.Page(userjs, 'Lưu cấu hình vào ' + userjs);
wikipediaPage.setCallbackParameters(e.target);
wikipediaPage.load(Twinkle.config.writePrefs);
return false;
};
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
const form = pageobj.getCallbackParameters();
// this is the object which gets serialized into JSON; only
// preferences that this script knows about are kept
const newConfig = {optionsVersion: 2.1};
// a comparison function is needed later on
// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
// arrays of strings, and arrays of { value, label })
// and it is not very robust: e.g. compare([2], ["2"]) === true, and
// compare({}, {}) === false, but it's good enough for our purposes here
const compare = function(a, b) {
if (Array.isArray(a)) {
if (a.length !== b.length) {
return false;
}
const asort = a.sort(), bsort = b.sort();
for (let i = 0; asort[i]; ++i) {
// comparison of the two properties of custom lists
if ((typeof asort[i] === 'object') && (asort[i].label !== bsort[i].label ||
asort[i].value !== bsort[i].value)) {
return false;
} else if (asort[i].toString() !== bsort[i].toString()) {
return false;
}
}
return true;
}
return a === b;
};
$(Twinkle.config.sections).each((sectionkey, section) => {
if (section.adminOnly && !Morebits.userIsSysop) {
return; // i.e. "continue" in this context
}
// reach each of the preferences from the form
$(section.preferences).each((prefkey, pref) => {
let userValue; // = undefined
// only read form values for those prefs that have them
if (!pref.adminOnly || Morebits.userIsSysop) {
if (!section.hidden) {
switch (pref.type) {
case 'boolean': // read from the checkbox
userValue = form[pref.name].checked;
break;
case 'string': // read from the input box or combo box
case 'enum':
userValue = form[pref.name].value;
break;
case 'integer': // read from the input box
userValue = parseInt(form[pref.name].value, 10);
if (isNaN(userValue)) {
Morebits.Status.warn('Đang lưu', 'Giá trị bạn đã đặt cho ' + pref.name + ' (' + pref.value + ') không hợp lệ. Quá trình lưu sẽ tiếp tục, nhưng giá trị dữ liệu không hợp lệ sẽ bị bỏ qua.');
userValue = null;
}
break;
case 'set': // read from the set of check boxes
userValue = [];
if (pref.setDisplayOrder) {
// read only those keys specified in the display order
$.each(pref.setDisplayOrder, (itemkey, item) => {
if (form[pref.name + '_' + item].checked) {
userValue.push(item);
}
});
} else {
// read all the keys in the list of values
$.each(pref.setValues, (itemkey) => {
if (form[pref.name + '_' + itemkey].checked) {
userValue.push(itemkey);
}
});
}
break;
case 'customList': // read from the jQuery data stored on the button object
userValue = $(form[pref.name]).data('value');
break;
default:
alert('twinkleconfig: loại dữ liệu không xác định cho cấu hình ' + pref.name);
break;
}
} else if (Twinkle.prefs) {
// Retain the hidden preferences that may have customised by the user from twinkleoptions.js
// undefined if not set
userValue = Twinkle.prefs[pref.name];
}
}
// only save those preferences that are *different* from the default
if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
newConfig[pref.name] = userValue;
}
});
});
let text =
'// twinkleoptions.js: personal Twinkle preferences file\n' +
'//\n' +
'// NOTE: The easiest way to change your Twinkle preferences is by using the\n' +
'// Twinkle preferences panel, at [[' + Morebits.pageNameNorm + ']].\n' +
'//\n' +
'// This file is AUTOMATICALLY GENERATED. Any changes you make (aside from\n' +
'// changing the configuration parameters in a valid-JavaScript way) will be\n' +
'// overwritten the next time you click "save" in the Twinkle preferences\n' +
'// panel. If modifying this file, make sure to use correct JavaScript.\n' +
// eslint-disable-next-line no-useless-concat
'// <no' + 'wiki>\n' +
'\n' +
'window.Twinkle.prefs = ';
text += JSON.stringify(newConfig, null, 2);
text +=
';\n' +
'\n' +
// eslint-disable-next-line no-useless-concat
'// </no' + 'wiki>\n' +
'// End of twinkleoptions.js\n';
pageobj.setPageText(text);
pageobj.setEditSummary('Lưu cấu hình Twinkle: chỉnh sửa tự động từ [[:' + Morebits.pageNameNorm + ']]');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('recreate');
pageobj.save(Twinkle.config.saveSuccess);
};
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
pageobj.getStatusElement().info('successful');
const noticebox = document.createElement('div');
noticebox.className = 'cdx-message cdx-message--success';
noticebox.style.fontSize = '100%';
noticebox.innerHTML = '<p><b>Các cấu hình Twinkle của bạn đã được lưu lại.</b> Để xem các thay đổi, bạn sẽ cần xóa hoàn toàn bộ đệm trình duyệt (xem <a href="' + mw.util.getUrl('WP:BYPASS') + '" title="WP:BYPASS">WP:BYPASS</a> để có các chỉ dẫn chi tiết).</p>';
mw.loader.using('mediawiki.htmlform.codex.styles', () => {
Morebits.Status.root.appendChild(noticebox);
});
const noticeclear = document.createElement('br');
noticeclear.style.clear = 'both';
Morebits.Status.root.appendChild(noticeclear);
};
Twinkle.addInitCallback(Twinkle.config.init);
}());
// </nowiki>
rmz59frjrociyubq6kdz8scymgzoqxi
MediaWiki:Gadget-Twinkle.js
8
363923
2353452
2285801
2026-05-15T04:53:43Z
Kateru Zakuro
34522
2353452
javascript
text/javascript
/**
* +-------------------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* | Changes to this page affect many users. |
* | Please discuss changes at [[WT:TW]] before editing. |
* +-------------------------------------------------------------------------+
*
* Imported from github [https://github.com/wikimedia-gadgets/twinkle].
* All changes should be made in the repository, otherwise they will be lost.
*
* ----------
*
* This is AzaToth's Twinkle, the popular script sidekick for newbies, admins, and
* every Wikipedian in between. Visit [[WP:TW]] for more information.
*/
// <nowiki>
/* global Morebits */
(function() {
// Check if account is experienced enough to use Twinkle
if (!Morebits.userIsInGroup('autoconfirmed') && !Morebits.userIsInGroup('confirmed')) {
return;
}
const Twinkle = {};
window.Twinkle = Twinkle; // allow global access
Twinkle.initCallbacks = [];
/**
* Adds a callback to execute when Twinkle has loaded.
*
* @param {Function} func
* @param {string} [name] - name of module used to check if is disabled.
* If name is not given, module is loaded unconditionally.
*/
Twinkle.addInitCallback = function twinkleAddInitCallback(func, name) {
Twinkle.initCallbacks.push({ func: func, name: name });
};
Twinkle.defaultConfig = {};
/**
* This holds the default set of preferences used by Twinkle.
* It is important that all new preferences added here, especially admin-only ones, are also added to
* |Twinkle.config.sections| in twinkleconfig.js, so they are configurable via the Twinkle preferences panel.
* For help on the actual preferences, see the comments in twinkleconfig.js.
*/
Twinkle.defaultConfig = {
// General
userTalkPageMode: 'tab',
dialogLargeFont: false,
disabledModules: [],
disabledSysopModules: [],
// ARV
spiWatchReport: 'yes',
// Block
defaultToBlock64: false,
defaultToPartialBlocks: false,
blankTalkpageOnIndefBlock: false,
// Rollback
autoMenuAfterRollback: false,
openTalkPage: [ 'agf', 'norm', 'vand' ],
openTalkPageOnAutoRevert: false,
rollbackInPlace: false,
markRevertedPagesAsMinor: [ 'vand' ],
watchRevertedPages: [ 'agf', 'norm', 'vand', 'torev' ],
watchRevertedExpiry: '1 month',
offerReasonOnNormalRevert: true,
confirmOnRollback: false,
confirmOnMobileRollback: true,
showRollbackLinks: [ 'diff', 'others' ],
// DI (twinkleimage)
notifyUserOnDeli: true,
deliWatchPage: '1 month',
deliWatchUser: '1 month',
// Protect
watchRequestedPages: 'yes',
watchPPTaggedPages: 'default',
watchProtectedPages: 'default',
// PROD
watchProdPages: '1 month',
markProdPagesAsPatrolled: false,
prodReasonDefault: '',
logProdPages: false,
prodLogPageName: 'PROD log',
// CSD
speedySelectionStyle: 'buttonClick',
watchSpeedyPages: [ 'c3', 'c5', 'c10', 'c11', 'c12' ],
watchSpeedyExpiry: '1 month',
markSpeedyPagesAsPatrolled: false,
watchSpeedyUser: '1 month',
// these next two should probably be identical by default
welcomeUserOnSpeedyDeletionNotification: [ 'db', 'c1', 'c2', 'c3', 'c4', 'c6', 'c10', 'c11', 'c12', 'c13', 'c14', 'c15', 'mt1', 'mt2', 'mt3', 'mt7', 'mt9', 'mt10', 'mt11', 'tl1', 'f1', 'f2', 'f3', 'f7', 'f9', 'dh3', 'dh5' ],
notifyUserOnSpeedyDeletionNomination: [ 'db', 'c1', 'c2', 'c3', 'c4', 'c6', 'c10', 'c11', 'c12', 'c13', 'c14', 'c15', 'mt1', 'mt2', 'mt3', 'mt7', 'mt9', 'mt10', 'mt11', 'tl1', 'f1', 'f2', 'f3', 'f7', 'f9', 'dh3', 'dh5' ],
warnUserOnSpeedyDelete: [ 'db', 'c1', 'c2', 'c3', 'c4', 'c6', 'c10', 'c11', 'c12', 'c13', 'c14', 'c15', 'mt1', 'mt2', 'mt3', 'mt7', 'mt9', 'mt10', 'mt11', 'tl1', 'f1', 'f2', 'f3', 'f7', 'f9', 'dh3', 'dh5' ],
promptForSpeedyDeletionSummary: [],
deleteTalkPageOnDelete: true,
deleteRedirectsOnDelete: true,
deleteSysopDefaultToDelete: false,
speedyWindowHeight: 500,
speedyWindowWidth: 800,
logSpeedyNominations: false,
speedyLogPageName: 'CSD log',
noLogOnSpeedyNomination: [ 'tv1' ],
// Unlink
unlinkNamespaces: [ '0', '10', '100', '118' ],
// Warn
defaultWarningGroup: '10',
combinedSingletMenus: false,
showSharedIPNotice: true,
watchWarnings: '1 month',
oldSelect: false,
customWarningList: [],
// XfD
logXfdNominations: false,
xfdLogPageName: 'XfD log',
noLogOnXfdNomination: [],
xfdWatchDiscussion: 'default',
xfdWatchList: 'no',
xfdWatchPage: '1 month',
xfdWatchUser: '1 month',
xfdWatchRelated: '1 month',
markXfdPagesAsPatrolled: true,
// Hidden preferences
autolevelStaleDays: 3, // Huggle is 3, CBNG is 2
revertMaxRevisions: 50, // intentionally limited
batchMax: 5000,
batchChunks: 50,
// Deprecated options, as a fallback for add-on scripts/modules
summaryAd: ' ([[WT:TW|TW]])',
deletionSummaryAd: ' ([[WT:TW|TW]])',
protectionSummaryAd: ' ([[WT:TW|TW]])',
// Tag
groupByDefault: true,
watchTaggedVenues: ['articles', 'drafts', 'redirects', 'files'],
watchTaggedPages: '1 month',
watchMergeDiscussions: '1 month',
markTaggedPagesAsMinor: false,
markTaggedPagesAsPatrolled: false,
tagArticleSortOrder: 'cat',
customTagList: [],
customFileTagList: [],
customRedirectTagList: [],
// Welcome
topWelcomes: false,
watchWelcomes: '3 months',
insertUsername: true,
quickWelcomeMode: 'norm',
quickWelcomeTemplate: 'welcome',
customWelcomeList: [],
customWelcomeSignature: true,
// Talkback
markTalkbackAsMinor: false,
insertTalkbackSignature: true, // always sign talkback templates
talkbackHeading: 'Tin nhắn mới từ ' + mw.config.get('wgUserName'),
mailHeading: "Bạn có thư!",
// Shared
markSharedIPAsMinor: true
};
Twinkle.getPref = function twinkleGetPref(name) {
if (typeof Twinkle.prefs === 'object' && Twinkle.prefs[name] !== undefined) {
return Twinkle.prefs[name];
}
// Old preferences format, used before twinkleoptions.js was a thing
if (typeof window.TwinkleConfig === 'object' && window.TwinkleConfig[name] !== undefined) {
return window.TwinkleConfig[name];
}
if (typeof window.FriendlyConfig === 'object' && window.FriendlyConfig[name] !== undefined) {
return window.FriendlyConfig[name];
}
// Backwards compatibility code because we renamed confirmOnFluff to confirmOnRollback, and confirmOnMobileFluff to confirmOnMobileRollback
if (name === 'confirmOnRollback' && typeof Twinkle.prefs === 'object' && Twinkle.prefs.confirmOnFluff !== undefined) {
return Twinkle.prefs.confirmOnFluff;
} else if (name === 'confirmOnMobileRollback' && typeof Twinkle.prefs === 'object' && Twinkle.prefs.confirmOnMobileFluff !== undefined) {
return Twinkle.prefs.confirmOnMobileFluff;
}
return Twinkle.defaultConfig[name];
};
/**
* Adds a portlet menu to one of the navigation areas on the page.
*
* @return {string} portletId
*/
Twinkle.addPortlet = function() {
/** @type {string} id of the target navigation area (skin dependent, on vector either of "#left-navigation", "#right-navigation", or "#mw-panel") */
let navigation;
/** @type {string} id of the portlet menu to create, preferably start with "p-". */
let id;
/** @type {string} name of the portlet menu to create. Visibility depends on the class used. */
let text;
/** @type {Node} the id of the node before which the new item should be added, should be another item in the same list, or undefined to place it at the end. */
let nextnodeid;
switch (mw.config.get('skin')) {
case 'vector':
case 'vector-2022':
navigation = '#right-navigation';
id = 'p-twinkle';
text = 'TW';
// In order to get mw.util.addPortlet to generate a dropdown menu in vector and vector-2022, the nextnodeid must be p-cactions. Any other nextnodeid will generate a non-dropdown portlet instead.
nextnodeid = 'p-cactions';
break;
case 'timeless':
navigation = '#page-tools .sidebar-inner';
id = 'p-twinkle';
text = 'Twinkle';
nextnodeid = 'p-userpagetools';
break;
default:
navigation = null;
id = 'p-cactions';
}
if (navigation === null) {
return id;
}
// make sure navigation is a valid CSS selector
const root = document.querySelector(navigation);
if (!root) {
return id;
}
// if we already created the portlet, return early. we don't want to create it again.
const item = document.getElementById(id);
if (item) {
return id;
}
mw.util.addPortlet(id, text, '#' + nextnodeid);
// The Twinkle dropdown menu has been added to the left of p-cactions, since that is the only spot that will create a dropdown menu. But we want it on the right. Move it to the right.
if (mw.config.get('skin') === 'vector') {
$('#p-twinkle').insertAfter('#p-cactions');
} else if (mw.config.get('skin') === 'vector-2022') {
const $landmark = $('#right-navigation > .vector-page-tools-landmark');
$('#p-twinkle-dropdown').insertAfter($landmark);
// .vector-page-tools-landmark is unstable and could change. If so, log it to console, to hopefully get someone's attention.
if (!$landmark) {
mw.log.warn('Unexpected change in DOM');
}
}
return id;
};
/**
* Builds a portlet menu if it doesn't exist yet, and adds a portlet link. This function runs at the top of every Twinkle module, ensuring that the first module to be loaded adds the portlet, and that every module can add a link to itself to the portlet.
*
* @param task Either a URL for the portlet link or a function to execute.
*/
Twinkle.addPortletLink = function(task, text, id, tooltip) {
// Create a portlet to hold all the portlet links (if not created already). And get the portletId.
const portletId = Twinkle.addPortlet();
// Create a portlet link and add it to the portlet.
const link = mw.util.addPortletLink(portletId, typeof task === 'string' ? task : '#', text, id, tooltip);
// Related to the hidden peer gadget that prevents jumpiness when the page first loads
$('.client-js .skin-vector #p-cactions').css('margin-right', 'initial');
// Add a click listener for the portlet link
if (typeof task === 'function') {
$(link).on('click', (ev) => {
task();
ev.preventDefault();
});
}
// $.collapsibleTabs is a feature of Vector 2010
if ($.collapsibleTabs) {
// Manually trigger a recalculation of what tabs to put where. This is to account for the space that the TW menu we just added is taking up.
$.collapsibleTabs.handleResize();
}
return link;
};
/**
* **************** General initialization code ****************
*/
const scriptpathbefore = mw.util.wikiScript('index') + '?title=',
scriptpathafter = '&action=raw&ctype=text/javascript&happy=yes';
// Retrieve the user's Twinkle preferences
$.ajax({
url: scriptpathbefore + 'User:' + encodeURIComponent(mw.config.get('wgUserName')) + '/twinkleoptions.js' + scriptpathafter,
dataType: 'text'
})
.fail(() => {
console.log('Không thể phân tích cú pháp cấu hình Twinkle của bạn, đang thiết lập lại cấu hình mặc định'); // eslint-disable-line no-console
})
.done((optionsText) => {
// Quick pass if user has no options
if (optionsText === '') {
return;
}
// Twinkle options are basically a JSON object with some comments. Strip those:
optionsText = optionsText.replace(/(?:^(?:\/\/[^\n]*\n)*\n*|(?:\/\/[^\n]*(?:\n|$))*$)/g, '');
// First version of options had some boilerplate code to make it eval-able -- strip that too. This part may become obsolete down the line.
if (optionsText.lastIndexOf('window.Twinkle.prefs = ', 0) === 0) {
optionsText = optionsText.replace(/(?:^window.Twinkle.prefs = |;\n*$)/g, '');
}
try {
const options = JSON.parse(optionsText);
if (options) {
if (options.twinkle || options.friendly) { // Old preferences format
Twinkle.prefs = $.extend(options.twinkle, options.friendly);
} else {
Twinkle.prefs = options;
}
// v2 established after unification of Twinkle/Friendly objects
Twinkle.prefs.optionsVersion = Twinkle.prefs.optionsVersion || 1;
}
} catch (e) {
mw.notify('Không thể phân tích cú pháp cấu hình Twinkle của bạn', {type: 'error'});
}
})
.always(() => {
$(Twinkle.load);
});
// Developers: you can import custom Twinkle modules here
// For example, mw.loader.load(scriptpathbefore + "User:UncleDouggie/morebits-test.js" + scriptpathafter);
Twinkle.load = function () {
// Don't activate on special pages other than those listed here, so
// that others load faster, especially the watchlist.
let activeSpecialPageList = [ 'Block', 'Contributions', 'Recentchanges', 'Recentchangeslinked' ]; // wgRelevantUserName defined for non-sysops on Special:Block
if (Morebits.userIsSysop) {
activeSpecialPageList = activeSpecialPageList.concat([ 'DeletedContributions', 'Prefixindex' ]);
}
if (mw.config.get('wgNamespaceNumber') === -1 &&
!activeSpecialPageList.includes(mw.config.get('wgCanonicalSpecialPageName'))) {
return;
}
// Prevent clickjacking
if (window.top !== window.self) {
return;
}
// Set custom Api-User-Agent header, for server-side logging purposes
Morebits.wiki.Api.setApiUserAgent('Twinkle (' + mw.config.get('wgWikiID') + ')');
Twinkle.disabledModules = Twinkle.getPref('disabledModules').concat(Twinkle.getPref('disabledSysopModules'));
// Redefine addInitCallback so that any modules being loaded now on are directly
// initialised rather than added to initCallbacks array
Twinkle.addInitCallback = function(func, name) {
if (!name || !Twinkle.disabledModules.includes(name)) {
func();
}
};
// Initialise modules that were saved in initCallbacks array
Twinkle.initCallbacks.forEach((module) => {
Twinkle.addInitCallback(module.func, module.name);
});
// Increases text size in Twinkle dialogs, if so configured
if (Twinkle.getPref('dialogLargeFont')) {
mw.util.addCSS('.morebits-dialog-content, .morebits-dialog-footerlinks { font-size: 100% !important; } ' +
'.morebits-dialog input, .morebits-dialog select, .morebits-dialog-content button { font-size: inherit !important; }');
}
// Hide the lingering space if the TW menu is empty
const isVector = mw.config.get('skin') === 'vector' || mw.config.get('skin') === 'vector-2022';
if (isVector && Twinkle.getPref('portletType') === 'menu' && $('#p-twinkle').length === 0) {
$('#p-cactions').css('margin-right', 'initial');
}
// If using a skin with space for lots of modules, display a link to Twinkle Preferences
const usingSkinWithDropDownMenu = mw.config.get('skin') === 'vector' || mw.config.get('skin') === 'vector-2022' || mw.config.get('skin') === 'timeless';
if (usingSkinWithDropDownMenu) {
Twinkle.addPortletLink(mw.util.getUrl('Wiktionary:Twinkle/Preferences'), 'Config', 'tw-config', 'Open Twinkle preferences page');
}
};
/**
* Twinkle-specific data shared by multiple modules
* Likely customized per installation
*/
// Custom change tag(s) to be applied to all Twinkle actions, create at Special:Tags
Twinkle.changeTags = 'twinkle';
// Available for actions that don't (yet) support tags
// currently: FlaggedRevs and PageTriage
Twinkle.summaryAd = ' ([[WT:TW|TW]])';
// Various hatnote templates, used when tagging (csd/xfd/tag/prod/protect) to
// ensure MOS:ORDER
Twinkle.hatnoteRegex = 'short description|hatnote|main|correct title|dablink|distinguish|for|further|selfref|year dab|similar names|highway detail hatnote|broader|about(?:-distinguish| other people)?|other\\s?(?:hurricane(?: use)?s|people|persons|places|ships|uses(?: of)?)|redirect(?:-(?:distinguish|synonym|multi))?|see\\s?(?:wiktionary|also(?: if exists)?)';
/* Twinkle-specific utility functions shared by multiple modules */
/**
* When performing rollbacks with [rollback] links, then visiting a user talk page, some data such as page name can be prefilled into Wel/AIV/Warn. Twinkle calls this a "prefill". This method gets a prefill, either from URL parameters (e.g. &vanarticle=Test) or from data previously stored using Twinkle.setPrefill()
*/
Twinkle.getPrefill = function (key) {
Twinkle.prefill = Twinkle.prefill || {};
if (!Object.prototype.hasOwnProperty.call(Twinkle.prefill, key)) {
Twinkle.prefill[key] = mw.util.getParamValue(key);
}
return Twinkle.prefill[key];
};
/**
* When performing rollbacks with [rollback] links, then visiting a user talk page, some data such as page name can be prefilled into Wel/AIV/Warn. Twinkle calls this a "prefill". This method sets a prefill. This data will be lost if the page is refreshed, unless it is added to the URL as a parameter.
*/
Twinkle.setPrefill = function (key, value) {
Twinkle.prefill = Twinkle.prefill || {};
Twinkle.prefill[key] = value;
};
/*
* Used in XFD and PROD
*/
Twinkle.makeFindSourcesDiv = function makeSourcesDiv(divID) {
if (!$(divID).length) {
return;
}
if (!Twinkle.findSources) {
const parser = new Morebits.wiki.Preview($(divID)[0]);
parser.beginRender('({{Find sources|' + Morebits.pageNameNorm + '}})', 'WP:AFD').then(() => {
// Save for second-time around
Twinkle.findSources = parser.previewbox.innerHTML;
$(divID).removeClass('morebits-previewbox');
});
} else {
$(divID).html(Twinkle.findSources);
}
};
/**
* Used in batch, unlink, and deprod to sort pages by namespace, as
* json formatversion=2 sorts by pageid instead (#1251)
*/
Twinkle.sortByNamespace = function(first, second) {
return first.ns - second.ns || (first.title > second.title ? 1 : -1);
};
/**
* Used in batch listings to link to the page in question with >
*/
Twinkle.generateArrowLinks = function (checkbox) {
const link = Morebits.htmlNode('a', ' >');
link.setAttribute('class', 'tw-arrowpage-link');
link.setAttribute('href', mw.util.getUrl(checkbox.value));
link.setAttribute('target', '_blank');
checkbox.nextElementSibling.append(link);
};
/**
* Used in deprod and unlink listings to link the page title
*/
Twinkle.generateBatchPageLinks = function (checkbox) {
const $checkbox = $(checkbox);
const link = Morebits.htmlNode('a', $checkbox.val());
link.setAttribute('class', 'tw-batchpage-link');
link.setAttribute('href', mw.util.getUrl($checkbox.val()));
link.setAttribute('target', '_blank');
$checkbox.next().prepend([link, ' ']);
};
}());
// </nowiki>
p72bbuag8vy0x0mu1uk64v82b8rij0o
rai duo belas
0
396992
2353214
2352942
2026-05-14T15:52:10Z
TheHighFighter2
42988
/* Cách phát âm */
2353214
wikitext
text/x-wiki
=={{langname|mui}}==
==={{ĐM|etym}}===
Từ {{compound|mui|rai|t1=[[mặt]]|duo belas|t2=[[mười hai]]}}.
==={{ĐM|pron}}===
* {{IPA4|mui|/rai duɔ bəlas/|[ɣa.i du.ɔ bəˈlas]|q=Palembang}}
==={{ĐM|adj}}===
{{head|mui|adj|head=[[rai]] [[duo belas]]}}
# {{lb|mui|Palembang|idiomatic}} [[hai mặt|Hai mặt]], [[lá mặt lá trái]].
#* {{quote-song|mui|year=2012|author=Ando MCRPBT|title=Ujung Lapan|url=https://www.youtube.com/watch?v=J7xz9Td5paE|text=Mengkali mèmang sipat gawa'an lahèr tadi / '''Rai duo belas''', ngocè-ngocènyo di buri|t=Quả thật, điều đó giống như đặc tính bẩm sinh của anh ta / (Đó là) sống '''hai mặt''', ba hoa sau lưng người khác}}
==={{ĐM|further}}===
* {{R:mui:Zulkifly:2007|entry=RAI DUO BELAS|page=188}}
nbuexwi8xb6w3isyyi21u8x5f67gzyb
Bản mẫu:db-nonsense
10
397042
2353251
2353044
2026-05-14T17:34:18Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c1]] sang [[Bản mẫu:db-c1]]
2353251
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-c1]]
s6hqbljuppgda3dir8oea6aiz6ibyca
Bản mẫu:db-test
10
397052
2353280
2353050
2026-05-14T17:54:19Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c2]] sang [[Bản mẫu:db-c2]]
2353280
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-c2]]
3vz2zq5dnvlbphho1j9usfp50m5yct6
Bản mẫu:db-vandalism
10
397056
2353281
2353058
2026-05-14T17:54:36Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c3]] sang [[Bản mẫu:db-c3]]
2353281
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c3]]
3k73bwa7021gw63jz0k7eg0dxflx4sl
Bản mẫu:db-repost
10
397062
2353282
2353065
2026-05-14T17:54:52Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c4]] sang [[Bản mẫu:db-c4]]
2353282
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c4]]
cm3k9cqrsjd1tbq1z77epqg7f9jg61l
Bản mẫu:db-banned
10
397071
2353283
2353076
2026-05-14T17:55:07Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c5]] sang [[Bản mẫu:db-c5]]
2353283
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c5]]
b51eyapguicv7bmqn48c6h14k0bp11f
Bản mẫu:db-attack
10
397092
2353285
2353109
2026-05-14T17:55:42Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c10]] sang [[Bản mẫu:db-c10]]
2353285
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c10]]
q9hohnfo5z0g6iyh4aqz9wv10oiqzmb
Bản mẫu:db-spam
10
397094
2353286
2353119
2026-05-14T17:55:54Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c11]] sang [[Bản mẫu:db-c11]]
2353286
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c11]]
tto1k7a8fm0c1dvghzr0692q3te2hgj
Bản mẫu:db-c12
10
397095
2353262
2353123
2026-05-14T17:38:43Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-c12]] thành [[Bản mẫu:db-c12]] (đã tắt đổi hướng)
2353123
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C12
|1= với lý do: [[Wiktionary:Quyền tác giả|Vi phạm bản quyền]] {{#if:{{{1|{{{url|}}}}}}|của {{{1|{{{url}}}}}}|}} {{#if:{{{2|{{{url2|}}}}}}|cũng như {{{2|{{{url2}}}}}}|}} {{#if:{{{3|{{{url3|}}}}}}|và {{{3|{{{url3}}}}}}|}}
|2=
|notes=
|temp=db-copyvio-notice
|temp2=<nowiki>|url=</nowiki>{{{1|{{{url|URL}}}}}}{{#if:{{{2|{{{url2|}}}}}}|<nowiki>|url2=</nowiki>{{{2|{{{url2|}}}}}}|}}{{#if:{{{3|{{{url3|}}}}}}|<nowiki>|url3=</nowiki>{{{3|{{{url3|}}}}}}|}}
|summary=[[Wiktionary:Quyền tác giả|Vi phạm bản quyền]] {{#if:{{{1|{{{url|}}}}}}|của {{{1|{{{url}}}}}}|}}{{#if:{{{2|{{{url2|}}}}}}|, {{{2|{{{url2}}}}}}|}}{{#if:{{{3|{{{url3|}}}}}}|, {{{3|{{{url3}}}}}}|}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
6uvz4gotkzo0fcjxu5a9o2satppdniy
2353318
2353262
2026-05-14T18:15:42Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353318
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=C12
|1= với lý do: [[Wiktionary:Quyền tác giả|Vi phạm bản quyền]] {{#if:{{{1|{{{url|}}}}}}|của {{{1|{{{url}}}}}}|}} {{#if:{{{2|{{{url2|}}}}}}|cũng như {{{2|{{{url2}}}}}}|}} {{#if:{{{3|{{{url3|}}}}}}|và {{{3|{{{url3}}}}}}|}}
|2=
|notes=
|temp=db-copyvio-notice
|temp2=<nowiki>|url=</nowiki>{{{1|{{{url|URL}}}}}}{{#if:{{{2|{{{url2|}}}}}}|<nowiki>|url2=</nowiki>{{{2|{{{url2|}}}}}}|}}{{#if:{{{3|{{{url3|}}}}}}|<nowiki>|url3=</nowiki>{{{3|{{{url3|}}}}}}|}}
|summary=[[Wiktionary:Quyền tác giả|Vi phạm bản quyền]] {{#if:{{{1|{{{url|}}}}}}|của {{{1|{{{url}}}}}}|}}{{#if:{{{2|{{{url2|}}}}}}|, {{{2|{{{url2}}}}}}|}}{{#if:{{{3|{{{url3|}}}}}}|, {{{3|{{{url3}}}}}}|}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
alohhqxiej187sf7faqu4g6b6qvsyhs
Bản mẫu:db-copyvio
10
397096
2353287
2353125
2026-05-14T17:56:14Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c12]] sang [[Bản mẫu:db-c12]]
2353287
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c12]]
fd2ldb0yruu71bajuxoalndhzdc9hy9
Bản mẫu:db-author
10
397097
2353284
2353126
2026-05-14T17:55:21Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-c7]] sang [[Bản mẫu:db-c7]]
2353284
wikitext
text/x-wiki
#REDIRECT [[Bản mẫu:db-c7]]
rd2twb3mf5hjrpjgkjgvafi5ri4qyvt
kusarigama
0
397098
2353182
2353128
2026-05-14T13:20:46Z
Hiyuune
50834
Hiyuune đã đổi [[kusartest]] thành [[kusarigama]]
2353128
wikitext
text/x-wiki
{{db-nonsense}}
=={{langname|vi}}==
==={{ĐM|pron}}===
{{vi-pron}}
==={{ĐM|noun}}===
{{vi-noun}}
# [[aaa|Aaa]].
{{mẫu}}
a5fsmd4ui6jtaz60u5q71lh03v55w0y
2353184
2353182
2026-05-14T13:21:21Z
Hiyuune
50834
2353184
wikitext
text/x-wiki
=={{langname|ja}}==
==={{section|rom}}===
{{ja-romaji}}
# {{ja-romanization of|くさりがま}}
49q45an6z08p02jjt8ctxxcc024vu1r
Bản mẫu:db-mt1
10
397099
2353265
2353134
2026-05-14T17:40:21Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-mt1]] thành [[Bản mẫu:db-mt1]] (đã tắt đổi hướng)
2353133
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT1
|1= vì nội dung không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến
|temp=Db-nocontext-notice
|summary=Nội dung không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến
|notes={{#ifexpr:({{#time:U}}-{{#time:U|{{{cts|1-1-1970}}}}}) <= 900|'''Cảnh báo''': Trang này được tạo chưa đầy 15 phút trước. Theo thống nhất, các bài viết không nên được gắn thẻ [[WT:XN#MT1|XN:MT1]] ngay sau khi tạo vì chúng có thể vẫn đang trong quá trình hoàn thiện. Thời gian tối thiểu được đề xuất là 10 phút.}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0jgzd7j99jh5i0ev4trzp9yrnnfsd3e
2353311
2353265
2026-05-14T18:14:53Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353311
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT1
|1= vì nội dung không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến
|temp=Db-nocontext-notice
|summary=Nội dung không ngữ cảnh hoặc thiếu ngữ cảnh cần thiết để người khác xác định đúng định nghĩa từ được nói đến
|notes={{#ifexpr:({{#time:U}}-{{#time:U|{{{cts|1-1-1970}}}}}) <= 900|'''Cảnh báo''': Trang này được tạo chưa đầy 15 phút trước. Theo thống nhất, các bài viết không nên được gắn thẻ [[WT:XN#MT1|XN:MT1]] ngay sau khi tạo vì chúng có thể vẫn đang trong quá trình hoàn thiện. Thời gian tối thiểu được đề xuất là 10 phút.}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
r0c5sqk6sv0l3hqli52uqsf56kok3jq
Bản mẫu:db-nocontext
10
397100
2353274
2353135
2026-05-14T17:52:06Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-mt1]] sang [[Bản mẫu:db-mt1]]
2353274
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-mt1]]
l59tluxxxq2j0eumnqk2om0d9hszhry
Bản mẫu:db-mt2
10
397101
2353267
2353141
2026-05-14T17:40:45Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-mt2]] thành [[Bản mẫu:db-mt2]] (đã tắt đổi hướng)
2353141
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT2
|1= vì nội dung được chép nguyên văn từ một dự án ngôn ngữ khác sang {{#if:{{{1|{{{source|}}}}}}|tại [[:{{{1|{{{source}}}}}}]]|{{error|Không có liên kết đến bài viết trên dự án Wikimedia khác được cung cấp}}}}
|temp=db-foreign-notice
|temp2={{#if:{{{1|{{{link|}}}}}}|<nowiki>|</nowiki>source={{{1|{{{link}}}}}}|}}
|summary=Mục từ được chép nguyên văn ngôn ngữ khác {{#if:{{{1|{{{source|}}}}}}|[[:{{{1|{{{source|}}}}}}|tồn tại]]|tồn tại}} từ một dự án khác
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
fzxwa51qgdbs8ferxiog2m3f38uqekt
2353317
2353267
2026-05-14T18:15:35Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353317
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT2
|1= vì nội dung được chép nguyên văn từ một dự án ngôn ngữ khác sang {{#if:{{{1|{{{source|}}}}}}|tại [[:{{{1|{{{source}}}}}}]]|{{error|Không có liên kết đến bài viết trên dự án Wikimedia khác được cung cấp}}}}
|temp=db-foreign-notice
|temp2={{#if:{{{1|{{{link|}}}}}}|<nowiki>|</nowiki>source={{{1|{{{link}}}}}}|}}
|summary=Mục từ được chép nguyên văn ngôn ngữ khác {{#if:{{{1|{{{source|}}}}}}|[[:{{{1|{{{source|}}}}}}|tồn tại]]|tồn tại}} từ một dự án khác
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f3lxka2bja6u8rainuazpi5sv9dffs3
Bản mẫu:db-foreign
10
397102
2353275
2353138
2026-05-14T17:52:25Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-mt2]] sang [[Bản mẫu:db-mt2]]
2353275
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-mt2]]
p41l9gen51382un0u45b4527g9a0haf
Bản mẫu:db-mt3
10
397103
2353268
2353146
2026-05-14T17:40:58Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-mt3]] thành [[Bản mẫu:db-mt3]] (đã tắt đổi hướng)
2353145
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT3
|1= vì mục từ không có nội dung thực, hoặc chỉ gồm các liên kết, thể loại, phần "Xem thêm" và một câu lặp lại tiêu đề
|2=
|temp=Db-nocontent-notice
|summary=Mục từ không có nội dung thực
|notes={{#ifexpr:({{#time:U}}-{{#time:U|{{{cts|1-1-1970}}}}}) <= 900|'''Cảnh báo''': Trang này được tạo chưa đầy 15 phút trước. Theo thống nhất, các bài viết không nên được gắn thẻ [[WT:XN#MT3|XN:MT3]] ngay sau khi tạo vì chúng có thể vẫn đang trong quá trình hoàn thiện. Thời gian tối thiểu được đề xuất là 10 phút.}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
nju53gz11txh8em2ar8vx4xar9w2605
2353316
2353268
2026-05-14T18:15:28Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353316
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT3
|1= vì mục từ không có nội dung thực, hoặc chỉ gồm các liên kết, thể loại, phần "Xem thêm" và một câu lặp lại tiêu đề
|2=
|temp=Db-nocontent-notice
|summary=Mục từ không có nội dung thực
|notes={{#ifexpr:({{#time:U}}-{{#time:U|{{{cts|1-1-1970}}}}}) <= 900|'''Cảnh báo''': Trang này được tạo chưa đầy 15 phút trước. Theo thống nhất, các bài viết không nên được gắn thẻ [[WT:XN#MT3|XN:MT3]] ngay sau khi tạo vì chúng có thể vẫn đang trong quá trình hoàn thiện. Thời gian tối thiểu được đề xuất là 10 phút.}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
bzh6ou7mh9a5xy8d4cr33ss7q1m3xb6
Bản mẫu:db-nocontent
10
397104
2353276
2353147
2026-05-14T17:52:46Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-mt3]] sang [[Bản mẫu:db-mt3]]
2353276
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-mt3]]
c0xngsemp0vo8z726e0ze4b0vhtf5ra
Bản mẫu:db-mt7
10
397105
2353269
2353149
2026-05-14T17:47:26Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-mt7]] thành [[Bản mẫu:db-mt7]] (đã tắt đổi hướng)
2353148
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT7
|1= vì rõ ràng là không đủ [[Wiktionary:Quy định mục từ|tiêu chuẩn]]
|2={{{3|}}}
|temp=db-significance-notice
|notes=
|anote={{{anote|}}}
|summary=Mục từ rõ ràng không đủ [[Wiktionary:Quy định mục từ|tiêu chuẩn]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage: interwikis go to Wikidata, thank you! -->
</noinclude>
cjr82eivzmnl87f6wrburlg6n84h7dg
2353301
2353269
2026-05-14T18:13:31Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353301
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT7
|1= vì rõ ràng là không đủ [[Wiktionary:Quy định mục từ|tiêu chuẩn]]
|2={{{3|}}}
|temp=db-significance-notice
|notes=
|anote={{{anote|}}}
|summary=Mục từ rõ ràng không đủ [[Wiktionary:Quy định mục từ|tiêu chuẩn]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage: interwikis go to Wikidata, thank you! -->
</noinclude>
c7mxxntuoiimc0rjz9xoq8x6e1bsqsh
Bản mẫu:db-mt10
10
397108
2353266
2353153
2026-05-14T17:40:33Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-mt10]] thành [[Bản mẫu:db-mt10]] (đã tắt đổi hướng)
2353152
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT10
|1= vì mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn{{#if:{{{1|{{{article|}}}}}}|, [[:{{{1|{{{article}}}}}}]] ([{{fullurl:Special:ComparePages|page1={{FULLPAGENAMEE}}&page2={{urlencode:{{{1|{{{article|}}}}}}|wiki}}}} so sánh trang])|{{error| (Mục từ mà trang này có nội dung trùng lặp chưa được chỉ định.)}}}}
|2=
|temp=db-a10-notice
|temp2=<nowiki>|article=</nowiki>{{{1|{{{article|}}}}}}
|notes=
|summary=Mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn{{#if:{{{1|{{{article|}}}}}}|, [[:{{{1|{{{article}}}}}}]]|}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
b722gwvpcogsqkrmiedzazr2fuparwg
2353304
2353266
2026-05-14T18:14:03Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353304
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=MT10
|1= vì mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn{{#if:{{{1|{{{article|}}}}}}|, [[:{{{1|{{{article}}}}}}]] ([{{fullurl:Special:ComparePages|page1={{FULLPAGENAMEE}}&page2={{urlencode:{{{1|{{{article|}}}}}}|wiki}}}} so sánh trang])|{{error| (Mục từ mà trang này có nội dung trùng lặp chưa được chỉ định.)}}}}
|2=
|temp=db-a10-notice
|temp2=<nowiki>|article=</nowiki>{{{1|{{{article|}}}}}}
|notes=
|summary=Mục từ mới được tạo ra có nội dung sao chép từ một mục từ đã có sẵn{{#if:{{{1|{{{article|}}}}}}|, [[:{{{1|{{{article}}}}}}]]|}}
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
tghjof9rc11xu9cfjka7gorg2ihsugt
ういじゅん
0
397110
2353158
2026-05-14T12:34:17Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|泳じゅん}} [[bơi]].”
2353158
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|泳じゅん}} [[bơi]].
fc3w5a8vkvtqubpex6a9ga0ssn6iww9
かむん
0
397111
2353159
2026-05-14T12:37:25Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|食むん}} [[ăn]]. =={{langname|ryu}}== ==={{ĐM|verb}}=== {{ryu-head|verb}} # {{ryu-def|食むん}} [[ăn]].”
2353159
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|食むん}} [[ăn]].
=={{langname|ryu}}==
==={{ĐM|verb}}===
{{ryu-head|verb}}
# {{ryu-def|食むん}} [[ăn]].
f3kemm5serm8bt8ef2wybtlae7ihb36
しこ゚ーるん
0
397112
2353160
2026-05-14T12:43:23Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|作ーるん}} [[làm]].”
2353160
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|作ーるん}} [[làm]].
27memi5cilaty12gde0dwdzdoqva5go
作ーるん
0
397113
2353161
2026-05-14T12:44:20Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab}} ==={{ĐM|pron}}=== * {{IPA4|xug|/ɕi̥ko̞ːɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|しこ゚ーるん}} # [[làm]].”
2353161
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab}}
==={{ĐM|pron}}===
* {{IPA4|xug|/ɕi̥ko̞ːɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|しこ゚ーるん}}
# [[làm]].
3uzfjfiwfdyqtq12s07y63hsyovy7zq
して゚ぃーるん
0
397114
2353162
2026-05-14T12:45:35Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb|sort=して゚ぃいるん}} # {{xug-def|捨て゚ぃーるん}} [[bỏ]].”
2353162
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb|sort=して゚ぃいるん}}
# {{xug-def|捨て゚ぃーるん}} [[bỏ]].
kcqfv8676iiw9xy0ebgs81tgc1wzqww
捨て゚ぃーるん
0
397115
2353163
2026-05-14T12:46:25Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{xug-kanjitab}} ==={{ĐM|pron}}=== * {{IPA4|xug|/ɕi̥tiːɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|して゚ぃーるん}} # [[bỏ]].”
2353163
wikitext
text/x-wiki
=={{langname|ja}}==
{{xug-kanjitab}}
==={{ĐM|pron}}===
* {{IPA4|xug|/ɕi̥tiːɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|して゚ぃーるん}}
# [[bỏ]].
7xgacqvodm1gggmmii1zzxireib5vvl
たた゚ーか゚ん
0
397116
2353164
2026-05-14T12:48:27Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb|sort=たた゚あか゚ん}} # {{xug-def|戦ん}} [[đánh]].”
2353164
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb|sort=たた゚あか゚ん}}
# {{xug-def|戦ん}} [[đánh]].
9aojp7xtht8sp4oi06csrxqnp4hpwva
戦ん
0
397117
2353165
2026-05-14T12:49:10Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab}} ==={{ĐM|etym}}=== Cùng gốc với {{cog|ja|-}} {{ja-r|戦う|たたかう}} và {{cog|ryu|-}} {{ryu-r|戦ゆん|たたかゆん}}. ==={{ĐM|pron}}=== * {{IPA4|xug|/tʰataːkaŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|たた゚ーか゚ん}} # [[đánh]].”
2353165
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab}}
==={{ĐM|etym}}===
Cùng gốc với {{cog|ja|-}} {{ja-r|戦う|たたかう}} và {{cog|ryu|-}} {{ryu-r|戦ゆん|たたかゆん}}.
==={{ĐM|pron}}===
* {{IPA4|xug|/tʰataːkaŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|たた゚ーか゚ん}}
# [[đánh]].
km2xhq2gpeju6x7ah9x5tw34jb14zj1
ぱなーしーすん
0
397118
2353166
2026-05-14T12:51:08Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|話しーすん}} [[nói]].”
2353166
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|話しーすん}} [[nói]].
5r23eqxh6g3yvj538tjdr670bv4r0qd
話しーすん
0
397119
2353167
2026-05-14T12:57:05Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab}} ==={{ĐM|pron}}=== * {{IPA4|xug|/pʰanaːɕiː suŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|ぱなーしーすん}} # [[nói]].”
2353167
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab}}
==={{ĐM|pron}}===
* {{IPA4|xug|/pʰanaːɕiː suŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|ぱなーしーすん}}
# [[nói]].
rjoyp11pgekpz3s9j6xdyivs929xrmg
ぱなーすん
0
397120
2353168
2026-05-14T12:59:35Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb|sort=はなあすん}} # {{xug-def|離ーすん}} [[tách]].”
2353168
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb|sort=はなあすん}}
# {{xug-def|離ーすん}} [[tách]].
m72sys0e13zd1gs8msaj6qs46gogq63
離ーすん
0
397121
2353169
2026-05-14T13:00:06Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab|ぱな}} ==={{ĐM|pron}}=== * {{IPA4|xug|/pʰanaːsuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|ぱなーすん}} # [[tách]].”
2353169
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab|ぱな}}
==={{ĐM|pron}}===
* {{IPA4|xug|/pʰanaːsuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|ぱなーすん}}
# [[tách]].
ofnthl5sxwv38s5gsm7scx66erzgw7t
ぴなーるん
0
397122
2353170
2026-05-14T13:02:27Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pron}}=== * {{IPA4|xug|/pʰinaːɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb}} # [[giảm]].”
2353170
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pron}}===
* {{IPA4|xug|/pʰinaːɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb}}
# [[giảm]].
39bxss1ddz3vm5mi89ttllb1dpoze1j
ふき゚るん
0
397123
2353171
2026-05-14T13:04:09Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|起き゚るん}} [[dậy]].”
2353171
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|起き゚るん}} [[dậy]].
077dow92u43zvf274okjkqhqz5oj7er
起き゚るん
0
397124
2353172
2026-05-14T13:05:02Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab}} ==={{ĐM|pron}}=== * {{IPA4|xug|/ɸukiɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|ふき゚るん}} # [[dậy]].”
2353172
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab}}
==={{ĐM|pron}}===
* {{IPA4|xug|/ɸukiɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|ふき゚るん}}
# [[dậy]].
4evo8cli1dps5qnw6qem6b8oufmbjza
ふすん
0
397125
2353173
2026-05-14T13:06:22Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|押すん}} [[đẩy]].”
2353173
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|押すん}} [[đẩy]].
d3t8q9hkr6j6ttcpc0xvghvww87ec65
ふちゅん
0
397126
2353174
2026-05-14T13:07:34Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|打ちゅん}} [[đánh]], [[đập]].”
2353174
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|打ちゅん}} [[đánh]], [[đập]].
756timpilv6o03yolooemxb83qrcwjk
ふみるん
0
397127
2353175
2026-05-14T13:08:17Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb}} # {{xug-def|込みるん}} [[bao gồm]].”
2353175
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb}}
# {{xug-def|込みるん}} [[bao gồm]].
224wrinbpjce85q908owz8f7izovp9r
込みるん
0
397128
2353176
2026-05-14T13:09:44Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab}} ==={{ĐM|pron}}=== * {{IPA4|xug|/ɸumiɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|ふみるん}} # [[bao gồm]].”
2353176
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab}}
==={{ĐM|pron}}===
* {{IPA4|xug|/ɸumiɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|ふみるん}}
# [[bao gồm]].
hjuk4bqiwi5b8bj4t6c0sgj5oul70ro
Thể loại:Từ đánh vần với 込 tiếng Kunigami
14
397129
2353177
2026-05-14T13:10:02Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353177
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 込 theo ngôn ngữ
14
397130
2353178
2026-05-14T13:11:00Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353178
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji bậc trung học tiếng Kunigami
14
397131
2353179
2026-05-14T13:11:35Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353179
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với jōyō kanji tiếng Kunigami
14
397132
2353180
2026-05-14T13:12:13Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353180
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji bậc trung học theo ngôn ngữ
14
397133
2353181
2026-05-14T13:12:38Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353181
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
寿美子
0
397135
2353185
2026-05-14T14:52:34Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353185
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
壽美子
0
397136
2353186
2026-05-14T14:53:34Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353186
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
須実子
0
397137
2353187
2026-05-14T14:54:20Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353187
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
須實子
0
397138
2353188
2026-05-14T14:54:30Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353188
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
壽実子
0
397139
2353189
2026-05-14T14:55:54Z
WhoAlone
40420
Trang mới: “{{also|寿実子}} =={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353189
wikitext
text/x-wiki
{{also|寿実子}}
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
oi441za7jmdy27gh1qvscxg3pr1mmmz
寿実子
0
397140
2353190
2026-05-14T14:57:07Z
WhoAlone
40420
Trang mới: “{{also|壽実子}} =={{langname|ja}}== {{ja-kanjitab|す|み|こ|yomi=o,k2}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353190
wikitext
text/x-wiki
{{also|壽実子}}
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ|yomi=o,k2}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
432mi62fwkdeio2h8mr39f6r574mx0l
壽實子
0
397141
2353191
2026-05-14T14:57:19Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ|yomi=o,k2}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353191
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ|yomi=o,k2}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
4dcuehckm27y607bdi32pq626tgkcss
純実子
0
397142
2353192
2026-05-14T14:59:48Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|すみ|k1=す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353192
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|すみ|k1=す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
mwjc2ezf6grdl2t048ao53vkmuvydcz
純實子
0
397143
2353193
2026-05-14T14:59:56Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|すみ|k1=す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353193
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|すみ|k1=す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
mwjc2ezf6grdl2t048ao53vkmuvydcz
崇実子
0
397144
2353194
2026-05-14T15:01:30Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353194
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
崇實子
0
397145
2353195
2026-05-14T15:02:06Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353195
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
寸実子
0
397146
2353196
2026-05-14T15:02:37Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353196
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
寸實子
0
397147
2353197
2026-05-14T15:02:55Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353197
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
Bản mẫu:fa-basic/head
10
397148
2353198
2026-05-14T15:25:05Z
Hiyuune
50834
Trang mới: “{{inflection-table-top|title=Dạng cơ bản của {{m-self|fa|{{pagename}}|tr=-}}|palette=blue|tall=yes}} ! class="outer" | ! class="outer" | số ít ! class="outer" | số nhiều |- ! nguyên mẫu | {{l-self|fa||{{{sg}}}|tr={{{sg-tr}}}}} | {{l-self|fa||{{{pl}}}{{#if:{{{pl-c|}}}|، {{{pl-c}}}<small><sup>△</sup></small>}}|tr={{{pl-tr}}}{{#if:{{{pl-c|}}}|, {{{pl-c-tr}}}<small><sup>△</sup></small>}}}} |- ! tân ngữ trực tiếp xác định | {{l-self|fa||{{{sg-r…”
2353198
wikitext
text/x-wiki
{{inflection-table-top|title=Dạng cơ bản của {{m-self|fa|{{pagename}}|tr=-}}|palette=blue|tall=yes}}
! class="outer" |
! class="outer" | số ít
! class="outer" | số nhiều
|-
! nguyên mẫu
| {{l-self|fa||{{{sg}}}|tr={{{sg-tr}}}}}
| {{l-self|fa||{{{pl}}}{{#if:{{{pl-c|}}}|، {{{pl-c}}}<small><sup>△</sup></small>}}|tr={{{pl-tr}}}{{#if:{{{pl-c|}}}|, {{{pl-c-tr}}}<small><sup>△</sup></small>}}}}
|-
! tân ngữ trực tiếp xác định
| {{l-self|fa||{{{sg-ra}}}{{#if:{{{sg-ro|}}}|، {{{sg-ro}}}<small><sup>△</sup></small>}}|tr={{{sg-ra-tr}}}{{#if:{{{sg-ro|}}}|, {{{sg-ro-tr}}}<small><sup>△</sup></small>}}}}
| {{l-self|fa||{{{pl-ra}}}{{#if:{{{pl-ro|}}}|، {{{pl-ro}}}<small><sup>△</sup></small>}}|tr={{{pl-ra-tr}}}{{#if:{{{pl-ro|}}}|, {{{pl-ro-tr}}}<small><sup>△</sup></small>}}}}
|-
! [[:en:Appendix:Persian ezâfe|ezâfe]]
| {{l-self|fa||{{{sg-ezafe}}}|tr={{{sg-ezafe-tr}}}}}
| {{l-self|fa||{{{pl-ezafe}}}{{#if:{{{pl-ezafe-c|}}}|، {{{pl-ezafe-c}}}<small><sup>△</sup></small>}}|tr={{{pl-ezafe-tr}}}{{#if:{{{pl-ezafe-c|}}}|, {{{pl-ezafe-c-tr}}}<small><sup>△</sup></small>}}}}
|-
! bất định<br>hoặc xác định quan hệ
| {{l-self|fa||{{{mark}}}|tr={{{mark-tr}}}}}
| {{l-self|fa||{{{pl-mark}}}{{#if:{{{pl-mark-c|}}}|، {{{pl-mark-c}}}<small><sup>△</sup></small>}}|tr={{{pl-mark-tr}}}{{#if:{{{pl-mark-c|}}}|, {{{pl-mark-c-tr}}}<small><sup>△</sup></small>}}}}
{{inflection-table-bottom|notes={{#if:{{{pl-mark-c|{{{sg-mark-c|{{{pl-ezafec|{{{pl-c|{{{pl-ro|{{{sg-ro|}}}}}}}}}}}}}}}}}}|
<sup>△</sup> Thông tục.}}}}<noinclude>{{tcat|ndecl}}</noinclude>
p4nwbsawpdhv7yvvwpmv3rdh5v4o9ih
parvenus
0
397149
2353201
2026-05-14T15:30:28Z
Hiyuune
50834
Trang mới: “{{also|Parvenüs}} =={{langname|en}}== ==={{section|n}}=== {{head|en|Biến thể hình thái danh từ}} # {{plural of|en|parvenu}} =={{langname|fr}}== ==={{section|ptcp}}=== {{head|fr|Biến thể hình thái phân từ quá khứ|g=m-p}} # {{masculine plural of|fr|parvenu}}”
2353201
wikitext
text/x-wiki
{{also|Parvenüs}}
=={{langname|en}}==
==={{section|n}}===
{{head|en|Biến thể hình thái danh từ}}
# {{plural of|en|parvenu}}
=={{langname|fr}}==
==={{section|ptcp}}===
{{head|fr|Biến thể hình thái phân từ quá khứ|g=m-p}}
# {{masculine plural of|fr|parvenu}}
fq24irfiednb2s51owam07c8eaopoyv
Bản mẫu:ang-suffix
10
397150
2353205
2026-05-14T15:36:19Z
Hiyuune
50834
Trang mới: “{{#invoke:checkparams|error}}<!-- Validate template parameters -->{{head|ang|Hậu tố|head={{{head|}}}|head2={{{head2|}}}|sort={{{sort|}}}|cat2={{#switch:{{{type|}}}|g={{{g|}}}|g2={{{g2|}}}|g3={{{g3|}}}|g4={{{g4|}}}|g5={{{g5|}}}|noun=Dạng hậu tố dan từ|adjective=Dạng hậu tố tính từ|verb=Dạng hậu tố động từ|adverb=Dạng hậu tố phó từ|#default=}}}}<!-- --><noinclude>{{tài liệu}}</noinclude>”
2353205
wikitext
text/x-wiki
{{#invoke:checkparams|error}}<!-- Validate template parameters
-->{{head|ang|Hậu tố|head={{{head|}}}|head2={{{head2|}}}|sort={{{sort|}}}|cat2={{#switch:{{{type|}}}|g={{{g|}}}|g2={{{g2|}}}|g3={{{g3|}}}|g4={{{g4|}}}|g5={{{g5|}}}|noun=Dạng hậu tố dan từ|adjective=Dạng hậu tố tính từ|verb=Dạng hậu tố động từ|adverb=Dạng hậu tố phó từ|#default=}}}}<!--
--><noinclude>{{tài liệu}}</noinclude>
bjvjf3vft2mjyhmrqw567r1mm0fttje
-lice
0
397151
2353206
2026-05-14T15:38:27Z
Hiyuune
50834
Trang mới: “=={{langname|ang}}== ==={{section|etym}}=== {{etymon|ang|id=phó từ|:inh|gem-pro:*-līkê<ety:af<*-līkaz><*-ê>>|:afeq|-līċ|-e<id:phó từ>}} Từ {{inh|ang|gem-pro|*-līkê}}, tương đương từ {{mention|ang|-līċ|pos=Hậu tố tính từ}} + {{affix|ang|-e|pos1=Hậu tố phó từ}}. So sánh với {{cog|non|-liga}}. ==={{section|pron}}=== * {{ang-IPA|līċe}} ==={{section|suffix}}=== {{ang-suffix|head=-līċe|type=adverb}} # [[-ly]] (hậu tố phó t…”
2353206
wikitext
text/x-wiki
=={{langname|ang}}==
==={{section|etym}}===
{{etymon|ang|id=phó từ|:inh|gem-pro:*-līkê<ety:af<*-līkaz><*-ê>>|:afeq|-līċ|-e<id:phó từ>}}
Từ {{inh|ang|gem-pro|*-līkê}}, tương đương từ {{mention|ang|-līċ|pos=Hậu tố tính từ}} + {{affix|ang|-e|pos1=Hậu tố phó từ}}. So sánh với {{cog|non|-liga}}.
==={{section|pron}}===
* {{ang-IPA|līċe}}
==={{section|suffix}}===
{{ang-suffix|head=-līċe|type=adverb}}
# [[-ly]] (hậu tố phó từ)
===={{section|drv}}====
{{suffixsee|ang}}
===={{section|desc}}====
* {{desc|enm|-lice|-liche|-li|-ly}}
** {{desc|en|-ly|id=phó từ}}
** {{desc|sco|-lie|-ly|id2=phó từ}}
kybcul5f1fvwcwvwhgiazfbda68a5xf
2353207
2353206
2026-05-14T15:39:00Z
Hiyuune
50834
/* Tiếng Anh cổ */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353207
wikitext
text/x-wiki
=={{langname|ang}}==
==={{section|etym}}===
{{etymon|ang|id=phó từ|:inh|gem-pro:*-līkê<ety:af<*-līkaz><*-ê>>|:afeq|-līċ|-e<id:phó từ>}}
Từ {{inh|ang|gem-pro|*-līkê}}, tương đương từ {{mention|ang|-līċ|pos=hậu tố tính từ}} + {{affix|ang|-e|pos1=hậu tố phó từ}}. So sánh với {{cog|non|-liga}}.
==={{section|pron}}===
* {{ang-IPA|līċe}}
==={{section|suffix}}===
{{ang-suffix|head=-līċe|type=adverb}}
# [[-ly]] (hậu tố phó từ)
===={{section|drv}}====
{{suffixsee|ang}}
===={{section|desc}}====
* {{desc|enm|-lice|-liche|-li|-ly}}
** {{desc|en|-ly|id=phó từ}}
** {{desc|sco|-lie|-ly|id2=phó từ}}
8poqzvwzgnyuxur9a7g8d9jtt4ls972
Bản mẫu:db-tl1
10
397152
2353208
2026-05-14T15:39:19Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||date={{SAFESUBST:<noinclude />REVISIONTIMESTAMP}}|$B={{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=TL1 |1= vì đây là thể loại trống hoặc không cần thiết |temp=Db-catempty-notice |self=yes |summary=Thể loại trống hoặc không cần thiết |help={{{help|}}} |pagetype_override=thể loại }}<includeonly>{{#ifeq:{{PAGESINCAT:{{PAGENAME}}}}|0||{{error|Thể loại này không trố…”
2353208
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||date={{SAFESUBST:<noinclude />REVISIONTIMESTAMP}}|$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TL1
|1= vì đây là thể loại trống hoặc không cần thiết
|temp=Db-catempty-notice
|self=yes
|summary=Thể loại trống hoặc không cần thiết
|help={{{help|}}}
|pagetype_override=thể loại
}}<includeonly>{{#ifeq:{{PAGESINCAT:{{PAGENAME}}}}|0||{{error|Thể loại này không trống!}}}}
{{category handler
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage and interwikis to Wikidata, thank you! -->
</noinclude>
ssedd8wart1o4wwh83f2ml44d6izfj2
2353212
2353208
2026-05-14T15:43:45Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-catempty]] thành [[Bản mẫu:Db-tl1]]
2353208
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||date={{SAFESUBST:<noinclude />REVISIONTIMESTAMP}}|$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TL1
|1= vì đây là thể loại trống hoặc không cần thiết
|temp=Db-catempty-notice
|self=yes
|summary=Thể loại trống hoặc không cần thiết
|help={{{help|}}}
|pagetype_override=thể loại
}}<includeonly>{{#ifeq:{{PAGESINCAT:{{PAGENAME}}}}|0||{{error|Thể loại này không trống!}}}}
{{category handler
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage and interwikis to Wikidata, thank you! -->
</noinclude>
ssedd8wart1o4wwh83f2ml44d6izfj2
2353271
2353212
2026-05-14T17:47:59Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-tl1]] thành [[Bản mẫu:db-tl1]] (đã tắt đổi hướng)
2353208
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||date={{SAFESUBST:<noinclude />REVISIONTIMESTAMP}}|$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TL1
|1= vì đây là thể loại trống hoặc không cần thiết
|temp=Db-catempty-notice
|self=yes
|summary=Thể loại trống hoặc không cần thiết
|help={{{help|}}}
|pagetype_override=thể loại
}}<includeonly>{{#ifeq:{{PAGESINCAT:{{PAGENAME}}}}|0||{{error|Thể loại này không trống!}}}}
{{category handler
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage and interwikis to Wikidata, thank you! -->
</noinclude>
ssedd8wart1o4wwh83f2ml44d6izfj2
2353322
2353271
2026-05-14T18:16:11Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353322
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||date={{SAFESUBST:<noinclude />REVISIONTIMESTAMP}}|$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TL1
|1= vì đây là thể loại trống hoặc không cần thiết
|temp=Db-catempty-notice
|self=yes
|summary=Thể loại trống hoặc không cần thiết
|help={{{help|}}}
|pagetype_override=thể loại
}}<includeonly>{{#ifeq:{{PAGESINCAT:{{PAGENAME}}}}|0||{{error|Thể loại này không trống!}}}}
{{category handler
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage and interwikis to Wikidata, thank you! -->
</noinclude>
rrau6w1i2t5ns2pua3si8y1pjmv7r83
limoge
0
397153
2353209
2026-05-14T15:39:55Z
Hiyuune
50834
+
2353209
wikitext
text/x-wiki
==tiếng Pháp==
===Chia động từ===
{{head|fr|chia động từ form}}
# {{infl of|fr|limoger||1//3|s|pres|ind//sub|;|2|s|impr}}
qh02qccp1w7h98j92woky7v07w35z05
2353210
2353209
2026-05-14T15:40:59Z
Hiyuune
50834
2353210
wikitext
text/x-wiki
{{also|limogé}}
=={{langname|fr}}==
==={{section|v}}===
{{head|fr|Biến thể hình thái động từ}}
# {{inflection of|fr|limoger||ind//sub|pres|ở|1//3|s|;|impr|ở|2|s}}
==={{section|ana}}===
* {{l|fr|gliome}}
9eg5950041sgs87fcvg7hjnycezuhnc
Bản mẫu:RQ:Proust Temps
10
397154
2353211
2026-05-14T15:41:33Z
TheHighFighter2
42988
Trang mới: “{{#invoke:quote|call_quote_template |fr |author=Marcel Proust |authorlink=Marcel Proust |series={{w|Đi tìm thời gian đã mất|À la recherche du temps perdu}} |title={{#switch: {{{volume|1}}} |1=Du côté de chez Swann |2=À l’ombre des jeunes filles en fleurs |3=Le Côté de Guermantes |4=Sodome et Gomorrhe |5=La Prisonnière |6=Albertine disparue |7=Le Temps retrouvé }} |trans-title={{#switch: {{{volume|1}}} |1=Bên phía nhà Swann |2=Dưới bóng những cô…”
2353211
wikitext
text/x-wiki
{{#invoke:quote|call_quote_template
|fr
|author=Marcel Proust
|authorlink=Marcel Proust
|series={{w|Đi tìm thời gian đã mất|À la recherche du temps perdu}}
|title={{#switch: {{{volume|1}}}
|1=Du côté de chez Swann
|2=À l’ombre des jeunes filles en fleurs
|3=Le Côté de Guermantes
|4=Sodome et Gomorrhe
|5=La Prisonnière
|6=Albertine disparue
|7=Le Temps retrouvé
}}
|trans-title={{#switch: {{{volume|1}}}
|1=Bên phía nhà Swann
|2=Dưới bóng những cô gái đương hoa
|3=Về phía nhà Guermantes
|4=Sodome và Gomorrhe
|5=Cô gái bị cầm tù
|6=Albertine biến mất
|7=Thời gian tìm lại được
}}
|year={{#switch: {{{volume|1}}}
|1=1913
|2=1918
|3=1920–1921
|4=1921
|5=1923
|6=1925
|7=1927
}}
|url={{fullurl:s:fr:{{#switch: {{{volume|1}}}
|1=Du côté de chez Swann
|2=À l’ombre des jeunes filles en fleurs
|3=Le Côté de Guermantes
|4=Sodome et Gomorrhe
|5=La Prisonnière
|6=Albertine disparue
|7=Le Temps retrouvé
}}/Texte entier}}
|section={{#if: {{{part|}}}|part {{{part|}}}|}}
|translation={{{t|{{{translation|}}}}}}
|propagateparams=chapter
|allowparams=volume,t,translation,part
}}<noinclude>{{documentation}}</noinclude>
hh7fk0i7l4lwxk6tps96moe0pgw9nrw
Bản mẫu:db-catempty
10
397155
2353213
2026-05-14T15:43:45Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-catempty]] thành [[Bản mẫu:Db-tl1]]
2353213
wikitext
text/x-wiki
#đổi [[Bản mẫu:Db-tl1]]
tqlx3sblr8puv9srbyst8bny3j2n9za
2353277
2353213
2026-05-14T17:53:14Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-tl1]] sang [[Bản mẫu:db-tl1]]
2353277
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-tl1]]
s2mfks8283onqbmhvho9ost0h59ah8u
Thể loại:Mục từ có cách phát âm IPA tiếng Musi
14
397156
2353215
2026-05-14T15:52:48Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2353215
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Bảo trì mục từ tiếng Musi
14
397157
2353216
2026-05-14T15:53:14Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2353216
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Bản mẫu:db-bm1
10
397158
2353217
2026-05-14T15:55:07Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=BM1 |1= vì đây là bản mẫu có nội dung hoặc cách trình bày vi phạm quy định |2= |summary=Bản mẫu có nội dung hoặc cách trình bày vi phạm quy định |category= |help={{{help|}}} |temp=Db-bm1-notice }}<includeonly>{{Xử lý thể loại | all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]] |…”
2353217
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM1
|1= vì đây là bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|2=
|summary=Bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
ooyry0f5iz5hw6lvnhza4a62o3icb4n
2353218
2353217
2026-05-14T15:55:19Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-bm1]] thành [[Bản mẫu:Db-bm1]]
2353217
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM1
|1= vì đây là bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|2=
|summary=Bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
ooyry0f5iz5hw6lvnhza4a62o3icb4n
2353263
2353218
2026-05-14T17:39:40Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-bm1]] thành [[Bản mẫu:db-bm1]] qua đổi hướng (đã tắt đổi hướng)
2353217
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM1
|1= vì đây là bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|2=
|summary=Bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
ooyry0f5iz5hw6lvnhza4a62o3icb4n
2353302
2353263
2026-05-14T18:13:49Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353302
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM1
|1= vì đây là bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|2=
|summary=Bản mẫu có nội dung hoặc cách trình bày vi phạm quy định
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
jz6ydyuxujh5i4upifomuvfa3nh9890
Bản mẫu:db-bm2
10
397160
2353220
2026-05-14T15:57:16Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=BM2 |1= vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào |2= |summary=Bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào |category= |help={{{help|}}} |temp=Db-bm1-notice }}<includeonly>{{Xử lý thể loạ…”
2353220
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM2
|1= vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào
|2=
|summary=Bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
m8zy894eobpysw5eftyw8nzerog1agf
2353221
2353220
2026-05-14T15:57:37Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-bm2]] thành [[Bản mẫu:db-bm2]]
2353220
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM2
|1= vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào
|2=
|summary=Bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
m8zy894eobpysw5eftyw8nzerog1agf
2353223
2353221
2026-05-14T15:57:48Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-bm2]] thành [[Bản mẫu:Db-bm2]] qua đổi hướng
2353220
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM2
|1= vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào
|2=
|summary=Bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
m8zy894eobpysw5eftyw8nzerog1agf
2353225
2353223
2026-05-14T16:00:49Z
Kateru Zakuro
34522
2353225
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM2
|1={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào}}
|2=
|summary={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào}}
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
r46ucr1s4ieia1hhvkru2wzf5p8xddr
2353264
2353225
2026-05-14T17:40:02Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-bm2]] thành [[Bản mẫu:db-bm2]] qua đổi hướng (đã tắt đổi hướng)
2353225
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM2
|1={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào}}
|2=
|summary={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào}}
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
r46ucr1s4ieia1hhvkru2wzf5p8xddr
2353300
2353264
2026-05-14T18:13:17Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353300
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=BM2
|1={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào}}
|2=
|summary={{#if:{{{rationale|{{{wording|{{{reason|{{{1|}}}}}}}}}}}}|  vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|  vì đây là bản mẫu dư thừa, không cần thiết, không thể được sử dụng hữu ích theo bất kỳ cách nào}}
|category=
|help={{{help|}}}
|temp=Db-bm1-notice
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
nj05giz3tadf42nihnkcw213pb8ah6h
Bản mẫu:db-talk
10
397163
2353226
2026-05-14T16:05:50Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-c8|trang thảo luận của một trang|summary=trang thảo luận của một trang không tồn tại hoặc đã bị xóa|category={{{category|<includeonly>¬</includeonly>}}}|help={{{help|}}}}}}}<noinclude> {{documentation}} [[Thể loại:Bản mẫu xóa trang]] <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude>”
2353226
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-c8|trang thảo luận của một trang|summary=trang thảo luận của một trang không tồn tại hoặc đã bị xóa|category={{{category|<includeonly>¬</includeonly>}}}|help={{{help|}}}}}}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7wi1xf0vzhokx9te31nii84mxjh3op8
2353227
2353226
2026-05-14T16:06:00Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-talk]] thành [[Bản mẫu:Db-talk]]
2353226
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-c8|trang thảo luận của một trang|summary=trang thảo luận của một trang không tồn tại hoặc đã bị xóa|category={{{category|<includeonly>¬</includeonly>}}}|help={{{help|}}}}}}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7wi1xf0vzhokx9te31nii84mxjh3op8
2353270
2353227
2026-05-14T17:47:40Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-talk]] thành [[Bản mẫu:db-talk]] qua đổi hướng (đã tắt đổi hướng)
2353226
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-c8|trang thảo luận của một trang|summary=trang thảo luận của một trang không tồn tại hoặc đã bị xóa|category={{{category|<includeonly>¬</includeonly>}}}|help={{{help|}}}}}}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7wi1xf0vzhokx9te31nii84mxjh3op8
2353297
2353270
2026-05-14T18:08:37Z
Kateru Zakuro
34522
2353297
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-c8|trang thảo luận của một trang|summary=trang thảo luận của một trang không tồn tại hoặc đã bị xóa|category={{{category|<includeonly>¬</includeonly>}}}|help={{{help|}}}}}}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
qo4phn8x397zd2ttiyx36dgprfdq0xj
selawat cita'
0
397166
2353231
2026-05-14T16:44:29Z
TheHighFighter2
42988
Trang mới: “=={{langname|mui}}== ==={{ĐM|etym}}=== {{etymon|mui|id=tiền|:af|selawat<id:phúc lành>|cita'<id:in>|tree=}} Từ {{com|mui|selawat|t1=phúc lành|cita'|t2=được in}}. ==={{ĐM|pron}}=== * {{IPA4|mui|/səlawat t͡ʃitaʔ/|[sə.laˈwat̚ t͡ʃiˈtaʔ]}} * {{audio|mui|LL-Q12497929 (mis)-Swarabakti-selawat cita'.wav|a=Palembang}} ==={{ĐM|noun}}=== {{head|mui|noun}} # {{lb|mui|figurative}} [[tiền|Tiền]]. #: {{syn|mui|duit|q2=Palembang|pulus|q3=Palembang, bebaso…”
2353231
wikitext
text/x-wiki
=={{langname|mui}}==
==={{ĐM|etym}}===
{{etymon|mui|id=tiền|:af|selawat<id:phúc lành>|cita'<id:in>|tree=}}
Từ {{com|mui|selawat|t1=phúc lành|cita'|t2=được in}}.
==={{ĐM|pron}}===
* {{IPA4|mui|/səlawat t͡ʃitaʔ/|[sə.laˈwat̚ t͡ʃiˈtaʔ]}}
* {{audio|mui|LL-Q12497929 (mis)-Swarabakti-selawat cita'.wav|a=Palembang}}
==={{ĐM|noun}}===
{{head|mui|noun}}
# {{lb|mui|figurative}} [[tiền|Tiền]].
#: {{syn|mui|duit|q2=Palembang|pulus|q3=Palembang, bebaso|redano|q4=Musi Thượng|sén}}
#* {{quote-book|id|termlang=mui|year=1984|author=Tim Proyek Inventarisasi dan Dokumentasi Kebudayaan Daerah|title=Ungkapan tradisional sebagai sumber informasi kebudayaan daerah Sumatera Selatan|trans-title=Thành ngữ truyền thống: Nguồn thông tin văn hóa vùng Nam Sumatra|url=https://repositori.kemdikbud.go.id/13523/|publisher=Departemen Pendidikan dan Kebudayaan|location=Jakarta|page=27|text=Jangan banyak igek sue kepengen kalu dak naru '''selawat citak'''|norm=Jangan banya' igé' sué kepéngén kalu da' naru '''selawat cita''''|t=Đừng hy vọng quá cao nếu bạn không có '''tiền'''|lb=Pegagan}}
#* {{quote-journal|mui|date=2016-05-26|author=Mang Kodir|title=Cek-Mamad: Ngampuk|trans-title=Ông Mamad: Khỏe khoang|archiveurl=https://web.archive.org/web/20250326185001/https://issuu.com/korankito/docs/edisi_26_mei_2016/1|url=https://issuu.com/korankito/docs/edisi_26_mei_2016/1|archivedate=2025-03-27|work=Koran Kito|publisher=Gambino Media Buana|location=Palembang|page=3|text=Sisip sisip diminta wong ngenjuk kato sambutan. Dak terti '''selawat citak''' tu boleh dari mano.|norm=Sisip-sisip diminta' wong ngenju' kato sambutan. Da' tereti '''selawat cita'''' tu bolé dari mano.|t=Thỉnh thoảng, mọi người mời ông ấy lên phát biểu tại sự kiện. Họ không biết '''tiền''' của ông ấy là từ đâu mà có.|lb=Palembang}}
==={{ĐM|further}}===
* {{R:mui:Zulkifly:2007|entry=SELAWAT CITAK|page=206}}
{{C|mui|Tiền}}
lft7pw9d1kzfeqxrszbek0sxrliciyj
Thể loại:Danh từ tiếng Musi
14
397167
2353232
2026-05-14T16:47:25Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2353232
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Bản mẫu:db-tv1
10
397169
2353237
2026-05-14T17:19:44Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|}}}|1|0}}+{{#ifeq:{{PAGENAME}}|{{BASEPAGENAME}}|0|1}}| {{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=TV1 |1= vì thành viên yêu cầu xóa{{#if:{{REVISIONUSER}}||. {{làm mới}} để xem sửa đổi mới nhất}} |2= |self=yes |summary=Thành viên yêu cầu xóa |rationale=<includeonly>{{#if:{{REVISIONUSER}}|{{#ifeq:{{ROOTPAGE…”
2353237
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|}}}|1|0}}+{{#ifeq:{{PAGENAME}}|{{BASEPAGENAME}}|0|1}}|
{{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV1
|1= vì thành viên yêu cầu xóa{{#if:{{REVISIONUSER}}||. {{làm mới}} để xem sửa đổi mới nhất}}
|2=
|self=yes
|summary=Thành viên yêu cầu xóa
|rationale=<includeonly>{{#if:{{REVISIONUSER}}|{{#ifeq:{{ROOTPAGENAME}}|{{REVISIONUSER}}||'''Cảnh báo: Trang này được sửa lần cuối bởi một thành viên khác với chủ sở hữu của không gian thành viên này. Vui lòng đảm bảo rằng trang đã được chính thành viên của không gian thành viên gắn thẻ trước khi xóa. '''}}}}{{{rationale|}}}</includeonly>
}}
|<span style="color:red; font-weight:bold; font-size:120%;">Vui lòng dùng thông số <kbd>rationale</kbd> parameter Để giải thích lý do tại sao trang thảo luận thành viên này nên bị xóa. (Ví dụ: <kbd>{{Db-tv1|rationale= }}</kbd>.) Thanks!</span>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
|nocat={{{nocat|}}}
|category2={{{category|¬}}}
|page=Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
fldg0w2q0couon2dzr06q2y25w4m140
2353238
2353237
2026-05-14T17:19:59Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-userreq]] thành [[Bản mẫu:Db-tv1]]
2353237
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|}}}|1|0}}+{{#ifeq:{{PAGENAME}}|{{BASEPAGENAME}}|0|1}}|
{{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV1
|1= vì thành viên yêu cầu xóa{{#if:{{REVISIONUSER}}||. {{làm mới}} để xem sửa đổi mới nhất}}
|2=
|self=yes
|summary=Thành viên yêu cầu xóa
|rationale=<includeonly>{{#if:{{REVISIONUSER}}|{{#ifeq:{{ROOTPAGENAME}}|{{REVISIONUSER}}||'''Cảnh báo: Trang này được sửa lần cuối bởi một thành viên khác với chủ sở hữu của không gian thành viên này. Vui lòng đảm bảo rằng trang đã được chính thành viên của không gian thành viên gắn thẻ trước khi xóa. '''}}}}{{{rationale|}}}</includeonly>
}}
|<span style="color:red; font-weight:bold; font-size:120%;">Vui lòng dùng thông số <kbd>rationale</kbd> parameter Để giải thích lý do tại sao trang thảo luận thành viên này nên bị xóa. (Ví dụ: <kbd>{{Db-tv1|rationale= }}</kbd>.) Thanks!</span>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
|nocat={{{nocat|}}}
|category2={{{category|¬}}}
|page=Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
fldg0w2q0couon2dzr06q2y25w4m140
2353272
2353238
2026-05-14T17:48:11Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-tv1]] thành [[Bản mẫu:db-tv1]] (đã tắt đổi hướng)
2353237
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|}}}|1|0}}+{{#ifeq:{{PAGENAME}}|{{BASEPAGENAME}}|0|1}}|
{{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV1
|1= vì thành viên yêu cầu xóa{{#if:{{REVISIONUSER}}||. {{làm mới}} để xem sửa đổi mới nhất}}
|2=
|self=yes
|summary=Thành viên yêu cầu xóa
|rationale=<includeonly>{{#if:{{REVISIONUSER}}|{{#ifeq:{{ROOTPAGENAME}}|{{REVISIONUSER}}||'''Cảnh báo: Trang này được sửa lần cuối bởi một thành viên khác với chủ sở hữu của không gian thành viên này. Vui lòng đảm bảo rằng trang đã được chính thành viên của không gian thành viên gắn thẻ trước khi xóa. '''}}}}{{{rationale|}}}</includeonly>
}}
|<span style="color:red; font-weight:bold; font-size:120%;">Vui lòng dùng thông số <kbd>rationale</kbd> parameter Để giải thích lý do tại sao trang thảo luận thành viên này nên bị xóa. (Ví dụ: <kbd>{{Db-tv1|rationale= }}</kbd>.) Thanks!</span>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
|nocat={{{nocat|}}}
|category2={{{category|¬}}}
|page=Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
fldg0w2q0couon2dzr06q2y25w4m140
2353321
2353272
2026-05-14T18:16:03Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353321
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{#ifexpr:{{#ifeq:{{NAMESPACE}}|{{ns:3}}|0|1}}+{{#if:{{{rationale|}}}|1|0}}+{{#ifeq:{{PAGENAME}}|{{BASEPAGENAME}}|0|1}}|
{{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV1
|1= vì thành viên yêu cầu xóa{{#if:{{REVISIONUSER}}||. {{làm mới}} để xem sửa đổi mới nhất}}
|2=
|self=yes
|summary=Thành viên yêu cầu xóa
|rationale=<includeonly>{{#if:{{REVISIONUSER}}|{{#ifeq:{{ROOTPAGENAME}}|{{REVISIONUSER}}||'''Cảnh báo: Trang này được sửa lần cuối bởi một thành viên khác với chủ sở hữu của không gian thành viên này. Vui lòng đảm bảo rằng trang đã được chính thành viên của không gian thành viên gắn thẻ trước khi xóa. '''}}}}{{{rationale|}}}</includeonly>
}}
|<span style="color:red; font-weight:bold; font-size:120%;">Vui lòng dùng thông số <kbd>rationale</kbd> parameter Để giải thích lý do tại sao trang thảo luận thành viên này nên bị xóa. (Ví dụ: <kbd>{{Db-tv1|rationale= }}</kbd>.) Thanks!</span>
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
|nocat={{{nocat|}}}
|category2={{{category|¬}}}
|page=Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
7gm8y6g9lc6l1pfnrr1k0uenrda14c6
Bản mẫu:db-userreq
10
397170
2353239
2026-05-14T17:19:59Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-userreq]] thành [[Bản mẫu:Db-tv1]]
2353239
wikitext
text/x-wiki
#đổi [[Bản mẫu:Db-tv1]]
15dkpf50a4tuyb1gts64mp8t4qvonzv
2353278
2353239
2026-05-14T17:53:34Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-tv1]] sang [[Bản mẫu:db-tv1]]
2353278
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-tv1]]
ki6sqxmpc0h6cfy6byfvweszmk3d7te
Bản mẫu:db-tv2
10
397171
2353240
2026-05-14T17:25:38Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=TV2 |1= là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra]) |2= |summary=Trang thành viên của thành viên chưa đăng ký |help={{{help|}}} }}<includeonly>{{Xử lý thể loại | all = [[Thể loại:Chờ xóa]]Thể lo…”
2353240
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV2
|1= là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra])
|2=
|summary=Trang thành viên của thành viên chưa đăng ký
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
c74yf3050ax9vh9fh6l652f4b9q9fhs
2353241
2353240
2026-05-14T17:25:50Z
Kateru Zakuro
34522
2353241
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV2
|1= vì là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra])
|2=
|summary=Trang thành viên của thành viên chưa đăng ký
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
3k0at9ek9kkuuuoj1sq3qhixrgdtaz5
2353242
2353241
2026-05-14T17:26:49Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-nouser]] thành [[Bản mẫu:db-tv2]]
2353241
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV2
|1= vì là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra])
|2=
|summary=Trang thành viên của thành viên chưa đăng ký
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
3k0at9ek9kkuuuoj1sq3qhixrgdtaz5
2353244
2353242
2026-05-14T17:27:03Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-tv2]] thành [[Bản mẫu:Db-tv2]]
2353241
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV2
|1= vì là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra])
|2=
|summary=Trang thành viên của thành viên chưa đăng ký
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
3k0at9ek9kkuuuoj1sq3qhixrgdtaz5
2353273
2353244
2026-05-14T17:48:34Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:Db-tv2]] thành [[Bản mẫu:db-tv2]] (đã tắt đổi hướng)
2353241
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV2
|1= vì là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra])
|2=
|summary=Trang thành viên của thành viên chưa đăng ký
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
3k0at9ek9kkuuuoj1sq3qhixrgdtaz5
2353320
2353273
2026-05-14T18:15:56Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353320
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=TV2
|1= vì là trang thành viên, trang thảo luận hoặc trang con của thành viên chưa đăng ký ([{{fullurl:Special:Listusers|username={{BASEPAGENAMEE}}&limit=1}} kiểm tra])
|2=
|summary=Trang thành viên của thành viên chưa đăng ký
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
egooap8zgwzvcmat59dc8xf8b4pwpf8
Bản mẫu:db-nouser
10
397172
2353243
2026-05-14T17:26:49Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-nouser]] thành [[Bản mẫu:db-tv2]]
2353243
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-tv2]]
33z6ybkk4jnkobt4gye7mw8s4iobjud
2353246
2353243
2026-05-14T17:28:15Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:db-tv2]] sang [[Bản mẫu:Db-tv2]]
2353246
wikitext
text/x-wiki
#đổi [[Bản mẫu:Db-tv2]]
0ny3fjy1hszr47rr0r5nj9qeapjwia0
2353279
2353246
2026-05-14T17:53:47Z
Kateru Zakuro
34522
Thay đổi trang đích của đổi hướng từ [[Bản mẫu:Db-tv2]] sang [[Bản mẫu:db-tv2]]
2353279
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-tv2]]
33z6ybkk4jnkobt4gye7mw8s4iobjud
Bản mẫu:db-dh2
10
397175
2353288
2026-05-14T17:59:24Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=R2 |1= vì là đổi hướng từ không gian tên chính (mục từ) đến các không gian tên khác mà không phải là Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp: |temp=CSD R2-warn |summary=Đổi hướng từ không gian tên chính đến các không gian tên khác |help={{{help|}}} }}<includeonly>{{Xử lý thể loại | all =…”
2353288
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=R2
|1= vì là đổi hướng từ không gian tên chính (mục từ) đến các không gian tên khác mà không phải là Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp:
|temp=CSD R2-warn
|summary=Đổi hướng từ không gian tên chính đến các không gian tên khác
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
2mvm0m7h4zdrd49b0swfhzabxv23yhk
2353289
2353288
2026-05-14T17:59:41Z
Kateru Zakuro
34522
2353289
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=ĐH2
|1= vì là đổi hướng từ không gian tên chính (mục từ) đến các không gian tên khác mà không phải là Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp:
|temp=CSD R2-warn
|summary=Đổi hướng từ không gian tên chính đến các không gian tên khác
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
h5qolmwstsfnj9qclkxhpktywux9y2m
2353290
2353289
2026-05-14T18:00:10Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-rediruser]] thành [[Bản mẫu:db-dh2]]
2353289
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=ĐH2
|1= vì là đổi hướng từ không gian tên chính (mục từ) đến các không gian tên khác mà không phải là Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp:
|temp=CSD R2-warn
|summary=Đổi hướng từ không gian tên chính đến các không gian tên khác
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
h5qolmwstsfnj9qclkxhpktywux9y2m
2353308
2353290
2026-05-14T18:14:31Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353308
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=ĐH2
|1= vì là đổi hướng từ không gian tên chính (mục từ) đến các không gian tên khác mà không phải là Thể loại:, Bản mẫu:, Wiktionary:, Trợ giúp:
|temp=CSD R2-warn
|summary=Đổi hướng từ không gian tên chính đến các không gian tên khác
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
1xv9jylrs9ce60mvy7xauv4iskndlco
Bản mẫu:db-rediruser
10
397176
2353291
2026-05-14T18:00:10Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-rediruser]] thành [[Bản mẫu:db-dh2]]
2353291
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-dh2]]
553z2rjqc0orec5o54lfhhxu8hmp1i8
Bản mẫu:db-dh3
10
397177
2353292
2026-05-14T18:03:31Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta |bot={{{bot|}}} |raw={{{raw|}}} |criterion=R3 |1= vì đây là đổi hướng tên sai quá mức so với trang đổi hướng đến |2= |rationale={{{rationale|{{{reason|}}}}}} |temp=Db-redirtypo-notice |notes=<span class="sysop-show">Bảo quản viên, vui lòng kiểm tra [https://tools.wmflabs.org/pageviews/#project=vi.wiktionary.org&platform=all-access&agent=all-agents&range=latest-20&p…”
2353292
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=R3
|1= vì đây là đổi hướng tên sai quá mức so với trang đổi hướng đến
|2=
|rationale={{{rationale|{{{reason|}}}}}}
|temp=Db-redirtypo-notice
|notes=<span class="sysop-show">Bảo quản viên, vui lòng kiểm tra [https://tools.wmflabs.org/pageviews/#project=vi.wiktionary.org&platform=all-access&agent=all-agents&range=latest-20&pages={{urlencode:{{FULLPAGENAME}}}} thống kê lượt xem trang gần đây] trước khi xóa. </span>
|summary=Recently created, implausible [[WP:R|redirect]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5dyhhhup0r0yjkc8vm0c4z0dguh3k2s
2353293
2353292
2026-05-14T18:03:44Z
Kateru Zakuro
34522
2353293
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=ĐH3
|1= vì đây là đổi hướng tên sai quá mức so với trang đổi hướng đến
|2=
|rationale={{{rationale|{{{reason|}}}}}}
|temp=Db-redirtypo-notice
|notes=<span class="sysop-show">Bảo quản viên, vui lòng kiểm tra [https://tools.wmflabs.org/pageviews/#project=vi.wiktionary.org&platform=all-access&agent=all-agents&range=latest-20&pages={{urlencode:{{FULLPAGENAME}}}} thống kê lượt xem trang gần đây] trước khi xóa. </span>
|summary=Recently created, implausible [[WP:R|redirect]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f9ej16qal8xtlzfnmrp70idthed1blq
2353294
2353293
2026-05-14T18:05:16Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-redirtypo]] thành [[Bản mẫu:db-dh3]]
2353293
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{Db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=ĐH3
|1= vì đây là đổi hướng tên sai quá mức so với trang đổi hướng đến
|2=
|rationale={{{rationale|{{{reason|}}}}}}
|temp=Db-redirtypo-notice
|notes=<span class="sysop-show">Bảo quản viên, vui lòng kiểm tra [https://tools.wmflabs.org/pageviews/#project=vi.wiktionary.org&platform=all-access&agent=all-agents&range=latest-20&pages={{urlencode:{{FULLPAGENAME}}}} thống kê lượt xem trang gần đây] trước khi xóa. </span>
|summary=Recently created, implausible [[WP:R|redirect]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f9ej16qal8xtlzfnmrp70idthed1blq
2353307
2353294
2026-05-14T18:14:24Z
BlueShurikenNinjaBot
50371
/* top */ Thay thế bản mẫu, replaced: Db-meta → db-meta using [[Project:AWB|AWB]]
2353307
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-meta
|bot={{{bot|}}}
|raw={{{raw|}}}
|criterion=ĐH3
|1= vì đây là đổi hướng tên sai quá mức so với trang đổi hướng đến
|2=
|rationale={{{rationale|{{{reason|}}}}}}
|temp=Db-redirtypo-notice
|notes=<span class="sysop-show">Bảo quản viên, vui lòng kiểm tra [https://tools.wmflabs.org/pageviews/#project=vi.wiktionary.org&platform=all-access&agent=all-agents&range=latest-20&pages={{urlencode:{{FULLPAGENAME}}}} thống kê lượt xem trang gần đây] trước khi xóa. </span>
|summary=Recently created, implausible [[WP:R|redirect]]
|help={{{help|}}}
}}<includeonly>{{Xử lý thể loại
| all = [[Thể loại:Chờ xóa]][[Thể loại:Không đưa lên Trang Chính]]
| nocat = {{{nocat|}}}
| category2 = {{{category|¬}}}
| page = Foo <!--CIRCUMVENT BLACKLIST-->
}}</includeonly>}}<noinclude>
{{documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
gqkko8xowndz6il97knskrdspuaewvl
Bản mẫu:db-redirtypo
10
397178
2353295
2026-05-14T18:05:16Z
Kateru Zakuro
34522
Kateru Zakuro đã đổi [[Bản mẫu:db-redirtypo]] thành [[Bản mẫu:db-dh3]]
2353295
wikitext
text/x-wiki
#đổi [[Bản mẫu:db-dh3]]
refuq7qpolth2jwx0w6rv1uddldkaps
Bản mẫu:db-redirnone
10
397179
2353296
2026-05-14T18:07:51Z
Kateru Zakuro
34522
Trang mới: “{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-c8 |bot={{{bot|}}} |đổi hướng đến một trang |summary=Đổi hướng đến một trang không tồn tại hoặc đã bị xóa |category={{{category|<includeonly>¬</includeonly>}}} |rationale={{{rationale|}}} |does_not_include= |temp=redirnone-warn |help={{{help|}}} }}<includeonly>{{#ifeq:{{{category|¬}}}|¬|}}</includeonly>}}<noinclude> {{Documentation}} Thể loại:Bản mẫu xóa tran…”
2353296
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Module Wikipedia/Unsubst||$B={{db-c8
|bot={{{bot|}}}
|đổi hướng đến một trang
|summary=Đổi hướng đến một trang không tồn tại hoặc đã bị xóa
|category={{{category|<includeonly>¬</includeonly>}}}
|rationale={{{rationale|}}}
|does_not_include=
|temp=redirnone-warn
|help={{{help|}}}
}}<includeonly>{{#ifeq:{{{category|¬}}}|¬|}}</includeonly>}}<noinclude>
{{Documentation}}
[[Thể loại:Bản mẫu xóa trang]]
<!-- PLEASE ADD THIS TEMPLATE'S CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS -->
</noinclude>
nmn669iuzmsq900vb11w70om4fo3ev4
Bản mẫu:db
10
397181
2353326
2026-05-14T18:26:04Z
Kateru Zakuro
34522
Đổi hướng đến [[Bản mẫu:Chờ xóa]]
2353326
wikitext
text/x-wiki
#đổi [[Bản mẫu:Chờ xóa]]
prsjsmxj5jyputsuefrhigxl1ierhe7
Bản mẫu:db-meta/doc
10
397182
2353330
2026-05-14T18:30:32Z
Kateru Zakuro
34522
Trang mới: “{{Trang tài liệu}} == Cách sử dụng == {{documentation needed}}<!-- Replace this with a short description of the purpose of the template, and how to use it. --> <includeonly>{{Sandbox other|| <!-- XIN HÃY THÊM THỂ LOẠI VÀ INTERWIKI TẠI ĐÂY, CẢM ƠN --> [[Thể loại:Siêu bản mẫu]] }}</includeonly>”
2353330
wikitext
text/x-wiki
{{Trang tài liệu}}
== Cách sử dụng ==
{{documentation needed}}<!-- Replace this with a short description of the purpose of the template, and how to use it. -->
<includeonly>{{Sandbox other||
<!-- XIN HÃY THÊM THỂ LOẠI VÀ INTERWIKI TẠI ĐÂY, CẢM ƠN -->
[[Thể loại:Siêu bản mẫu]]
}}</includeonly>
576erokh9cmbwfymm3099vlophp3zr4
2353331
2353330
2026-05-14T18:30:47Z
Kateru Zakuro
34522
2353331
wikitext
text/x-wiki
{{Trang tài liệu}}
{{Twinkle standard installation}}
== Cách sử dụng ==
{{documentation needed}}<!-- Replace this with a short description of the purpose of the template, and how to use it. -->
<includeonly>{{Sandbox other||
<!-- XIN HÃY THÊM THỂ LOẠI VÀ INTERWIKI TẠI ĐÂY, CẢM ƠN -->
[[Thể loại:Siêu bản mẫu]]
}}</includeonly>
m0quo61dt1w6rvucxrhmjyfhvwix490
洲実子
0
397185
2353338
2026-05-15T00:47:46Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353338
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
洲實子
0
397186
2353339
2026-05-15T00:48:11Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353339
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
秀実子
0
397187
2353340
2026-05-15T00:51:11Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|しゅう|k1=す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353340
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|しゅう|k1=す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
rnus40m7kpptdxj6vfhb3cp6af1tdnn
秀實子
0
397188
2353341
2026-05-15T00:51:18Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|しゅう|k1=す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353341
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|しゅう|k1=す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
rnus40m7kpptdxj6vfhb3cp6af1tdnn
朱実子
0
397189
2353342
2026-05-15T00:52:41Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353342
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
朱實子
0
397190
2353343
2026-05-15T00:53:09Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353343
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
澄実子
0
397191
2353344
2026-05-15T00:54:07Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353344
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
澄實子
0
397192
2353345
2026-05-15T00:54:53Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353345
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
好実子
0
397193
2353346
2026-05-15T00:56:10Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353346
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
好實子
0
397194
2353347
2026-05-15T00:56:17Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|す|み|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|すみこ}} # {{given name|ja|nữ|sort=すみこ}}”
2353347
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|す|み|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|すみこ}}
# {{given name|ja|nữ|sort=すみこ}}
t6vqdqtyjulddcfvtx56esreb1ehh2k
おふ
0
397195
2353348
2026-05-15T01:05:37Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|追う|負う|生ふ}}”
2353348
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|追う|負う|生ふ}}
7auxglk2xve7mlqwd6wl9lgyi1dq1gc
たづぬ
0
397196
2353349
2026-05-15T01:06:15Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|尋ぬ|訪ぬ}}”
2353349
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|尋ぬ|訪ぬ}}
lch4fz0y0ewd8uiwwdgqihf1q97l67b
tazunu
0
397197
2353350
2026-05-15T01:06:42Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|たづぬ}}”
2353350
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|たづぬ}}
34ooz9ei077tb9nwpj9e7yfr4qsww9g
訊ぬ
0
397198
2353351
2026-05-15T01:07:36Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|たづ}} {{ja-see|尋ぬ}}”
2353351
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|たづ}}
{{ja-see|尋ぬ}}
lvtzgwbjazrwugmn2zgu23x99sf00gi
戾って來る
0
397199
2353352
2026-05-15T01:09:11Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|戻って来る}}”
2353352
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|戻って来る}}
2beskyygmuesfuf27yduelfil4gltg4
koshikakeru
0
397200
2353353
2026-05-15T01:10:20Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-rom}} # {{ja-rom of|こしかける}}”
2353353
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-rom}}
# {{ja-rom of|こしかける}}
dpx4vuafvskkb8l62bqkv4ma5sw463k
こしかける
0
397201
2353354
2026-05-15T01:11:48Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|腰掛ける}}”
2353354
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|腰掛ける}}
qlp550ks2goz4ngapo8lrefsx9h61hj
あう
0
397202
2353355
2026-05-15T01:16:44Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|etym}} 1=== ===={{ĐM|pron}}==== * {{ja-pron|あう|acc=1|a=Ja-au-meet(see) or fit.ogg|acc_ref=DJR,NHK}} ===={{ĐM|verb}}==== {{ja-verb|tr=intrans|type=1}} # {{ja-def|会う}} [[gặp]]. # {{ja-def|合う}} [[hợp]] [[với]]. # {{ja-def|遭う}} [[gặp]] (bất hạnh). # {{ja-def|遇う}} [[gặp]] (bất hạnh). # {{ja-def|逢う}} [[gặp]] (khổ đau, bệnh tật). # {{ja-def|逅う}} [[gặp]] (một cách bất ngờ). # {{ja-d…”
2353355
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|etym}} 1===
===={{ĐM|pron}}====
* {{ja-pron|あう|acc=1|a=Ja-au-meet(see) or fit.ogg|acc_ref=DJR,NHK}}
===={{ĐM|verb}}====
{{ja-verb|tr=intrans|type=1}}
# {{ja-def|会う}} [[gặp]].
# {{ja-def|合う}} [[hợp]] [[với]].
# {{ja-def|遭う}} [[gặp]] (bất hạnh).
# {{ja-def|遇う}} [[gặp]] (bất hạnh).
# {{ja-def|逢う}} [[gặp]] (khổ đau, bệnh tật).
# {{ja-def|逅う}} [[gặp]] (một cách bất ngờ).
# {{ja-def|邂う}} [[gặp]] (một cách bất ngờ).
# {{ja-def|翕う}} [[gặp]] (cách dùng chữ Hán rất hiếm gặp).
# {{ja-def|覯う}} [[gặp]] (cách dùng chữ Hán rất hiếm gặp).
# {{ja-def|覿う}} [[gặp]] (cách dùng chữ Hán rất hiếm gặp).
# {{ja-def|遘う}} [[gặp]] (cách dùng chữ Hán rất hiếm gặp).
==={{ĐM|etym}} 2===
{{ja-see-kango|央|桜|奥|媼|墺|懊|鶯}}
==={{ĐM|ref}}===
<references />
e6k6jcnjqzihi3h7vhvjl311ppfup8h
あふ
0
397203
2353356
2026-05-15T01:18:10Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|敢ふ|会う|合う|凹|押}}”
2353356
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|敢ふ|会う|合う|凹|押}}
eqxx82ci7aigfmp08j0mddx4h4xpar7
あえる
0
397204
2353357
2026-05-15T01:20:13Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|和える}}”
2353357
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|和える}}
7beqrnyi7dokuaegq93cyl62e7xxcln
あへる
0
397205
2353358
2026-05-15T01:20:18Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|和える}}”
2353358
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|和える}}
7beqrnyi7dokuaegq93cyl62e7xxcln
aeru
0
397206
2353359
2026-05-15T01:22:24Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|あえる}}”
2353359
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|あえる}}
j35m4dj2j4iq59dut9vu2bhyo2tc9q1
倦きる
0
397207
2353360
2026-05-15T01:24:16Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|あ|yomi=k}} {{ja-see|飽きる}} ==={{ĐM|ref}}=== * {{R:Kanjipedia Kotoba|0001912900|<sup>▲</sup>倦きる}}”
2353360
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|あ|yomi=k}}
{{ja-see|飽きる}}
==={{ĐM|ref}}===
* {{R:Kanjipedia Kotoba|0001912900|<sup>▲</sup>倦きる}}
o6rxe6pppcwfjfq63r4fapej39rnq6k
Thể loại:Từ đánh vần với 倦 là あ tiếng Nhật
14
397208
2353361
2026-05-15T01:24:49Z
WhoAlone
40420
Trang mới: “{{auto cat|k}}”
2353361
wikitext
text/x-wiki
{{auto cat|k}}
nh04xahpn83v73hy3e8gd7rf8lq5xcp
Thể loại:Từ đánh vần với kanji là あ tiếng Nhật
14
397209
2353362
2026-05-15T01:26:48Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353362
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 倦 tiếng Nhật
14
397210
2353363
2026-05-15T01:28:41Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353363
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 倦 theo ngôn ngữ
14
397211
2353365
2026-05-15T01:29:58Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353365
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
あきる
0
397212
2353366
2026-05-15T01:30:43Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|飽きる}}”
2353366
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|飽きる}}
bwt2d3qztd9owne001d23steu9havgf
akiru
0
397213
2353367
2026-05-15T01:31:19Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|あきる}}”
2353367
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|あきる}}
ph1ckb2ua2xwvhfz4dksavvw2r1rmgi
Poren
0
397214
2353368
2026-05-15T01:33:20Z
Hiyuune
50834
Trang mới: “=={{langname|de}}== ==={{section|pron}}=== * {{audio|de|de-{{pagename}}.ogg}} ==={{section|noun}}=== {{head|de|Biến thể hình thái danh từ}} # {{infl of|de|Pore||nom//gen//dat//acc|p}}”
2353368
wikitext
text/x-wiki
=={{langname|de}}==
==={{section|pron}}===
* {{audio|de|de-{{pagename}}.ogg}}
==={{section|noun}}===
{{head|de|Biến thể hình thái danh từ}}
# {{infl of|de|Pore||nom//gen//dat//acc|p}}
7e1heue7rkreg3uk5qglscypmbs0qdm
2353369
2353368
2026-05-15T01:33:33Z
Hiyuune
50834
/* Tiếng Đức */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353369
wikitext
text/x-wiki
=={{langname|de}}==
==={{section|pron}}===
* {{audio|de|de-{{pagename}}.ogg|a=Berlin}}
==={{section|noun}}===
{{head|de|Biến thể hình thái danh từ}}
# {{infl of|de|Pore||nom//gen//dat//acc|p}}
hypgfasxow4rsyxmwlowqr4c4gin0pl
あたい
0
397215
2353371
2026-05-15T01:34:44Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|etym}} 1=== {{ja-kanjitab|alt=私}} Biến đổi từ {{mention|ja|あたし|tr=atashi}}.<ref>{{R:Kokugo Dai Jiten}}</ref><ref>{{R:Daijisen}}</ref><ref name="DJR"/> ===={{ĐM|pron}}==== {{ja-pron|あたい|acc=0|acc_ref=NHK,DJR}} ===={{ĐM|pronoun}}==== {{ja-pos|pronoun}} # {{lb|ja|informal}} {{n-g|[[đại từ]] [[nhân xưng]] [[ngôi]] [[thứ nhất]]}}: [[tôi]]. # {{lb|ja|Kagoshima|dialect}} {{n-g|[[đại từ]] [[nhân xưng]] […”
2353371
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|etym}} 1===
{{ja-kanjitab|alt=私}}
Biến đổi từ {{mention|ja|あたし|tr=atashi}}.<ref>{{R:Kokugo Dai Jiten}}</ref><ref>{{R:Daijisen}}</ref><ref name="DJR"/>
===={{ĐM|pron}}====
{{ja-pron|あたい|acc=0|acc_ref=NHK,DJR}}
===={{ĐM|pronoun}}====
{{ja-pos|pronoun}}
# {{lb|ja|informal}} {{n-g|[[đại từ]] [[nhân xưng]] [[ngôi]] [[thứ nhất]]}}: [[tôi]].
# {{lb|ja|Kagoshima|dialect}} {{n-g|[[đại từ]] [[nhân xưng]] [[ngôi]] [[thứ nhất]]}}: [[tôi]].
====={{ĐM|usage}}=====
Nghĩa thứ nhất được coi là khá nữ tính, thường chỉ giới hạn ở các cô gái và phụ nữ trẻ ở khu Shitamachi của Tokyo , hoặc những người làm việc trong [[phố đèn đỏ]].
==={{ĐM|etym}} 2===
{{ja-see|値|直}}
==={{ĐM|ref}}===
<references/>
o3j1hutm3kpsga1onritqc9qd7l239m
Czarnocki
0
397216
2353373
2026-05-15T01:36:11Z
Hiyuune
50834
Trang mới: “=={{langname|pl}}== {{wp|pl:}} ==={{section|pron}}=== {{pl-pr}} ==={{section|pr-noun}}=== {{pl-prop|m-pr|f=Czarnocka}} # {{surname|pl|g=m}} ===={{section|decl}}==== {{pl-decl-noun-m-pr}} ==={{section|further}}=== * {{R:pl:ISNP}}”
2353373
wikitext
text/x-wiki
=={{langname|pl}}==
{{wp|pl:}}
==={{section|pron}}===
{{pl-pr}}
==={{section|pr-noun}}===
{{pl-prop|m-pr|f=Czarnocka}}
# {{surname|pl|g=m}}
===={{section|decl}}====
{{pl-decl-noun-m-pr}}
==={{section|further}}===
* {{R:pl:ISNP}}
gk7wv2a3xr8apq0om5wlj13m7lwoa1g
formento
0
397217
2353374
2026-05-15T01:36:51Z
Hiyuune
50834
Trang mới: “=={{langname|it}}== ==={{section|pron}}=== {{it-pr}} ==={{section|noun}}=== {{it-noun|m}} # {{alt form of|it|frumento}}”
2353374
wikitext
text/x-wiki
=={{langname|it}}==
==={{section|pron}}===
{{it-pr}}
==={{section|noun}}===
{{it-noun|m}}
# {{alt form of|it|frumento}}
833enn91fkpxea9lvnp8sf2t08yho19
Thể loại:Vần:Tiếng Ý/ento/3 âm tiết
14
397218
2353376
2026-05-15T01:37:23Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2353376
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Vần:Tiếng Ý/ento
14
397219
2353378
2026-05-15T01:37:53Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2353378
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
あたふ
0
397220
2353379
2026-05-15T01:38:33Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|あたう}}”
2353379
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|あたう}}
3t6rtuosx077jozyhnoz51z53rhas1q
ありうる
0
397221
2353381
2026-05-15T01:39:31Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|有り得る}}”
2353381
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|有り得る}}
9mm3bnzuioapu9n5kjj26wqmmrxejca
ありえる
0
397222
2353382
2026-05-15T01:39:39Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|有り得る}}”
2353382
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|有り得る}}
9mm3bnzuioapu9n5kjj26wqmmrxejca
formenti
0
397223
2353383
2026-05-15T01:40:02Z
Hiyuune
50834
+ it
2353383
wikitext
text/x-wiki
=={{langname|it}}==
==={{section|noun}}===
{{head|it|Biến thể hình thái danh từ}}
# {{plural of|it|formento}}
8swg39unmtovz1nj38p5vgklxkfswhq
ariuru
0
397224
2353384
2026-05-15T01:40:18Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-rom}} # {{ja-rom of|ありうる}}”
2353384
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-rom}}
# {{ja-rom of|ありうる}}
m8th1xsy3uj33mxlklesifncjhb6zki
esperancéssim
0
397225
2353385
2026-05-15T01:40:46Z
Hiyuune
50834
Trang mới: “=={{langname|ca}}== ==={{section|v}}=== {{head|ca|Biến thể hình thái động từ}} # {{ca-verb form of|esperançar}}”
2353385
wikitext
text/x-wiki
=={{langname|ca}}==
==={{section|v}}===
{{head|ca|Biến thể hình thái động từ}}
# {{ca-verb form of|esperançar}}
mebasw6ao076m2iq9gek1psxos6od61
arieru
0
397226
2353387
2026-05-15T01:40:59Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-rom}} # {{ja-rom of|ありえる}}”
2353387
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-rom}}
# {{ja-rom of|ありえる}}
9nijvxyuktqblc4nwrvgq1r9avnvot1
superlavori
0
397227
2353388
2026-05-15T01:41:29Z
Hiyuune
50834
+ it
2353388
wikitext
text/x-wiki
=={{langname|it}}==
==={{section|noun}}===
{{head|it|Biến thể hình thái danh từ|g=m}}
# {{plural of|it|superlavoro}}
tdiwl8gmfp9gbtnw7r88xjjdrwklf22
まーすん
0
397228
2353393
2026-05-15T01:47:36Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|etym}}=== {{rfv-etym|xug}} Từ {{inh|xug|jpx-ryu-pro|*mawa(ri)(si)}} (từ đó có {{cog|ryu|まーすん|tr=māsun}}, {{cog|mvi|まーㇲ゙さまーㇲ゙|tr=māzsāmaz}}, {{cog|rys|まーらしぃん|tr=mārasïn}}). ==={{ĐM|pron}}=== * {{IPA4|xug|/maːsuŋ̍/}} ==={{ĐM|verb}}=== {{xug-head|verb|sort=まあすん}} # [[chết]]. {{c|xug|Chết|sort=まあすん}} =={{langname|ryu}}== ==={{ĐM|etym}}=== {{rfv-etym|ryu}} Từ {{…”
2353393
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|etym}}===
{{rfv-etym|xug}}
Từ {{inh|xug|jpx-ryu-pro|*mawa(ri)(si)}} (từ đó có {{cog|ryu|まーすん|tr=māsun}}, {{cog|mvi|まーㇲ゙さまーㇲ゙|tr=māzsāmaz}}, {{cog|rys|まーらしぃん|tr=mārasïn}}).
==={{ĐM|pron}}===
* {{IPA4|xug|/maːsuŋ̍/}}
==={{ĐM|verb}}===
{{xug-head|verb|sort=まあすん}}
# [[chết]].
{{c|xug|Chết|sort=まあすん}}
=={{langname|ryu}}==
==={{ĐM|etym}}===
{{rfv-etym|ryu}}
Từ {{inh|ryu|jpx-ryu-pro|*mawa(ri)(si)}} (từ đó có {{cog|xug|まーすん|tr=māsun}}, {{cog|mvi|まーㇲ゙さまーㇲ゙|tr=māzsāmaz}}, {{cog|rys|まーらしぃん|tr=mārasïn}}).
==={{ĐM|pron}}===
* {{IPA4|ryu|/maːsuŋ̍/}}
==={{ĐM|verb}}===
{{ryu-head|verb|tr=intransitive}}
# [[chết]].
===References===
* {{R:JLect|まーすん|287|maasun}}
epqxm637xmwzxhlwdcymxkoqqwp61mx
まさーるん
0
397229
2353394
2026-05-15T01:49:34Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb|sort=まさあるん}} # {{xug-def|勝ーるん}} [[vượt]].”
2353394
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb|sort=まさあるん}}
# {{xug-def|勝ーるん}} [[vượt]].
hxyv2izu22hewytx893j6ni05qqos4c
勝ーるん
0
397230
2353395
2026-05-15T01:50:31Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab|まさ}} ==={{ĐM|etym}}=== Cùng gốc với {{cog|ja|-}} {{ja-r|勝る|まさる}}. ==={{ĐM|pron}}=== * {{IPA4|xug|/masaːɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|まさーるん}} # [[vượt]].”
2353395
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab|まさ}}
==={{ĐM|etym}}===
Cùng gốc với {{cog|ja|-}} {{ja-r|勝る|まさる}}.
==={{ĐM|pron}}===
* {{IPA4|xug|/masaːɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|まさーるん}}
# [[vượt]].
i648dow9jitgnxwflt9uw4gc20ln9gh
Thể loại:Từ đánh vần với 勝 là まさ tiếng Kunigami
14
397231
2353396
2026-05-15T01:52:00Z
WhoAlone
40420
Trang mới: “{{auto cat|goon|kan'on}}”
2353396
wikitext
text/x-wiki
{{auto cat|goon|kan'on}}
f81u8sjg1a4kr52e0dgxe99ta9q4hzj
Thể loại:Từ đánh vần với kanji có âm đọc goon tiếng Kunigami
14
397232
2353397
2026-05-15T01:52:38Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353397
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji có âm đọc kan'on tiếng Kunigami
14
397233
2353398
2026-05-15T01:52:44Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353398
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 勝 tiếng Kunigami
14
397234
2353399
2026-05-15T01:53:13Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353399
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji là まさ tiếng Kunigami
14
397235
2353400
2026-05-15T01:58:33Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353400
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 勝 theo ngôn ngữ
14
397236
2353401
2026-05-15T02:00:08Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353401
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ theo âm đọc kanji tiếng Kunigami
14
397237
2353402
2026-05-15T02:00:44Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353402
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ theo âm đọc kanji theo ngôn ngữ
14
397238
2353403
2026-05-15T02:02:47Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353403
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ có âm đọc kanji với hai mora tiếng Kunigami
14
397239
2353404
2026-05-15T02:04:11Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353404
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ có âm đọc kanji theo số mora tiếng Kunigami
14
397240
2353405
2026-05-15T02:04:43Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353405
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ có âm đọc kanji theo số mora theo ngôn ngữ
14
397241
2353406
2026-05-15T02:05:20Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353406
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji có âm đọc on'yomi tiếng Kunigami
14
397242
2353407
2026-05-15T02:05:47Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353407
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji theo loại âm đọc tiếng Kunigami
14
397243
2353408
2026-05-15T02:06:26Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353408
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji có âm đọc on'yomi theo ngôn ngữ
14
397244
2353409
2026-05-15T02:07:07Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353409
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
濁ぎー
0
397245
2353410
2026-05-15T02:09:00Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab|yomi=kun}} ==={{ĐM|etym}}=== Lần đầu chứng thực dưới dạng {{l|und|링ᄀᆞ|ts=riŋ.kɒ}} (Haytong Ceykwukki, 1501). Cùng gốc với {{cog|ja|濁る|tr=nigoru}}. ==={{ĐM|pron}}=== * {{IPA4|xug|/miŋ̍ɡiː/}} ==={{ĐM|noun}}=== {{xug-head|noun|みんぎー|tr=mingwi}} # Sự [[vẩn đục]], không [[tinh khiết]]. ==={{ĐM|ref}}=== * {{R:JLect|みんぎー【濁ぎー・濁ー】|3563/mingii/}}”
2353410
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab|yomi=kun}}
==={{ĐM|etym}}===
Lần đầu chứng thực dưới dạng {{l|und|링ᄀᆞ|ts=riŋ.kɒ}} (Haytong Ceykwukki, 1501). Cùng gốc với {{cog|ja|濁る|tr=nigoru}}.
==={{ĐM|pron}}===
* {{IPA4|xug|/miŋ̍ɡiː/}}
==={{ĐM|noun}}===
{{xug-head|noun|みんぎー|tr=mingwi}}
# Sự [[vẩn đục]], không [[tinh khiết]].
==={{ĐM|ref}}===
* {{R:JLect|みんぎー【濁ぎー・濁ー】|3563/mingii/}}
jj6ozp41tvy0m6bqin68oopfssbl1so
みんぎー
0
397246
2353411
2026-05-15T02:09:57Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|noun}}=== {{xug-head|noun|sort=みんぎー}} # {{xug-def|濁ぎー}} Sự [[vẩn đục]], không [[tinh khiết]].”
2353411
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|noun}}===
{{xug-head|noun|sort=みんぎー}}
# {{xug-def|濁ぎー}} Sự [[vẩn đục]], không [[tinh khiết]].
l8it46sugf0w6gkdyg23xlg7a3r3gm9
ゆしーるん
0
397247
2353412
2026-05-15T02:10:44Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|verb}}=== {{xug-head|verb|sort=ゆしいるん}} # {{xug-def|寄しーるん}} [[tiếp cận]], [[gọi]].”
2353412
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|verb}}===
{{xug-head|verb|sort=ゆしいるん}}
# {{xug-def|寄しーるん}} [[tiếp cận]], [[gọi]].
lcdmnvfk4sjsyqbu1nvavm3sg1nqewr
寄しーるん
0
397248
2353413
2026-05-15T02:14:06Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{xug-kanjitab}} ==={{ĐM|pron}}=== * {{IPA4|xug|/juɕiːɾuŋ/}} ==={{ĐM|verb}}=== {{xug-head|verb|ゆしーるん}} # [[tiếp cận]], [[gọi]].”
2353413
wikitext
text/x-wiki
=={{langname|ja}}==
{{xug-kanjitab}}
==={{ĐM|pron}}===
* {{IPA4|xug|/juɕiːɾuŋ/}}
==={{ĐM|verb}}===
{{xug-head|verb|ゆしーるん}}
# [[tiếp cận]], [[gọi]].
bzfgbcx54mi5xl1ou7chqqzdxhvlw8b
Thể loại:Từ đánh vần với 寄 tiếng Kunigami
14
397249
2353414
2026-05-15T02:14:56Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353414
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 寄 theo ngôn ngữ
14
397250
2353415
2026-05-15T02:15:27Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353415
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji lớp 5 tiếng Kunigami
14
397251
2353416
2026-05-15T02:16:17Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353416
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với kanji lớp 5 theo ngôn ngữ
14
397252
2353417
2026-05-15T02:17:56Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353417
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có 1 ký tự kanji tiếng Kunigami
14
397253
2353418
2026-05-15T02:18:32Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353418
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ theo số ký tự kanji tiếng Kunigami
14
397254
2353419
2026-05-15T02:18:58Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353419
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ theo số ký tự kanji theo ngôn ngữ
14
397255
2353420
2026-05-15T02:19:28Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353420
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có 1 ký tự kanji theo ngôn ngữ
14
397256
2353421
2026-05-15T02:20:12Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353421
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
うんじゅ
0
397257
2353422
2026-05-15T02:23:59Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pron}}=== * {{IPA4|xug|/ʔund͡ʑu/}} ==={{ĐM|pronoun}}=== {{xug-head|pronoun}} # [[bạn]]. =={{langname|ryu}}== ==={{ĐM|pronoun}}=== {{ryu-head|pronoun}} # {{ryu-def|御所}} [[bạn]].”
2353422
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pron}}===
* {{IPA4|xug|/ʔund͡ʑu/}}
==={{ĐM|pronoun}}===
{{xug-head|pronoun}}
# [[bạn]].
=={{langname|ryu}}==
==={{ĐM|pronoun}}===
{{ryu-head|pronoun}}
# {{ryu-def|御所}} [[bạn]].
rmqj6ol8l1axp7t72pesa00gu68vgzq
しら
0
397258
2353423
2026-05-15T02:37:29Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pron}}=== * {{IPA4|xug|[ɕiɾa]}} ==={{ĐM|noun}}=== {{xug-head|noun}} # [[mặt trời]]. ==={{ĐM|ref}}=== * {{R:JLect|しら【天道・太陽】|5780|shira}}”
2353423
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pron}}===
* {{IPA4|xug|[ɕiɾa]}}
==={{ĐM|noun}}===
{{xug-head|noun}}
# [[mặt trời]].
==={{ĐM|ref}}===
* {{R:JLect|しら【天道・太陽】|5780|shira}}
egkhn2sw0y9hvaxwcxfyk1bx65xwe2x
ká khăng
0
397259
2353424
2026-05-15T02:50:21Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá khô]]. #:{{ux|sed|kâ hmê ƀă '''ká khăng'''|Ăn cơm với '''cá khô'''}} #:{{syn|sed|măm}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá|Thực phẩm}}”
2353424
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá khô]].
#:{{ux|sed|kâ hmê ƀă '''ká khăng'''|Ăn cơm với '''cá khô'''}}
#:{{syn|sed|măm}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá|Thực phẩm}}
m445f8qjihxxdd2dg2agzz4v8grbhkq
hơkêh
0
397260
2353426
2026-05-15T02:51:57Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lăng]]. #:{{ux|sed|pơlŏn drôu ƀă '''hơkêh'''|Nhậu '''cá lăng'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353426
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lăng]].
#:{{ux|sed|pơlŏn drôu ƀă '''hơkêh'''|Nhậu '''cá lăng'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
4ahsurxnwrl3otoqq8al2elynuympdd
ká lia thia
0
397261
2353427
2026-05-15T02:52:54Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lia thia]]. #:{{ux|sed|'''ká lia thia''' kroăng|'''Cá lia thia''' nước ngọt}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353427
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lia thia]].
#:{{ux|sed|'''ká lia thia''' kroăng|'''Cá lia thia''' nước ngọt}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
54wmov3v86cdb4pm2abv51qjyxdytlx
ká linh
0
397262
2353428
2026-05-15T03:03:17Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá linh]]. #:{{ux|sed|nâ rôe '''ká linh'''|Chị mua '''cá linh'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353428
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá linh]].
#:{{ux|sed|nâ rôe '''ká linh'''|Chị mua '''cá linh'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
h7pxyjuupdzsmlxydbkj29gesowmamg
truă
0
397263
2353429
2026-05-15T03:09:40Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # {{label|sed|dialectal}} [[cá lóc]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353429
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# {{label|sed|dialectal}} [[cá lóc]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
cgga2v2qigzz5k2a6p3swje3b0m6ar7
truâ
0
397264
2353430
2026-05-15T03:12:29Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lóc]]. #:{{ux|sed|xế '''truâ'''|Câu '''cá lóc'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353430
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lóc]].
#:{{ux|sed|xế '''truâ'''|Câu '''cá lóc'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
9khusinwe9gcy7udrg4vubwr3pnqjhp
truâ kŭn
0
397265
2353431
2026-05-15T03:13:04Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lóc]] [[nhỏ]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353431
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lóc]] [[nhỏ]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
d52xlme569fp4hmllx1e4xo673oemco
truă kôn
0
397266
2353432
2026-05-15T03:13:35Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # {{label|sed|dialectal}} [[cá lóc]] [[nhỏ]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353432
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# {{label|sed|dialectal}} [[cá lóc]] [[nhỏ]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
l4ln3fv9xni34s0hy46qu1d3wgt5ht1
ká long rong
0
397267
2353433
2026-05-15T03:17:24Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lòng ròng]]. #:{{ux|sed|'''ká long rong''' hmâ tơkŭm rêh ối chiâng tơpuâ|'''Cá lòng ròng''' có tập quán sống thành từng đàn}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353433
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lòng ròng]].
#:{{ux|sed|'''ká long rong''' hmâ tơkŭm rêh ối chiâng tơpuâ|'''Cá lòng ròng''' có tập quán sống thành từng đàn}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
gwo99i8ugjh6qvzafw5z032qrq67h6n
ká long tong
0
397268
2353434
2026-05-15T03:22:29Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lòng tong]]. #:{{ux|sed|'''ká long tong '''têa kroăng|'''Cá lòng tong''' nước ngọt}} ==={{đm|ref}}=== {{R:VOV}}”
2353434
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lòng tong]].
#:{{ux|sed|'''ká long tong '''têa kroăng|'''Cá lòng tong''' nước ngọt}}
==={{đm|ref}}===
{{R:VOV}}
66jyr0d7ye3fh6fydam2vngf7qvvhw8
ká luk lăk
0
397269
2353435
2026-05-15T03:26:28Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá lục lạc]]. #:{{ux|sed|á châ rup moi to '''ká luk lăk'''|Tôi bắt được một con '''cá lục lạc'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353435
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá lục lạc]].
#:{{ux|sed|á châ rup moi to '''ká luk lăk'''|Tôi bắt được một con '''cá lục lạc'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
pui4c80oj2g3ikznltpjyj2c3l97yfg
ká măm
0
397270
2353436
2026-05-15T03:33:36Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá mắm]]. #:{{ux|sed|túa pế pơchên '''ká măm''' ki khó|Cách chế biến '''cá mắm''' kho}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353436
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá mắm]].
#:{{ux|sed|túa pế pơchên '''ká măm''' ki khó|Cách chế biến '''cá mắm''' kho}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
6weg3y2kisaoh69d4wi4os4k057x0a1
ká mâp
0
397271
2353437
2026-05-15T03:34:33Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá mập]]. #:{{ux|sed|'''ká mâp''' krâ 'mêi|'''cá mập''' hung dữ}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353437
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá mập]].
#:{{ux|sed|'''ká mâp''' krâ 'mêi|'''cá mập''' hung dữ}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
b24jwxfohvreu3ebiqyt8m3bl6ulxit
ká mâp klôa
0
397272
2353438
2026-05-15T03:36:16Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá mập]] [[trắng]]. #:{{ux|sed|'''ká mâp klôa''' cho ká ki tí tăng kâ mơdrăn kân má môi a têa|'''Cá mập trắng''' loài cá săn mồi lớn nhất trên thế giới}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353438
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá mập]] [[trắng]].
#:{{ux|sed|'''ká mâp klôa''' cho ká ki tí tăng kâ mơdrăn kân má môi a têa|'''Cá mập trắng''' loài cá săn mồi lớn nhất trên thế giới}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
g0xr8qwhtkag5gdxt6y7k90x5kc3tkc
ká mâp prăng
0
397273
2353440
2026-05-15T03:38:14Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá mập]] [[xám]]. #:{{ux|sed|'''ká mâp prăng '''hiăng lo a kĭng têa kơxĭ|'''Cá mập xám''' xuất hiện ở ven bờ biển}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353440
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá mập]] [[xám]].
#:{{ux|sed|'''ká mâp prăng '''hiăng lo a kĭng têa kơxĭ|'''Cá mập xám''' xuất hiện ở ven bờ biển}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
mwdac5odamt4v1rmgmw3naq2ufzmiqy
Thể loại:irk:Nước
14
397274
2353441
2026-05-15T03:38:57Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353441
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Chất lỏng
14
397275
2353442
2026-05-15T03:39:07Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353442
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Danh sách chủ đề thuộc nhóm liên quan
14
397276
2353443
2026-05-15T03:39:09Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353443
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Vật chất
14
397277
2353444
2026-05-15T03:39:19Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353444
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Danh sách chủ đề thuộc nhóm tập hợp
14
397278
2353445
2026-05-15T03:39:22Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353445
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Tất cả chủ đề
14
397279
2353446
2026-05-15T03:39:26Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353446
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Tự nhiên
14
397280
2353447
2026-05-15T03:39:34Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353447
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Hóa học
14
397281
2353448
2026-05-15T03:39:36Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353448
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:irk:Khoa học
14
397282
2353449
2026-05-15T03:39:58Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353449
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
ká me
0
397283
2353455
2026-05-15T05:46:55Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá mè]]. #:{{ux|sed|'''ká me''' akố hên 'nâng|'''Cá mè''' ở đây rất nhiều}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353455
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá mè]].
#:{{ux|sed|'''ká me''' akố hên 'nâng|'''Cá mè''' ở đây rất nhiều}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
h03c4wxt9vydyavcmkw8tfa24c4mafy
ká muk
0
397284
2353456
2026-05-15T05:47:53Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá mực]]. #:{{ux|sed|'''ká muk''' cho hdrê ká ki kơnâ tung têa kơxĭ tung lâp plâi tơnêi|'''Cá mực''' là một loại hải sản phổ biến trên toàn thế giới}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353456
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá mực]].
#:{{ux|sed|'''ká muk''' cho hdrê ká ki kơnâ tung têa kơxĭ tung lâp plâi tơnêi|'''Cá mực''' là một loại hải sản phổ biến trên toàn thế giới}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
e74e9nirgxmmd7weqre7a154mg7mdha
ká ngư
0
397285
2353459
2026-05-15T05:49:42Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá ngừ]]. #:{{ux|sed|'''ká ngư''' têa kơxĭ|'''Cá ngừ''' nước biển}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353459
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá ngừ]].
#:{{ux|sed|'''ká ngư''' têa kơxĭ|'''Cá ngừ''' nước biển}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
0excux6r1l2xx13fjcflffwc58jyjim
zik6
0
397286
2353460
2026-05-15T05:50:00Z
Hiyuune
50834
Trang mới: “=={{langname|yue}}== ==={{section|pron}}=== * {{IPA4|yue|/tsɪk˨/}} ==={{section|rom}}=== {{yue-jyut}} # {{yue-jyutping of|㑊}} # {{yue-jyutping of|直}} # {{yue-jyutping of|籍}} # {{yue-jyutping of|㔴}}”
2353460
wikitext
text/x-wiki
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA4|yue|/tsɪk˨/}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|㑊}}
# {{yue-jyutping of|直}}
# {{yue-jyutping of|籍}}
# {{yue-jyutping of|㔴}}
dgccj1ximkqer82dalggm9vpzqs3lpg
ká xêi
0
397287
2353461
2026-05-15T05:51:00Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá ngựa]]. #:{{ux|sed|'''ká xêi''' ga rĕng châ hlo tâ tá|'''Cá ngựa''' có thị lực rất tốt}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353461
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá ngựa]].
#:{{ux|sed|'''ká xêi''' ga rĕng châ hlo tâ tá|'''Cá ngựa''' có thị lực rất tốt}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
3qw5qid0yqarq4ufg18rrtg8unplh8m
㑊
0
397288
2353462
2026-05-15T05:51:18Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=9|rad=人|as=06|sn=8|four=|canj=OYLC|ids=⿰[[亻]][[亦]]}} ===={{section|ref}}==== * {{Han ref|kx=0100.200|dkj=00559|hdz=10152.030|uh=344A}} =={{langname|ja}}== ==={{section|kanji}}=== {{ja-kanji|grade=|rs=}} ===={{section|reading}}==== {{ja-readings |on=えき,やく }} =={{langname|zh}}== {{zh-forms}} ==={{section|pron}}=== {{zh-pron |m=yì |c=jik6 |mc= |oc= |ma= |cat=n }} ==={{section…”
2353462
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=9|rad=人|as=06|sn=8|four=|canj=OYLC|ids=⿰[[亻]][[亦]]}}
===={{section|ref}}====
* {{Han ref|kx=0100.200|dkj=00559|hdz=10152.030|uh=344A}}
=={{langname|ja}}==
==={{section|kanji}}===
{{ja-kanji|grade=|rs=}}
===={{section|reading}}====
{{ja-readings
|on=えき,やく
}}
=={{langname|zh}}==
{{zh-forms}}
==={{section|pron}}===
{{zh-pron
|m=yì
|c=jik6
|mc=
|oc=
|ma=
|cat=n
}}
==={{section|dfn}}===
{{head|zh|Danh từ}}
# {{zh-only|解㑊}}
kewc9kn8dd1ghmcsf8u6qwkk5ku83lb
yi4
0
397289
2353463
2026-05-15T05:51:49Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|yì}}”
2353463
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|yì}}
880b5h22im61mghbg914u4oqpe11jyl
lúgānshí
0
397290
2353464
2026-05-15T05:52:16Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{cmn-pinyin of|爐甘石}}”
2353464
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{cmn-pinyin of|爐甘石}}
3co32qhny0863hgrmdrufvujia8htsy
ká xêi ilá
0
397291
2353465
2026-05-15T05:52:44Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá ngựa]] [[gai]]. #:{{ux|sed|'''ká xêi ilá''' lâp châ ga mơngiơk prâp iâ|'''Cá ngựa gai''' có toàn thân màu nâu nhạt}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353465
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá ngựa]] [[gai]].
#:{{ux|sed|'''ká xêi ilá''' lâp châ ga mơngiơk prâp iâ|'''Cá ngựa gai''' có toàn thân màu nâu nhạt}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
aamzynpk04zs3m9yl8v5kluzfil8sar
炉甘石
0
397292
2353466
2026-05-15T05:53:13Z
Hiyuune
50834
Trang mới: “=={{langname|zh}}== {{zh-see|爐甘石}}”
2353466
wikitext
text/x-wiki
=={{langname|zh}}==
{{zh-see|爐甘石}}
qp5ueedh5a7kv9oxmnmfv0us9xygqp7
爐甘石
0
397293
2353467
2026-05-15T05:53:31Z
Hiyuune
50834
Trang mới: “=={{langname|zh}}== {{zh-forms|s=炉甘石}} {{wp|zh:}} ==={{section|pron}}=== {{zh-pron |m=lúgānshí |cat=n }} ==={{section|noun}}=== {{head|zh|Danh từ}} # {{lb|zh|mineral}} [[calamine|Calamine]].”
2353467
wikitext
text/x-wiki
=={{langname|zh}}==
{{zh-forms|s=炉甘石}}
{{wp|zh:}}
==={{section|pron}}===
{{zh-pron
|m=lúgānshí
|cat=n
}}
==={{section|noun}}===
{{head|zh|Danh từ}}
# {{lb|zh|mineral}} [[calamine|Calamine]].
lo402p26bgdfzwm60kantw542by5xxz
ká kêt
0
397294
2353468
2026-05-15T05:54:17Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá nhái]]. #:{{ux|sed|jâ rôe môi to '''ká kêt'''|Bà mua một con '''cá nhái'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353468
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá nhái]].
#:{{ux|sed|jâ rôe môi to '''ká kêt'''|Bà mua một con '''cá nhái'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
sxoa8d7mnq48h6so8o37gfpnczlzhpg
gan1
0
397295
2353469
2026-05-15T05:56:01Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "gan"}} =={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|gān}} =={{langname|yue}}== ==={{section|pron}}=== * {{Jyutping-IPA|gan1}} ==={{section|rom}}=== {{yue-jyut}} # {{yue-jyutping of|巾}} # {{yue-jyutping of|斤}} # {{yue-jyutping of|筋}} # {{yue-jyutping of|根}} # {{yue-jyutping of|跟}}”
2353469
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "gan"}}
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|gān}}
=={{langname|yue}}==
==={{section|pron}}===
* {{Jyutping-IPA|gan1}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|巾}}
# {{yue-jyutping of|斤}}
# {{yue-jyutping of|筋}}
# {{yue-jyutping of|根}}
# {{yue-jyutping of|跟}}
4gf9i6apa2tdz1h6d6qr0fudncfcubo
gān
0
397296
2353470
2026-05-15T05:56:49Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "gan"}} =={{langname|cmn}}== ==={{section|alt}}=== * {{alt|cmn|gan||nonstandard}} ==={{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|…”
2353470
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "gan"}}
=={{langname|cmn}}==
==={{section|alt}}===
* {{alt|cmn|gan||nonstandard}}
==={{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|鳱}}
eqn0nmc4db6c7q3tw19n2xnon7mnnj3
ká nhêt
0
397297
2353471
2026-05-15T05:56:57Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá nhệch]]. #:{{ux|sed|'''ká nhêt''' ai kéa jế, ngăn vâ môi tiah pah nâng la châ ga kân tâ|'''Cá nhệch''' có lớp da trơn, nhìn khá giống con lươn nhưng có kích thước lớn hơn}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353471
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá nhệch]].
#:{{ux|sed|'''ká nhêt''' ai kéa jế, ngăn vâ môi tiah pah nâng la châ ga kân tâ|'''Cá nhệch''' có lớp da trơn, nhìn khá giống con lươn nhưng có kích thước lớn hơn}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
f8obb5mr3r8yjnpbl6eqliuni6l3ug8
gań
0
397298
2353472
2026-05-15T05:57:56Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "gan"}} =={{langname|pl}}== ==={{section|pron}}=== {{pl-pr}} ==={{section|v}}=== {{head|pl|Biến thể hình thái động từ}} # {{inflection of|pl|ganić||imp|ở|2s}}”
2353472
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "gan"}}
=={{langname|pl}}==
==={{section|pron}}===
{{pl-pr}}
==={{section|v}}===
{{head|pl|Biến thể hình thái động từ}}
# {{inflection of|pl|ganić||imp|ở|2s}}
813f1naofhj09p5dwin9x44dbbqna3h
hơpông
0
397299
2353473
2026-05-15T05:58:43Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá quả]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353473
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá quả]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
nsxy3r5eoep9uhejas8ccipp7u60z8y
xơpuông
0
397300
2353474
2026-05-15T05:59:11Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # {{label|sed|dialectal}} [[cá quả]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353474
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# {{label|sed|dialectal}} [[cá quả]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
1g9zhmjqutpkj8ro4nqwypwerst07oy
hơpuông
0
397301
2353475
2026-05-15T05:59:36Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # {{label|sed|dialectal}} [[cá quả]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353475
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# {{label|sed|dialectal}} [[cá quả]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
1g9zhmjqutpkj8ro4nqwypwerst07oy
ká ilá
0
397302
2353478
2026-05-15T06:00:27Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá rô]]. #:{{ux|sed|'''ká ilá''' têa long|'''Cá rô''' nước ngọt}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353478
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá rô]].
#:{{ux|sed|'''ká ilá''' têa long|'''Cá rô''' nước ngọt}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
4hxlfwvo5il1ffd4604mohiyqyyzdai
ka xơla
0
397303
2353479
2026-05-15T06:00:49Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # {{label|sed|dialectal}} [[cá rô]]. ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353479
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# {{label|sed|dialectal}} [[cá rô]].
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
1v6os6pjzmb3iubbizi9hshw8eka4ab
Bản mẫu:sw-adj
10
397304
2353480
2026-05-15T06:02:10Z
Hiyuune
50834
Trang mới: “{{head|sw|Tính từ<!-- -->|head=<!-- -->{{#ifeq:{{{1}}}|inv|<!-- -->{{#ifeq:{{{2}}}|a|<!-- -->-a {{pagename}}|<!-- -->}}|<!-- -->-{{pagename}}<!-- -->}}<!-- -->|{{#ifeq:{{{1}}}|inv|<!-- -->không biến cách|<!-- -->biến cách<!-- -->}}<!-- -->|cat2=<!-- -->{{#ifeq:{{{1}}}|inv|<!-- -->Tính từ không biến cách<!-- -->}}<!-- -->}}<noinclude>{{tcat|hw}}{{tài liệu}}</noinclude>”
2353480
wikitext
text/x-wiki
{{head|sw|Tính từ<!--
-->|head=<!--
-->{{#ifeq:{{{1}}}|inv|<!--
-->{{#ifeq:{{{2}}}|a|<!--
-->-a {{pagename}}|<!--
-->}}|<!--
-->-{{pagename}}<!--
-->}}<!--
-->|{{#ifeq:{{{1}}}|inv|<!--
-->không biến cách|<!--
-->biến cách<!--
-->}}<!--
-->|cat2=<!--
-->{{#ifeq:{{{1}}}|inv|<!--
-->Tính từ không biến cách<!--
-->}}<!--
-->}}<noinclude>{{tcat|hw}}{{tài liệu}}</noinclude>
oubl2czsnkci9g0z7eohpss3r98ufms
ká ilá têa kơxĭ
0
397305
2353482
2026-05-15T06:02:53Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá rô]] [[biển]]. #:{{ux|sed|kố cho '''ká ilá têa kơxĭ'''|Đây là loài '''cá rô biển'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353482
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá rô]] [[biển]].
#:{{ux|sed|kố cho '''ká ilá têa kơxĭ'''|Đây là loài '''cá rô biển'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
kj2kd9zca04229opjyruv9es2eqvwmu
ká ilá păn
0
397306
2353484
2026-05-15T06:03:35Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá rô phi]]. #:{{ux|sed|'''ká ilá păn''' dế ối rêh|'''Cá rô phi''' đang sống}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353484
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá rô phi]].
#:{{ux|sed|'''ká ilá păn''' dế ối rêh|'''Cá rô phi''' đang sống}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
gj1lr3hbdex1wyabmlmpdvqoo8ibxak
ká trĭng
0
397307
2353485
2026-05-15T06:04:59Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá vàng]]. #:{{ux|sed|xah păn '''ká trĭng'''|Chơi '''cá vàng'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353485
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá vàng]].
#:{{ux|sed|xah păn '''ká trĭng'''|Chơi '''cá vàng'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
ts8af74sawf5z9jpa7g3wnrf3otup6b
瀀
0
397308
2353486
2026-05-15T06:05:34Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=85|rad=水|as=15|sn=18|four=31147|canj=EMBE|ids=⿰氵憂}} ===={{ĐM|ref}}==== * {{Han ref|kx=0658.140|dkj=18571|dj=1068.140|hdz=31777.090|uh=7000}}”
2353486
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=85|rad=水|as=15|sn=18|four=31147|canj=EMBE|ids=⿰氵憂}}
===={{ĐM|ref}}====
* {{Han ref|kx=0658.140|dkj=18571|dj=1068.140|hdz=31777.090|uh=7000}}
b8d5fus05jijypu40z55xndeta9iz7i
hơpong
0
397309
2353487
2026-05-15T06:05:50Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá sộp]]. #:{{ux|sed|'''hơpông''' hmâ rêh ối a têa long|'''Cá sộp''' thường ở vùng nước ngọt}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353487
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá sộp]].
#:{{ux|sed|'''hơpông''' hmâ rêh ối a têa long|'''Cá sộp''' thường ở vùng nước ngọt}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
2uyaem0tnoos0iqm87c5y0f7ipqfpny
jau1
0
397310
2353488
2026-05-15T06:06:10Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|pron}}=== {{Jyutping-IPA|jau1}} ==={{section|rom}}=== {{yue-jyut}} # {{yue-jyutping of|丘}} # {{yue-jyutping of|憂}} # {{yue-jyutping of|休}} # {{yue-jyutping of|呦}}”
2353488
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|pron}}===
{{Jyutping-IPA|jau1}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|丘}}
# {{yue-jyutping of|憂}}
# {{yue-jyutping of|休}}
# {{yue-jyutping of|呦}}
2y8631qr62s2pah2yhzv5aeq2ejgrif
you1
0
397311
2353489
2026-05-15T06:06:31Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|yōu}}”
2353489
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|yōu}}
i3vjs8pf8p360hp4x13giq99vi18lqm
yōu
0
397312
2353490
2026-05-15T06:07:07Z
Hiyuune
50834
Trang mới: “{{also|you|You|yóu|yòu|yǒu|ȝou|þou}} =={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{cmn-pinyin of|優}} # {{cmn-pinyin of|呦}} # {{cmn-pinyin of|嚘}} # {{cmn-pinyin of|幽}} # {{cmn-pinyin of|忧}} # {{cmn-pinyin of|怮}} # {{cmn-pinyin of|悠}} # {{cmn-pinyin of|憂}} # {{cmn-pinyin of|懬}} # {{cmn-pinyin of|攸}} # {{cmn-pinyin of|櫌}} # {{cmn-pinyin of|泅}} # {{cmn-pinyin of|泍}} # {{cmn-pinyin of|瀀}} # {{cmn-pinyin of|纋}} # {{cmn-pinyin…”
2353490
wikitext
text/x-wiki
{{also|you|You|yóu|yòu|yǒu|ȝou|þou}}
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{cmn-pinyin of|優}}
# {{cmn-pinyin of|呦}}
# {{cmn-pinyin of|嚘}}
# {{cmn-pinyin of|幽}}
# {{cmn-pinyin of|忧}}
# {{cmn-pinyin of|怮}}
# {{cmn-pinyin of|悠}}
# {{cmn-pinyin of|憂}}
# {{cmn-pinyin of|懬}}
# {{cmn-pinyin of|攸}}
# {{cmn-pinyin of|櫌}}
# {{cmn-pinyin of|泅}}
# {{cmn-pinyin of|泍}}
# {{cmn-pinyin of|瀀}}
# {{cmn-pinyin of|纋}}
# {{cmn-pinyin of|耰}}
# {{cmn-pinyin of|蚱}}
# {{cmn-pinyin of|鄾}}
# {{cmn-pinyin of|麀}}
nn9soo57y704cj2x59hgrztow6tqyf7
ká tai tươ̆ng
0
397313
2353491
2026-05-15T06:08:03Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá tai tượng]]. #:{{ux|sed|'''ká tai tươ̆ng''' cho kế kâ kơhiâm dêi peăng Mâ hâi lu pa Hdroh|'''Cá tai tượng''' là đặc sản của miền Tây Nam Bộ}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353491
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá tai tượng]].
#:{{ux|sed|'''ká tai tươ̆ng''' cho kế kâ kơhiâm dêi peăng Mâ hâi lu pa Hdroh|'''Cá tai tượng''' là đặc sản của miền Tây Nam Bộ}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
rk5wuy53kn37zsg09i9vtja5sdme02p
yǒu
0
397314
2353492
2026-05-15T06:08:06Z
Hiyuune
50834
Trang mới: “{{also|you|You|yóu|yòu|yōu|ȝou|þou}} =={{langname|cmn}}== ==={{Đ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|…”
2353492
wikitext
text/x-wiki
{{also|you|You|yóu|yòu|yōu|ȝou|þou}}
=={{langname|cmn}}==
==={{Đ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|黝}}
3z089a812tp9qwjo7appcbudgwdhyr3
you3
0
397315
2353493
2026-05-15T06:08:32Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|yǒu}}”
2353493
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|yǒu}}
nhcg57ru4xlzlwhdq04ef3cyzgdbkqa
ká thu
0
397316
2353494
2026-05-15T06:09:27Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá thu]]. #:{{ux|sed|'''ká thu''' hơ'nêh ối drêh lĕm|'''Cá thu''' rất tươi}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353494
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá thu]].
#:{{ux|sed|'''ká thu''' hơ'nêh ối drêh lĕm|'''Cá thu''' rất tươi}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
sqoy07jkqjnhwncfvasrhktyvmcb9d2
ká trăm koh
0
397317
2353495
2026-05-15T06:10:51Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá trắm cỏ]]. #:{{ux|sed|'''ká trăm koh''' kân|'''cá trắm cỏ''' to}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353495
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá trắm cỏ]].
#:{{ux|sed|'''ká trăm koh''' kân|'''cá trắm cỏ''' to}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
d65az0tou9n9nxp606ad8ajumhwwqqn
ká klôa
0
397318
2353497
2026-05-15T06:13:26Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá trắng]]. #:{{ux|sed|'''ká klôa''' ai hên|'''cá trắng''' rất nhiều}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353497
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá trắng]].
#:{{ux|sed|'''ká klôa''' ai hên|'''cá trắng''' rất nhiều}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
1p2h4st393xy2gxfmcf6h4lkjjlrg9n
xơpông
0
397319
2353498
2026-05-15T06:15:01Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá tràu]]. #:{{ux|sed|'''xơpông''' ối rêh|'''cá tràu''' sống}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353498
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá tràu]].
#:{{ux|sed|'''xơpông''' ối rêh|'''cá tràu''' sống}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
tpvv89xn0rnxqhon8sk6h9leghokj4y
hơmâng
0
397320
2353499
2026-05-15T06:17:43Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá trê]]. #:{{ux|sed|'''hơmâng '''cho hdrê ká kéa jế|'''Cá trê''' là loại cá da trơn}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353499
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá trê]].
#:{{ux|sed|'''hơmâng '''cho hdrê ká kéa jế|'''Cá trê''' là loại cá da trơn}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
1ascp0ugmh409o23gv7kjpwetr7uevl
ká trit
0
397321
2353500
2026-05-15T06:19:33Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá trích]]. #:{{ux|sed|pro kế kâ ing '''ká trit'''|Sơ chế '''cá trích'''}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353500
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá trích]].
#:{{ux|sed|pro kế kâ ing '''ká trit'''|Sơ chế '''cá trích'''}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
t0a7spn7fohaq1tb4a9grnp688q43q0
ká drêh
0
397322
2353501
2026-05-15T06:21:13Z
WhoAlone
40420
Trang mới: “=={{langname|sed}}== ==={{ĐM|noun}}=== {{head|sed|Danh từ}} # [[cá tươi]]. #:{{ux|sed|'''ká drêh '''nếo rôe ing kơchơ djâ vêh|'''cá tươi''' vừa mua về}} ==={{đm|ref}}=== {{R:VOV}} {{c|sed|Cá}}”
2353501
wikitext
text/x-wiki
=={{langname|sed}}==
==={{ĐM|noun}}===
{{head|sed|Danh từ}}
# [[cá tươi]].
#:{{ux|sed|'''ká drêh '''nếo rôe ing kơchơ djâ vêh|'''cá tươi''' vừa mua về}}
==={{đm|ref}}===
{{R:VOV}}
{{c|sed|Cá}}
i5iggl328z93bubprywgplcb118x5zc
兄弟
0
397323
2353502
2026-05-15T06:23:13Z
WhoAlone
40420
Trang mới: “=={{langname|vi}}== {{vi-hantutab}} ==={{ĐM|noun}}=== {{vi-noun}} # {{vi-Han form of|huynh đệ}} =={{langname|xug}}== {{xug-kanjitab|ちょー|れー}} ==={{ĐM|etym}}=== Cùng gốc với {{cog|ja|兄弟|tr=kyōdai}}. ==={{ĐM|pron}}=== * {{IPA4|xug|/t͡ɕoːɾeː/}} ==={{ĐM|noun}}=== {{xug-head|noun|ちょーれー}} # [[anh chị em]]. {{c|xug|Gia đình}}”
2353502
wikitext
text/x-wiki
=={{langname|vi}}==
{{vi-hantutab}}
==={{ĐM|noun}}===
{{vi-noun}}
# {{vi-Han form of|huynh đệ}}
=={{langname|xug}}==
{{xug-kanjitab|ちょー|れー}}
==={{ĐM|etym}}===
Cùng gốc với {{cog|ja|兄弟|tr=kyōdai}}.
==={{ĐM|pron}}===
* {{IPA4|xug|/t͡ɕoːɾeː/}}
==={{ĐM|noun}}===
{{xug-head|noun|ちょーれー}}
# [[anh chị em]].
{{c|xug|Gia đình}}
fv5n9nqtkbipk2nvfo60j2vnl55wgsz
Thể loại:Từ đánh vần với kanji lớp 2 tiếng Kunigami
14
397324
2353503
2026-05-15T06:24:02Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353503
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có 2 ký tự kanji tiếng Kunigami
14
397325
2353504
2026-05-15T06:24:08Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353504
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
天道
0
397326
2353505
2026-05-15T06:27:03Z
WhoAlone
40420
Trang mới: “=={{langname|vi}}== {{vi-hantutab}} ==={{ĐM|noun}}=== {{vi-noun|sc=Hani}} # {{vi-Han form of|thiên đạo}} =={{langname|xug}}== ==={{ĐM|etym}} 1=== {{xug-kanjitab|alt=太陽}} Từ {{inh|xug|jpx-ryu-pro|*teda}}. ===={{ĐM|noun}}==== {{xug-head|noun|てぃだ}} # {{lb|xug|astronomy}} [[mặt trời]]. ==={{ĐM|etym}} 2=== {{xug-kanjitab|alt=太陽}} Từ {{inh|xug|jpx-ryu-pro|*teda}}. ===={{ĐM|noun}}==== {{xug-head|noun|てぃだー|sort=てぃだあ}} #…”
2353505
wikitext
text/x-wiki
=={{langname|vi}}==
{{vi-hantutab}}
==={{ĐM|noun}}===
{{vi-noun|sc=Hani}}
# {{vi-Han form of|thiên đạo}}
=={{langname|xug}}==
==={{ĐM|etym}} 1===
{{xug-kanjitab|alt=太陽}}
Từ {{inh|xug|jpx-ryu-pro|*teda}}.
===={{ĐM|noun}}====
{{xug-head|noun|てぃだ}}
# {{lb|xug|astronomy}} [[mặt trời]].
==={{ĐM|etym}} 2===
{{xug-kanjitab|alt=太陽}}
Từ {{inh|xug|jpx-ryu-pro|*teda}}.
===={{ĐM|noun}}====
{{xug-head|noun|てぃだー|sort=てぃだあ}}
# {{lb|xug|Nakijin|sort=てぃだあ}} [[mặt trời]].
==={{ĐM|ref}}===
* {{R:JLect|てぃだ【天道・太陽】|83|tida}}
=={{langname|ko}}==
{{ko-hanjatab}}
==={{ĐM|noun}}===
{{ko-noun|hangeul=천도}}
# {{hanja form of|천도|[[thiên đạo]]}}
85ceq528enbt88bl1p6g98km3lxoi4z
いう
0
397327
2353506
2026-05-15T06:28:39Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|言う|酉|优|佑|優|冘|又|友|右|呦|嚘|囿|妋|宥|幼|幽|悠|憂|攸|有|柚|楢|油|猶|猷|由|疣|祐|蚰|誘|遊|郵|釉|鮪|黝}} =={{langname|ryu}}== ==={{ĐM|noun}}=== {{ryu-head|noun}} # {{ryu-def|魚}} [[cá]].”
2353506
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|言う|酉|优|佑|優|冘|又|友|右|呦|嚘|囿|妋|宥|幼|幽|悠|憂|攸|有|柚|楢|油|猶|猷|由|疣|祐|蚰|誘|遊|郵|釉|鮪|黝}}
=={{langname|ryu}}==
==={{ĐM|noun}}===
{{ryu-head|noun}}
# {{ryu-def|魚}} [[cá]].
5csmi6w9fms88vjz9k32idzmjx4cs21
yuu
0
397328
2353507
2026-05-15T06:29:15Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|ゆう}}”
2353507
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|ゆう}}
ca1t9eo2806qlw4kkwlqamsm4w7of9u
ゆう
0
397329
2353508
2026-05-15T06:29:41Z
WhoAlone
40420
Trang mới: “{{also|ゆー}} =={{langname|ja}}== {{ja-see|夕|友|有|佑|言う|侑|勇|悠|結う|優|邑}}”
2353508
wikitext
text/x-wiki
{{also|ゆー}}
=={{langname|ja}}==
{{ja-see|夕|友|有|佑|言う|侑|勇|悠|結う|優|邑}}
gi6dff6pfgv4xhne1birv6a2kvt6x8v
いふ
0
397330
2353509
2026-05-15T06:30:03Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|暖|意符|言ふ|邑|言う}}”
2353509
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|暖|意符|言ふ|邑|言う}}
4u9pxvjfba4p2vxfh98ukily0lgzh24
言い
0
397331
2353510
2026-05-15T06:30:30Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|い|y=k}} {{ja-see|いい}}”
2353510
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|い|y=k}}
{{ja-see|いい}}
jkswi22w0iniydrytwjd43xhs5tymm7
言った
0
397332
2353511
2026-05-15T06:32:00Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|い|yomi=k|alt=ゆった:colloquial}} ==={{ĐM|pron}}=== {{ja-pron|いった}} ==={{ĐM|verb}}=== {{ja-verb form|いった}} # {{ja-verb form of|言う|hira=いう|godan|た}} #: {{ja-usex|[[鼻]]に[[入れる|入れない]]で[[と]]'''言った'''[[でしょう]]。|はな に いれないで と '''いった''' でしょう。|Tôi '''đã bảo''' là đừng cho cái đấy vào mũi, đúng không nào?}}”
2353511
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|い|yomi=k|alt=ゆった:colloquial}}
==={{ĐM|pron}}===
{{ja-pron|いった}}
==={{ĐM|verb}}===
{{ja-verb form|いった}}
# {{ja-verb form of|言う|hira=いう|godan|た}}
#: {{ja-usex|[[鼻]]に[[入れる|入れない]]で[[と]]'''言った'''[[でしょう]]。|はな に いれないで と '''いった''' でしょう。|Tôi '''đã bảo''' là đừng cho cái đấy vào mũi, đúng không nào?}}
rxlqs4s3mcpvwumdav0mpyll3j7fdfd
いった
0
397333
2353512
2026-05-15T06:32:18Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|言った|入った|行った}}”
2353512
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|言った|入った|行った}}
a1jvss4fa153r1jf8gvqf46kom4p1kl
ゆった
0
397334
2353513
2026-05-15T06:49:39Z
Hiyuune
50834
Trang mới: “=={{langname|ja}}== {{ja-see|言った}}”
2353513
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|言った}}
hkqky1uoicriv3e6d9kp5ssdt4ati6d
xalqaro
0
397335
2353514
2026-05-15T06:55:10Z
Kelly zhrm
58416
Trang mới: “=={{langname|uz}}== ==={{ĐM|adj}}=== {{head|uz|Tính từ}} # [[quốc tế|Quốc tế]].”
2353514
wikitext
text/x-wiki
=={{langname|uz}}==
==={{ĐM|adj}}===
{{head|uz|Tính từ}}
# [[quốc tế|Quốc tế]].
2rxhb0kmapr4ztm0xbqa0rk4g3znxwe
ngok6
0
397336
2353515
2026-05-15T06:56:36Z
Hiyuune
50834
Trang mới: “=={{langname|yue}}== ==={{section|pron}}=== * {{IPA4|yue|/ŋɔːk˨/}} ==={{section|rom}}=== {{yue-jyut}} # {{yue-jyutping of|𩓥}} # {{yue-jyutping of|㓵}} # {{yue-jyutping of|崿}} # {{yue-jyutping of|愕}} # {{yue-jyutping of|樂}}”
2353515
wikitext
text/x-wiki
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA4|yue|/ŋɔːk˨/}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|𩓥}}
# {{yue-jyutping of|㓵}}
# {{yue-jyutping of|崿}}
# {{yue-jyutping of|愕}}
# {{yue-jyutping of|樂}}
cbw6ykrh9bvzhdn3e5hjsv0oh4exz0z
村崎
0
397337
2353517
2026-05-15T07:01:44Z
Hiyuune
50834
+ ja
2353517
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|むら|さき|yomi=k}}
==={{section|pr-noun}}===
{{ja-pos|proper|むらさき}}
# {{surname|ja|sort=むらさき}}
guv58qwo1hs566k4wv4he6yh91sz9h3
むらさき
0
397338
2353518
2026-05-15T07:01:52Z
Hiyuune
50834
Trang mới: “=={{langname|ja}}== {{ja-see|紫|村崎}}”
2353518
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|紫|村崎}}
71zvw0qs9wyujs66jk4tnedrqbhzdxm
irankarapte
0
397339
2353521
2026-05-15T07:12:13Z
Hiyuune
50834
Trang mới: “=={{langname|ain}}== ==={{section|interj}}=== {{head|ain|Thán từ|chính tả Kana|イランカラㇷ゚テ}} # [[xin chào|Xin chào]].”
2353521
wikitext
text/x-wiki
=={{langname|ain}}==
==={{section|interj}}===
{{head|ain|Thán từ|chính tả Kana|イランカラㇷ゚テ}}
# [[xin chào|Xin chào]].
jp5f22g6t81ydwxt9u4co9zmduqqpnp
イランカラㇷ゚テ
0
397340
2353524
2026-05-15T07:13:44Z
Hiyuune
50834
Trang mới: “=={{langname|ain}}== {{phrasebook|ain|Chào hỏi}} ==={{section|alt}}=== * {{alt|ain|イランカラㇵテ|tr=irankarahte}} {{q|Sakhalin}} ==={{section|pron}}=== {{ain-IPA|irankarapte}} ==={{section|interj}}=== {{head|ain|Thán từ|tr=irankarapte}} # [[xin chào|Xin chào]] # [[chào|Chào]] [[buổi sáng]]. {{cln|ain|Chào hỏi}}”
2353524
wikitext
text/x-wiki
=={{langname|ain}}==
{{phrasebook|ain|Chào hỏi}}
==={{section|alt}}===
* {{alt|ain|イランカラㇵテ|tr=irankarahte}} {{q|Sakhalin}}
==={{section|pron}}===
{{ain-IPA|irankarapte}}
==={{section|interj}}===
{{head|ain|Thán từ|tr=irankarapte}}
# [[xin chào|Xin chào]]
# [[chào|Chào]] [[buổi sáng]].
{{cln|ain|Chào hỏi}}
ocnnaoir4ilbighbxkuhgzo7j9ltnxg
ine ikasma wan
0
397341
2353525
2026-05-15T07:15:14Z
Hiyuune
50834
Trang mới: “=={{langname|ain}}== {{cardinalbox|ain|13|14|15|re ikasma wan|asikne ikasma wan|ord=ine ikinne ikasma wan ikinne}} ==={{section|etym}}=== Từ {{compound|ain|ine|ikasma|wan|t1=bốn|t3=mười}}. ==={{section|num}}=== {{ain-numeral|l|イネ イカㇱマ ワン}} # [[mười bốn|Mười bốn]].”
2353525
wikitext
text/x-wiki
=={{langname|ain}}==
{{cardinalbox|ain|13|14|15|re ikasma wan|asikne ikasma wan|ord=ine ikinne ikasma wan ikinne}}
==={{section|etym}}===
Từ {{compound|ain|ine|ikasma|wan|t1=bốn|t3=mười}}.
==={{section|num}}===
{{ain-numeral|l|イネ イカㇱマ ワン}}
# [[mười bốn|Mười bốn]].
4vgnrxfh4s89qzva6cetkxlym1btp1f
Thể loại:Mục từ có chứa nhiều từ tiếng Azerbaijan
14
397342
2353528
2026-05-15T07:20:23Z
Kelly zhrm
58416
Trang mới: “{{auto cat}}”
2353528
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Bản mẫu:ny-head
10
397343
2353530
2026-05-15T07:22:37Z
Hiyuune
50834
Trang mới: “{{#invoke:call|call|head|ny|{{{1}}}|head={{#if:{{{2|}}}|{{{2}}}|{{pagename}}<sup title="thiếu thanh điệu">?</sup>{{cln|ny|Yêu cầu thanh điệu mục từ}}}}|g={{#if:{{{3|}}}|c{{{3}}}}} |@ignore=1,2,3 |@error_if=head,g }}<!-- --><includeonly>{{#if:{{{3|}}}||{{#switch:{{#invoke:headword/templates|canonicalize_pos|{{{1}}}}}|Biến thể hình thái danh từ|proper nouns={{cln|ny|Yêu cầu giống mục từ}}}}}}</includeonly><noinclude>{{tài liệu}}</noinclude>”
2353530
wikitext
text/x-wiki
{{#invoke:call|call|head|ny|{{{1}}}|head={{#if:{{{2|}}}|{{{2}}}|{{pagename}}<sup title="thiếu thanh điệu">?</sup>{{cln|ny|Yêu cầu thanh điệu mục từ}}}}|g={{#if:{{{3|}}}|c{{{3}}}}}
|@ignore=1,2,3
|@error_if=head,g
}}<!--
--><includeonly>{{#if:{{{3|}}}||{{#switch:{{#invoke:headword/templates|canonicalize_pos|{{{1}}}}}|Biến thể hình thái danh từ|proper nouns={{cln|ny|Yêu cầu giống mục từ}}}}}}</includeonly><noinclude>{{tài liệu}}</noinclude>
2l4pm4sc57oqn4w4swno3xd4io60iwm
ine
0
397344
2353533
2026-05-15T07:26:57Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "ine"}} =={{langname|mul}}== ==={{section|symbol}}=== {{mul-symbol}} # {{ISO 639|2&5||Tiếng Ấn-Âu nguyên thủy}} =={{langname|aau}}== ==={{section|pron}}=== * {{IPA4|aau|/ˈi.ne/}} ==={{section|n}}=== {{head|aau|Danh từ}} {{aau-noun|1|f}} # [[chị|Chị]] [[tôi]]. ===={{section|decl}}==== {{aau-ndecl|stem=ine}} ==={{section|ref}}=== * Lock, Arnold Hugo. 2011. ''Abau Grammar''. Data Papers on Papua New Guinea Languag…”
2353533
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "ine"}}
=={{langname|mul}}==
==={{section|symbol}}===
{{mul-symbol}}
# {{ISO 639|2&5||Tiếng Ấn-Âu nguyên thủy}}
=={{langname|aau}}==
==={{section|pron}}===
* {{IPA4|aau|/ˈi.ne/}}
==={{section|n}}===
{{head|aau|Danh từ}} {{aau-noun|1|f}}
# [[chị|Chị]] [[tôi]].
===={{section|decl}}====
{{aau-ndecl|stem=ine}}
==={{section|ref}}===
* Lock, Arnold Hugo. 2011. ''Abau Grammar''. Data Papers on Papua New Guinea Languages 57. Ukarumpa, Papua New Guinea: SIL-PNG Academic Publications. [https://www.sil.org/system/files/reapdata/33/13/86/33138664671583783026160672477079448010/DPv57_Abau_Grammar_final_%28pdfA%29.pdf Available online].
** Table 12: Vowel harmony in the suffixation of kinship terms, tr.29
** Footnote 3, tr.29
=={{langname|ain}}==
{{cardinalbox|ain|3|4|5|re|asikne|ord=ine ikinne}}
==={{section|pron}}===
* {{ain-IPA|íne}}
==={{section|num}}===
{{ain-numeral|l|イネ}}
# [[bốn|Bốn]].
=={{langname|akx}}==
==={{section|n}}===
{{head|akx|Danh từ}}
# [[nước|Nước]].
==={{section|ref}}===
* [http://asjp.clld.org/languages/AKA_KEDE ASJP], citing the Rosetta Project; and Jonathan Morris, trong ''In Hot Pursuit of Language in Prehistory'' (biến tập bởi John D. Bengtson)
=={{langname|ny}}==
==={{section|etym}}===
Cùng gốc với {{cog|yao|une||tôi}}.
==={{section|pron}}===
* {{ny-IPA}}
==={{section|pronoun}}===
{{ny-head|Đại từ|ine}}
# [[tôi|Tôi]] {{gloss|đại từ nhân xưng ở ngôi thứ nhất số nhiều}}.
===={{section|see}}====
{{ny-personal pronouns}}
=={{langname|ite}}==
==={{section|n}}===
{{head|ite|Danh từ}}
# [[báo đốm|Báo đốm]].
=={{langname|it}}==
==={{section|pron}}===
{{it-pr|^ì}}
==={{section|adj}}===
{{head|it|Biến thể hình thái tính từ}}
# {{feminine plural of|it|ino}}
tcri09qqg6u996420lrdw6racz7mzdn
2353539
2353533
2026-05-15T07:33:21Z
Hiyuune
50834
/* Tiếng Itene */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353539
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "ine"}}
=={{langname|mul}}==
==={{section|symbol}}===
{{mul-symbol}}
# {{ISO 639|2&5||Tiếng Ấn-Âu nguyên thủy}}
=={{langname|aau}}==
==={{section|pron}}===
* {{IPA4|aau|/ˈi.ne/}}
==={{section|n}}===
{{head|aau|Danh từ}} {{aau-noun|1|f}}
# [[chị|Chị]] [[tôi]].
===={{section|decl}}====
{{aau-ndecl|stem=ine}}
==={{section|ref}}===
* Lock, Arnold Hugo. 2011. ''Abau Grammar''. Data Papers on Papua New Guinea Languages 57. Ukarumpa, Papua New Guinea: SIL-PNG Academic Publications. [https://www.sil.org/system/files/reapdata/33/13/86/33138664671583783026160672477079448010/DPv57_Abau_Grammar_final_%28pdfA%29.pdf Available online].
** Table 12: Vowel harmony in the suffixation of kinship terms, tr.29
** Footnote 3, tr.29
=={{langname|ain}}==
{{cardinalbox|ain|3|4|5|re|asikne|ord=ine ikinne}}
==={{section|pron}}===
* {{ain-IPA|íne}}
==={{section|num}}===
{{ain-numeral|l|イネ}}
# [[bốn|Bốn]].
=={{langname|akx}}==
==={{section|n}}===
{{head|akx|Danh từ}}
# [[nước|Nước]].
==={{section|ref}}===
* [http://asjp.clld.org/languages/AKA_KEDE ASJP], citing the Rosetta Project; and Jonathan Morris, trong ''In Hot Pursuit of Language in Prehistory'' (biến tập bởi John D. Bengtson)
=={{langname|ny}}==
==={{section|etym}}===
Cùng gốc với {{cog|yao|une||tôi}}.
==={{section|pron}}===
* {{ny-IPA}}
==={{section|pronoun}}===
{{ny-head|Đại từ|ine}}
# [[tôi|Tôi]] {{gloss|đại từ nhân xưng ở ngôi thứ nhất số nhiều}}.
===={{section|see}}====
{{ny-personal pronouns}}
=={{langname|ite}}==
==={{section|n}}===
{{head|ite|Danh từ}}
# [[báo đốm|Báo đốm]].
=={{langname|ja}}==
==={{section|rom}}===
{{ja-romaji}}
# {{ja-romanization of|いね}}
=={{langname|it}}==
==={{section|pron}}===
{{it-pr|^ì}}
==={{section|adj}}===
{{head|it|Biến thể hình thái tính từ}}
# {{feminine plural of|it|ino}}
6ht9wmw4bfpn3fx3yozcym2zquwg1sq
2353540
2353539
2026-05-15T07:34:59Z
Hiyuune
50834
/* Tham khảo */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353540
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "ine"}}
=={{langname|mul}}==
==={{section|symbol}}===
{{mul-symbol}}
# {{ISO 639|2&5||Tiếng Ấn-Âu nguyên thủy}}
=={{langname|aau}}==
==={{section|pron}}===
* {{IPA4|aau|/ˈi.ne/}}
==={{section|n}}===
{{head|aau|Danh từ}} {{aau-noun|1|f}}
# [[chị|Chị]] [[tôi]].
===={{section|decl}}====
{{aau-ndecl|stem=ine}}
==={{section|ref}}===
* Lock, Arnold Hugo. 2011. ''Abau Grammar''. Data Papers on Papua New Guinea Languages 57. Ukarumpa, Papua New Guinea: SIL-PNG Academic Publications. [https://www.sil.org/system/files/reapdata/33/13/86/33138664671583783026160672477079448010/DPv57_Abau_Grammar_final_%28pdfA%29.pdf Available online].
** Table 12: Vowel harmony in the suffixation of kinship terms, tr.29
** Footnote 3, tr.29
=={{langname|ain}}==
{{cardinalbox|ain|3|4|5|re|asikne|ord=ine ikinne}}
==={{section|pron}}===
* {{ain-IPA|íne}}
==={{section|num}}===
{{ain-numeral|l|イネ}}
# [[bốn|Bốn]].
=={{langname|akx}}==
==={{section|n}}===
{{head|akx|Danh từ}}
# [[nước|Nước]].
==={{section|ref}}===
* [http://asjp.clld.org/languages/AKA_KEDE ASJP], citing the Rosetta Project; and Jonathan Morris, trong ''In Hot Pursuit of Language in Prehistory'' (biến tập bởi John D. Bengtson)
=={{langname|enm}}==
==={{section|etym}} 1===
===={{seciton|n}}====
{{head|enm|Danh từ|altform=1}}
# {{alt form|enm|in}}
==={{section|etym}} 2===
===={{section|preposition}}====
{{head|enm|Giới từ|altform=1}}
# {{alt form|enm|in}}
==={{section|etym}} 3===
===={{section|pronoun}}====
{{head|enm|Đại từ|altform=1}}
# {{alt form|enm|hine}}
=={{langname|ny}}==
==={{section|etym}}===
Cùng gốc với {{cog|yao|une||tôi}}.
==={{section|pron}}===
* {{ny-IPA}}
==={{section|pronoun}}===
{{ny-head|Đại từ|ine}}
# [[tôi|Tôi]] {{gloss|đại từ nhân xưng ở ngôi thứ nhất số nhiều}}.
===={{section|see}}====
{{ny-personal pronouns}}
=={{langname|ite}}==
==={{section|n}}===
{{head|ite|Danh từ}}
# [[báo đốm|Báo đốm]].
=={{langname|ja}}==
==={{section|rom}}===
{{ja-romaji}}
# {{ja-romanization of|いね}}
=={{langname|it}}==
==={{section|pron}}===
{{it-pr|^ì}}
==={{section|adj}}===
{{head|it|Biến thể hình thái tính từ}}
# {{feminine plural of|it|ino}}
fhvzwgnbfe6vr5vowjnysjvagz46i7k
2353541
2353540
2026-05-15T07:35:12Z
Hiyuune
50834
/* Bản mẫu:seciton */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2353541
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "ine"}}
=={{langname|mul}}==
==={{section|symbol}}===
{{mul-symbol}}
# {{ISO 639|2&5||Tiếng Ấn-Âu nguyên thủy}}
=={{langname|aau}}==
==={{section|pron}}===
* {{IPA4|aau|/ˈi.ne/}}
==={{section|n}}===
{{head|aau|Danh từ}} {{aau-noun|1|f}}
# [[chị|Chị]] [[tôi]].
===={{section|decl}}====
{{aau-ndecl|stem=ine}}
==={{section|ref}}===
* Lock, Arnold Hugo. 2011. ''Abau Grammar''. Data Papers on Papua New Guinea Languages 57. Ukarumpa, Papua New Guinea: SIL-PNG Academic Publications. [https://www.sil.org/system/files/reapdata/33/13/86/33138664671583783026160672477079448010/DPv57_Abau_Grammar_final_%28pdfA%29.pdf Available online].
** Table 12: Vowel harmony in the suffixation of kinship terms, tr.29
** Footnote 3, tr.29
=={{langname|ain}}==
{{cardinalbox|ain|3|4|5|re|asikne|ord=ine ikinne}}
==={{section|pron}}===
* {{ain-IPA|íne}}
==={{section|num}}===
{{ain-numeral|l|イネ}}
# [[bốn|Bốn]].
=={{langname|akx}}==
==={{section|n}}===
{{head|akx|Danh từ}}
# [[nước|Nước]].
==={{section|ref}}===
* [http://asjp.clld.org/languages/AKA_KEDE ASJP], citing the Rosetta Project; and Jonathan Morris, trong ''In Hot Pursuit of Language in Prehistory'' (biến tập bởi John D. Bengtson)
=={{langname|enm}}==
==={{section|etym}} 1===
===={{section|n}}====
{{head|enm|Danh từ|altform=1}}
# {{alt form|enm|in}}
==={{section|etym}} 2===
===={{section|preposition}}====
{{head|enm|Giới từ|altform=1}}
# {{alt form|enm|in}}
==={{section|etym}} 3===
===={{section|pronoun}}====
{{head|enm|Đại từ|altform=1}}
# {{alt form|enm|hine}}
=={{langname|ny}}==
==={{section|etym}}===
Cùng gốc với {{cog|yao|une||tôi}}.
==={{section|pron}}===
* {{ny-IPA}}
==={{section|pronoun}}===
{{ny-head|Đại từ|ine}}
# [[tôi|Tôi]] {{gloss|đại từ nhân xưng ở ngôi thứ nhất số nhiều}}.
===={{section|see}}====
{{ny-personal pronouns}}
=={{langname|ite}}==
==={{section|n}}===
{{head|ite|Danh từ}}
# [[báo đốm|Báo đốm]].
=={{langname|ja}}==
==={{section|rom}}===
{{ja-romaji}}
# {{ja-romanization of|いね}}
=={{langname|it}}==
==={{section|pron}}===
{{it-pr|^ì}}
==={{section|adj}}===
{{head|it|Biến thể hình thái tính từ}}
# {{feminine plural of|it|ino}}
qby8bcbjrj7pv6c0gtkc30uoe60m0cp
Thể loại:Danh từ tiếng Aka-Kede
14
397345
2353535
2026-05-15T07:28:19Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2353535
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ tiếng Aka-Kede
14
397346
2353536
2026-05-15T07:28:51Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2353536
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Tiếng Aka-Kede
14
397347
2353537
2026-05-15T07:29:44Z
Hiyuune
50834
Trang mới: “{{auto cat|Ấn Độ|extinct=1|entryname=Aka-Kede|setwiki=-}}”
2353537
wikitext
text/x-wiki
{{auto cat|Ấn Độ|extinct=1|entryname=Aka-Kede|setwiki=-}}
t9ndd2i9p15w17knk83ri36m5j7koet
Bản mẫu:ny-personal pronouns
10
397348
2353538
2026-05-15T07:32:03Z
Hiyuune
50834
Trang mới: “{{inflection-table-top|tall=yes|title=Đại từ nhân xưng tiếng Chichewa|palette=blue|class=very-narrow}} ! class="outer" | ! class="outer" | số ít ! class="outer" | số nhiều<br/>hoặc trang trọng |- ! ngôi thứ nhất | {{l-self|ny|ine}} | {{l-self|ny|ife}} |- ! ngôi thứ hai | {{l-self|ny|iwe}} | {{l-self|ny|inu}} |- ! ngôi thứ ba | {{l-self|ny|iye}} | {{l-self|ny|iwo}} {{inflection-table-bottom}}<noinclude>{{tcat}}</noinclude>”
2353538
wikitext
text/x-wiki
{{inflection-table-top|tall=yes|title=Đại từ nhân xưng tiếng Chichewa|palette=blue|class=very-narrow}}
! class="outer" |
! class="outer" | số ít
! class="outer" | số nhiều<br/>hoặc trang trọng
|-
! ngôi thứ nhất
| {{l-self|ny|ine}}
| {{l-self|ny|ife}}
|-
! ngôi thứ hai
| {{l-self|ny|iwe}}
| {{l-self|ny|inu}}
|-
! ngôi thứ ba
| {{l-self|ny|iye}}
| {{l-self|ny|iwo}}
{{inflection-table-bottom}}<noinclude>{{tcat}}</noinclude>
5rk6unoxo65851n4wfyju90nvtr4ffn
regnerischsten
0
397349
2353544
2026-05-15T07:37:03Z
Hiyuune
50834
+ de
2353544
wikitext
text/x-wiki
=={{langname|de}}==
==={{section|pron}}===
* {{audio|de|De-regnerischsten.ogg|a=Berlin}}
==={{section|adj}}===
{{head|de|Tính từ so sánh nhất}}
# {{superlative of|de|regnerisch}}
==={{section|adj}}===
{{head|de|Biến thể hình thái tính từ so sánh nhất}}
# {{de-adj form of|regnerisch}}
cvosgkazsb9jgarldzn58io7auksxnj
otuz bir
0
397350
2353546
2026-05-15T08:29:24Z
Hiyuune
50834
Trang mới: “{{also|otuzbir}} =={{langname|az}}== {{number box|az|31}} ==={{section|pron}}=== * {{IPA4|az|[oˌtuz ˈbiɾ]}} * {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-otuz bir.wav}} ==={{section|num}}=== {{head|az|Số từ}} # {{cln|az|Số đếm}} [[ba mươi|Ba mươi]] [[mốt]].”
2353546
wikitext
text/x-wiki
{{also|otuzbir}}
=={{langname|az}}==
{{number box|az|31}}
==={{section|pron}}===
* {{IPA4|az|[oˌtuz ˈbiɾ]}}
* {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-otuz bir.wav}}
==={{section|num}}===
{{head|az|Số từ}}
# {{cln|az|Số đếm}} [[ba mươi|Ba mươi]] [[mốt]].
jvripc7bnx239c540ajvzhsku4jk3u4
謂う
0
397351
2353550
2026-05-15T09:51:50Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|い|yomi=kun}} {{ja-see|言う}} ==={{ĐM|ref}}=== * {{R:Kanjipedia Kotoba|0000184800|<sup>▲</sup>謂う}}”
2353550
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|い|yomi=kun}}
{{ja-see|言う}}
==={{ĐM|ref}}===
* {{R:Kanjipedia Kotoba|0000184800|<sup>▲</sup>謂う}}
ofz0axppmyhkg33frwmn92fmlbuh9r2
云う
0
397352
2353551
2026-05-15T09:53:34Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|い|sort=いう|yomi=kun}} {{ja-see|言う}} ==={{ĐM|ref}}=== * {{R:Kanjipedia Kotoba|0000364800|<sup>▲</sup>云う}}”
2353551
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|い|sort=いう|yomi=kun}}
{{ja-see|言う}}
==={{ĐM|ref}}===
* {{R:Kanjipedia Kotoba|0000364800|<sup>▲</sup>云う}}
kehqayvulkcb2xu8ckcpcg538fp8br8
曰う
0
397353
2353552
2026-05-15T09:53:57Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|い|yomi=k}} {{ja-see|言う}} ==={{ĐM|ref}}=== * {{R:Kanjipedia Kotoba|0000423800|<sup>▲</sup>曰う}}”
2353552
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|い|yomi=k}}
{{ja-see|言う}}
==={{ĐM|ref}}===
* {{R:Kanjipedia Kotoba|0000423800|<sup>▲</sup>曰う}}
04uv65i9kxi7mznuowxtgeqepdomglx
Thể loại:Từ đánh vần với 曰 là い tiếng Nhật
14
397354
2353553
2026-05-15T09:54:11Z
WhoAlone
40420
Trang mới: “{{auto cat|k}}”
2353553
wikitext
text/x-wiki
{{auto cat|k}}
nh04xahpn83v73hy3e8gd7rf8lq5xcp
Thể loại:Từ đánh vần với kanji là い tiếng Nhật
14
397355
2353554
2026-05-15T09:54:39Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353554
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 曰 tiếng Nhật
14
397356
2353556
2026-05-15T09:55:07Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353556
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 曰 theo ngôn ngữ
14
397357
2353557
2026-05-15T09:57:58Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2353557
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
道う
0
397358
2353558
2026-05-15T09:58:29Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|い|y=k}} {{ja-see|言う}} ==={{ĐM|ref}}=== * {{R:Kanjipedia Kotoba|0005274600|<sup>△</sup>道う}}”
2353558
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|い|y=k}}
{{ja-see|言う}}
==={{ĐM|ref}}===
* {{R:Kanjipedia Kotoba|0005274600|<sup>△</sup>道う}}
gnmr9c7rumehi02hwuctu29udsvf567