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|}}} |&#32;because: {{{1}}} |, nhưng {{red|không giải thích lý do tại sao}} }} |2={{#if:{{{1|}}} |&#32;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|}}} |&#32;với lý do: {{{1}}} |, nhưng {{red|không giải thích lý do tại sao}} }} |2={{#if:{{{1|}}} |&#32;Đố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&nbsp;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>&#32;<!-- -->{{#if: {{{2|}}} | <i>{{{2}}}</i>&#32;}}<!-- -->{{#ifeq:{{{criterion}}}| NA | | <b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b> }}<!-- -->{{#if: {{{rationale|}}} | &#32;<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>&#32;{{#if:{{{2|}}}|<i>{{{2}}}</i>.&#32;}}{{#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|}}}|&#32;<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>&#32;<!-- -->{{#if: {{{2|}}} | <i>{{{2}}}</i>&#32;}}<!-- -->{{#ifeq:{{{criterion}}}| NA | | <b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b> }}<!-- -->{{#if: {{{rationale|}}} | &#32;<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>&#32;{{#if:{{{2|}}}|<i>{{{2}}}</i>.&#32;}}{{#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|}}}|&#32;<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>&#32;<!-- -->{{#if: {{{2|}}} | <i>{{{2}}}</i>&#32;}}<!-- -->{{#ifeq:{{{criterion}}}| NA | | <b>Xem [[Wiktionary:Quy định xóa trang#{{uc:{{{criterion}}}}}|XN {{uc:{{{criterion}}}}}]].</b> }}<!-- -->{{#if: {{{rationale|}}} | &#32;<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>&#32;{{#if:{{{2|}}}|<i>{{{2}}}</i>.&#32;}}{{#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|}}}|&#32;<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=&#32;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=&#32;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=&#32;vì là một trang thử nghiệm{{#if:{{{reason|}}}|&nbsp;({{{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=&#32;vì là một trang thử nghiệm{{#if:{{{reason|}}}|&nbsp;({{{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=&#32;{{{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=&#32;{{{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=&#32;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=&#32;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=&#32;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=&#32;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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; để 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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; để 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=&#32;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>{&#123;Db-c7&#124;rationale= &#125;}</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=&#32;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>{&#123;Db-c7&#124;rationale= &#125;}</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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32; 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=&#32; 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 &lt;username&gt;. 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à &lt;username&gt;. 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à &lt;username&gt;. 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à &lt;username&gt;. 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à &lt;username&gt;. 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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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&nbsp;{{{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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; 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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; 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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; 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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; 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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; 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|}}}}}}}}}}}}|&#32; vì </b>{{{rationale|{{{wording|{{{reason|{{{1}}}}}}}}}}}}<b>|&#32; 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=&#32;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=&#32;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>{&#123;Db-tv1&#124;rationale= &#125;}</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=&#32;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>{&#123;Db-tv1&#124;rationale= &#125;}</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=&#32;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>{&#123;Db-tv1&#124;rationale= &#125;}</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=&#32;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>{&#123;Db-tv1&#124;rationale= &#125;}</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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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=&#32;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