Skip to content

Commit 62486af

Browse files
authored
test: add snapshot test for all locales' character sets (#3276)
1 parent 1982431 commit 62486af

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`locale-data > should only have known characters 1`] = `
4+
{
5+
"af_ZA": " #+-ABCDEFGHIJKLMNOPRSTUVWYZabcdefghijklmnopqrstuvwxyz",
6+
"ar": " #()-.T،ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوىيًٍَُِّْٱ",
7+
"az": " #()+,-.ABCDEFGHJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzÇÖÜçöüğİıŞşƏəабвгдеийклмнопрстуфцчьюя’",
8+
"base": " ()+,-./:;ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz",
9+
"cs_CZ": " #()+-.ABCDEFGHIJKLMNOPRSTUVWXZabcdefghijklmnopqrstuvwxyzÁÍÚáéíóöúüýČčĎďěňŘřŠšťůűŽž",
10+
"da": " !"#()+,-./ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyzÅÆØãåæçéíø",
11+
"de": " #&'()+,-.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜßàãäéíöúü",
12+
"de_AT": " #&()+,-.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜßãäéíöúü",
13+
"de_CH": " #&+,-./ABCDEFGHIJKLMNOPRSTUVWYZabcdefghijklmnopqrstuvwxyzÖäçèéôöü",
14+
"dv": " #&+-.ހށނރބޅކއވމފދތލގޏސޑޒޓޔޕޖޗޘޙޚޛޝޞޟޠޡޢޣޤަާިީުޫެޭޮޯް",
15+
"el": " #&()+,-./ABCDEFGHILMNOPRSTUVWXYabcdefghiklmnopqrstuvwxyΆΈΌΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωϊόύώ",
16+
"en": " !"#$&'()*+,-./:<=?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyzÉØáãäåçèéëíïñóöøùüýăđēńőřşŠšţūŻŽž’…",
17+
"en_AU": " #'()+-ABCDEFGHIJKLMNOPQRSTVWXYZabcdefghijklmnopqrstuvwxyz",
18+
"en_AU_ocker": " #()+-ABCDEFGHIJKLMNOPQRSTVWXYZabcdefghijklmnopqrstuvwxyz",
19+
"en_BORK": "-BINTUabcdefghijklmnopqrstuvxyz",
20+
"en_CA": " !#()+-.?ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyÎâèéô–’",
21+
"en_GB": " #'+-.?ABCDEFGHIJKLMNOPQRSTUVWYabcdefghiklmnopqrstuvwxyz",
22+
"en_GH": " #+-.?ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnoprstuvwxyzɔε",
23+
"en_HK": " #'+-.ABCDEFGHIJKLMNOPRSTUVWXYZabcdeghiklmnoprstuvwxyz",
24+
"en_IE": " #()*+-ACDEFGHKLMNOPRSTVWXYabcdefghiklmnoprstuvwxy",
25+
"en_IN": " #'()+,-.ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyz",
26+
"en_NG": " #+-ABCDEFGHIJKLMNOPRSTUVWYZabcdefghijklmnopqrstuvwxyz",
27+
"en_US": " -ABCDEFGHJKLMNOPRSTUVWabcdefghiklmnoprstuvwy",
28+
"en_ZA": " #'()+-ABCDEFGHIJKLMNOPRSTVWXYZabcdefghijklmnopqrstuvwxyz",
29+
"eo": " !#(),-.ABCDEFGHIJKLMNOPRSTUVWZabcdefghijklmnoprstuvwxyzäéëöüĈĉĜĝĤĥĴĵŜŝŭ",
30+
"es": " #+,-./ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyzÁÓáéíñóúüý",
31+
"es_MX": " #+,-./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÁÑÓáéíñóúü",
32+
"fa": " #+,-./،ءآئابتثجحخدذرزسشصضطظعغفقلمنهوئًَِپچژکگی‌",
33+
"fi": " #-ABCEHIJKLMNOPRSTUVabefghijklmnoprstuvyä",
34+
"fr": " #%'()+,-./:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÆÇÈÉÎÑØàáâãäåçèéêëíîïñóôøùúûüāđğıłńœŽ’“”",
35+
"fr_BE": " #'+-/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÈÉàâçèéêëîïôû",
36+
"fr_CA": " #()+,-?ABCEGHJKLMNOPQRSTUVXYabcdehiklmnopqrstuvwÉÎé",
37+
"fr_CH": " #'+-.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÉÎàáâãäçèéêëîïôöûüÿšſ’",
38+
"fr_LU": " #+-ACDEGLMRVWabcdefghiklmnoprstuvxz",
39+
"fr_SN": " #'-.ABCDEFGHIJKLMNOPQRSTVWYZabcdefghijklmnopqrstuvwxyzÉèéëïÿ",
40+
"he": " "#%&'()+,-./ABCDEFGHIJKLMNOPRSTUVWXYZ_abcefgilmnoprstuvyְִַָֹּאבגדהוזחטיךכלםמןנסעףפץצקרשת׳״",
41+
"hr": " #()+,-.ABCDEFGHIJKLMNOPRSTUVWYZabcdefghijklmnopqrstuvwyzäöĆćČčĐ𩹮ž",
42+
"hu": " #%&()+,-./:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÁÉÍÓÖÚáãäåçèéíóöúüŐőű–’",
43+
"hy": " #'()+-./ԱԲԳԴԵԶԷԹԻԼԽԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՓՔՕՖաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆև․",
44+
"id_ID": " #()+,-.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyz",
45+
"it": " #&'()+,-./ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyz°àèéìòù",
46+
"ja": " #+-々〜あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろわをんアィイウェエオカガキギクグケコゴサザシジスズセゼソタダチッツテデトドナニネノハバパヒビピフブプヘベペホボポマミムメモャヤュヨラリルレロワン・ー一丁七丈三上下不世並中主丼乃久之乗乙九也乱乳乾事二井亜交京亭亮人仁介仏仕付代以仰伊伐休会伝似佐体何作佳依価保信修俵俸倒値健傑備僚儀優先光児入全八公六共兵具典写冬冷凛凜凝出分切刊列初判利制刷則前剛剤副割劇力功加助勇勉動勝勲化北匠区匿十千半協南博印原及友双反取受口可台右号合吉同名向君否味命和咲哀品哉員哲哺唄問啓喜噌器回因困囲図固国地型城基埼堀報塾境墓墟墨壁壊壌壮夏外夢大天太夫央失奇奈奉奔奨女奴好妃妥妻始姓委娘婚媒媛嫌子字孝学宅守安官定宜宝実室宮家富察審寮寺対封専尉尋小尚屈屋山岐岡岩島崇崎川巡左差巻市希帝帯帳幣平年幸広床序底店府度庫康廃廉延建式弔弘弥弱張当形彦彩彼待律復徳徹心忍忘応怒怖思急性恥恨息恵悔悠悦悪悲情惑愛慮慶憂憶懇成戦戸所扇手承抑投拒拓拘括持指捕掛採接推提揺携摘撃操擬放敏救教敬数敵文斎斗料斬断新方施旅既日旧早昇明星春昭普智暇暗暴曲書月有服望朝木未本杏材村来東松板枕林果枢架柄柱査栃栄栞株核根格桃案桑桜梨棄棒森椅検楓業構模樹橋機欠次欧歌正武歩歯死殊残段殺殻母毎比毛氏気水汚江沖沙没油治況法波泥泰泳洋洗活浅浩浮海浸消液涼淳清済減渡渦測港湊湖湾満源溶滋滝漂漠漬潔潜潟潮濃濯瀬火点無焦然照煩熊燃燥版牙牛物牲特犠犬犯状狂独猿獣玉玲理琴瑛瓶生産用田由甲男町番異疎疾病白百的皇盆盛盤目盲直県真着瞬瞳知石破碁磨礎社祉祐神禅禍福秀秋秘移程税稔穂積空窒窓立竜競筒箸節簿米粧糖糸系紀約紋純紛素紬累紺終結統絵絹継緊総締縄縛縮繁織缶置羊美群義羽翔翼老者耐聡聴育胃背脱腸自臭舞船艇良色花芳芸芽英茂茜茨莉菊菜華萌落葉葬葵蒼蓮薬藤虚虫蛇血行術街衣裁装裏裕製襲西見視親観解設評詞試詰話誇誉誓誘語誠誤説談請諸謙謡譜警議譲豊象豪貞貨貫貴買費賀資賓賛賢赤走起超路踏車軒軸較輔輝輪輸辛辞辰農辺込近返迫迷退送逆通連逮週進遇運道達違遣遥遮遺避邦郎部郭都配酷酸里重野量金鈍鈴鉱銀鋭錠錯鍋鎮長門閉開間阜阪防限院陳陸険陽隆隔雄雅雇雑難雰零電霊青靖静非面韓音頂頃順頑領頭題額風颯食飽館首香馬駄駆駿騎験騰高髪魅魔鮮鳥鳴鶴鹿麻黒黙齢龍",
47+
"ka_GE": " #()+-.აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰ’",
48+
"ko": " #+,-.·가간갈감강같개거건검겁게겨격견결겸경계고곡골공과곽관광굉교구국군굴굵권귀규그극금급긋기길김깊까깨꾸끄끊끔끗끼나난날남내냉넓년노놀농뇌눈느는늘늙능니닉다단닫달담답당대댑더도독돈동되된될두드든듭때또똑뚤뛰라란람랑략량러럽레려력련렬로록롭뢰료루룩룹류률륭르른를름릉리린림마막만많맛매맹먹먼멍메며면멸명모목몬몹무문물미민밀바박반받발밝방배백버벌범법벳벽변별보복봄봉부북분불붐붙브비빈빠빨쁘쁜사산살상새색생서석선설성세센셰소속손솔솜송쇠수숙순술쉬스슬습승시식신실심싼쌍써씬아악안알애앨야약얀양어억언엄업없에엘여역연열염영예오옥온올옹와완왕외요욕용우욱운울움웅워원월위윙유육윤율으은을음읍응의이익인일임입있자작잔잠잡장재저적전절젊점정제젠조족존종좋좌죄주죽준중즈즐증지직진집짧찍차착찬참창채처천철청체초최추출충취치친침카코쾌쿨큰타탁탄탈탐태터토통트특파판팽편평포표푸품풍프픈피필하학한할함합항해행향허헌험혁현형혜호혹혼홍화확환활황회효후훈훌흔흥희히힌",
49+
"lv": " #()+,-.ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnopqrstuvxyzĀāČčĒēĢģĪīĶķĻļņŠšŪūŽžайкнопрсуы",
50+
"mk": " #()+,-.IcejЃЅЈЉЊЌЏАБВГДЕЖЗИКЛМНОПРСТУФХЦЧШабвгдежзиклмнопрстуфхцчшѓјљњќџ’",
51+
"nb_NO": " #+,-.ABCDEFGHIJKLMNOPRSTUVWXYZabcdefghijklmnopqrstuvwxyzØåæéø",
52+
"ne": " #+-ABCDGHIJKLMNPRSTabcdefghijklmnoprstuvwxy",
53+
"nl": " !#%&'()+,-.;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz–Ãâãéêëïöúû",
54+
"nl_BE": " #'+-./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzéë",
55+
"pl": " !"#'()+,-./ABCDEFGHIJKLMNOPQRSTUVWYZ[]abcdefghijklmnopqrstuvwxyzäçéóöüąĆćꣳńŚśźŻż–…",
56+
"pt_BR": " #&()+,-.:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÁÍÓàáâãçéêíóôõú",
57+
"pt_PT": " #()+-./ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyzªºÁÂÉÍàáâãçéêíóôõú",
58+
"ro": " #+,-.ABCDEFGHIJKLMNOPRSTUVXZabcdefghijklmnoprstuvxyzÎâăȘșȚț",
59+
"ro_MD": " #+,-./ABCDEFGHIJKLMNOPRSTUVXZabcdefghijklmnoprstuvxyzâîăȘșț",
60+
"ru": " !#'()+,-.AOАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё—",
61+
"sk": " "#()+-./ABCDEFGHIJKLMNOPRSTUVWXZabcdefghijklmnopqrstuvwxyzÍÚáäéíóôöúýČčĎď켾ňŕřŠšťŽž",
62+
"sr_RS_latin": " #()+.ABCDEFGHIJKLMNOPRSTUVWZabcdefghijklmnopqrstuvwyzĆćČčĐ𩹮ž",
63+
"sv": " #+,-.ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyzÄÅÖãäåçéíö",
64+
"th": " !#+-.;กขคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลวศษสหฬอฮฯะัาำิีึืุูเแโใไ็่้๊๋์",
65+
"tr": " #%&'()+,-.ABCDEFGHIJKLMNOPRSTUVWYZabcdefghijklmnopqrstuvwxyzÂÇÖÜâçéîöûüğİıŞş",
66+
"uk": " #()+,-.ЄІАБВГДЕЖЗЙКЛМНОПРСТУФХЦЧШЩЮЯабвгдежзийклмнопрстуфхцчшщьюяєіїґ’",
67+
"ur": " #&+-.ABCDGIJKPSTabcdefghijklmnoprstuvwyzؑءئابتثجحخدرزسشصطظعغفقلمنهوَُْٰٓٗٹپچڈڑژکگںھہیے‎",
68+
"uz_UZ_latin": " #',-.ABCDEFGHIJKLMNOPQRSTUVWXYZ\`abcdefghijklmnopqrstuvwxyz‘’",
69+
"vi": " #+-.ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyzÁÂÚÝàáâãèéêìíòóôõùúýăĐđĩũơưạẢảẤấầẨẩẫậắằẵặẽếềểễệỉịọỏốồổỗộớờởợụủứừửữựỳỷỹ",
70+
"yo_NG": "ABDEFGIJKLMNOPRSTWYabdefghijklmnoprstuwy",
71+
"zh_CN": " #()+-./ABCDEGHIJKLMOPQRSTUXYZabcdefghiklmnopqrstuvwxyz·【】一丁七万三上下不与丑专世丘丙业丛东丝严个中丰串丹为主丽举久么义之乌乎乐乔乘乙乜九也习乡书买乳乾了事二于亏云互亓五井亚些亢亥产亨享京亭人什仁仅仆仇仉介仍从仔付仙仝代令以仪们仰仲仵任份仿企伊伍伏休众优会伟传伤伦伯似但位体何佘余佛作佟你佩佳佴佼使侍依侠侨侬侯侵便俄俊俎保俞俟信修倒倘候倡倩倪偏做健偶傅储像僧僪儒儿允元充兆光克党入全八公六兰共关兴兵其具典兹养冀内冉再冒冗写军农冠冯况冶冷冻冼净凌凝几凤凭凯凰出击函刀刁分切刑列刘刚创初利别到制刷前剑剧剪劈力办功加务动助努励劳势勇勒勤勾包化北匠匡区十千半华协卑卓单南博卜卞占卡卢卧卫卯印危却卷卿历厉压厍厚原厦去县及友双反发叔取受叠口古只召可台史叶号司吃合吉同名后吐向吕君吞听吮启吴吸吾呈告员周味呼咀和咎咬咸哀品哈哥哪哭哲唐唱啃商啸喀善喇喜喝喷喻嘉嘻器嚼四回因团园固国图圆土圣在圭地圳场坎坏坐坚坞坡坦埃城培基堂堕堡堪堵塑塔塞境墙墨壕士壬壮声备复夏夔夕外夙多夜大天太夫头夷奇奈奉契奔奕套奚奢奥女奶她好如妄妈妍妫姆始姒姓委姚姜姬威娄娇娜娟婆婷媒嬴子孔字存孙孛孝孟季孤学孩宁宅宇守安宋完宏宓宗官定宛宜宝实客宣宦宫宰家宸容宽宾宿密寇富寒察寸寻导寿封将尉小少尔尘尚尝尤尧就尹尼尽尾局居屈屋屏展属屠山岁岑岗岛岩岳岸峻崇崔嵇川州巡巢工左巧巨巩巫差己已巴巷巾币市布帅师希帕帖帛带席常帽幕干平年幸幽广庄庆序库应底店庚府庞废度座康庹庾廉廊廖延廷建开式弓引弗弘张弥弦弧弭弹强归当彤彩彪彬彭影很律徐徒得御徭微德徽心必忆忍志忙忠快念忻怀态思怡性总恒恩恭恽悉悟悦悬悲情惟惠想愈意愚感慈慎慕慢慧懒懿戈戊戎戏成我战戚戢戴户房所扈手才打扔托扬扭扶承技抄把抓投抗折抚抛报披抬抱抽抿拆拉拍拎拔拖招拜拟拣拧拨拱拼拿持按挑挖挡挥挪振捉捏捡捣捧据捶捷捺掀掌掐排掘接控推掷揍提插握揭揽搀搁搂搔搜搡携摄摇摊摔摘摩摸撑撒撕撞撬播擅操擎擒擦攥支收改放政敏敖教敛敢敦敬数敲整文斋斌斐斗料斛断斯新方於施旁旅族旗无日旦旧旭时旷昂昆昊昌明易昔昕昝星春是显晁晋晏晓晚晟晨普景晴晶智暖暗暨暴暹曲更曹曼曾最月有朋服朗望期木未末本术朱朴机杂权杉李材村杜杞束条来杨杭杰松板极析林枚果枝枪枫柏柔柠查柯柳柴标栈栋树栗校根格栾桂桃桌桐桑桓桥梁梅梓梗梦梭械检棉棕森椅植楚楠楷楼概榕樊樟模橘橙橡檀次欣欧款歌止正此步武歧殇殳段殷毅毋母毓比毕毛氏民气氖氙氟氡氢氦氧氩氪氮氯水永求汉汐汗汝汞江池汤汪汲汽沃沈沐沙没沫河油治泉法泡波泣泥注泪泰泷泽洁洋洛津洪洲活流浅济浑浙浦浩浪浮海涂涛液涵淋淡淦深淳混淼清渊渐渠温港游湖湛湾源溜溥溪溴溺滑滕滚满漆演漫潇潘潜潭潮澄澳澹濮濯瀚火灯灰灵炎炫炬点烈烟烧烨热焉焦焱然煊煜照熊熙熟熠燃燕爬爱爵父爷片版牌牙牛牟牢牧物牵特犁犬状犹狂狄狐狗独狮狸猎猛猫献獒獚玄玉王玛玥玩玫环现玲玳玻珀珈珊珍珠班球理琦琪琴瑁瑚瑜瑞瑰瑶瑾璩瓜瓦瓮瓷甄甘甜生用甫田由甲申电男画畅界畔留略疆疏痣癸登白百皂的皇皋皓皮盈益盍监盒盖盘盛目直相省真眭眼睢督睦睫睿瞿知矩矫短石矶矿码砂破砷砹硅硒硕硫硬硼碌碎碘碧碲碳磊磨磷示礼祁祈祖祝神祢祥票祭祺禄福禚禹离禽禾秀秋种科秒秘秦称移程稍税稻稽穆穰空穿突窦立竞章童竭端竹竺笃笑笔符笪第等答简箕算管箱籍米类粉粗粘粟精糜系素索紫累綦繁红约级纪纲纳纵纽线练组细终绍经绒绕给络绝统绪续绳维绿缑编缩缪网罕罗羊美羽羿翁翊翟翠翦翰耀老考者耳耶耿聂聊联聪肃肇肉肖肠股肥肯育背胡胤胥胭胶能脂脆脑脱腓腾臧自至致舍舒舜舞航般舰良色艳艺艾节芒芝芬芮芯花芳芽苌苍苏苑苗苟苡若苦英苹茂范茅茆茗茶茹荀荆草荣荤荷莎莘莫莱获莽菅菊菱菲萄萍营萧萨萱葛葡董蒂蒉蒋蒙蒯蒲蒿蓄蓝蓟蓬蔚蔡蔺薄薛薯藏藤藩虎虚虞虢虹蚁蛮蝴蝶融蠕血衅行街衡衣表衫衬衷袁袖袭裂装裔裘裤裴褐褒褚西要覃覆见视觉解触言訾詹謇警计认让议记许设识试诗诚话该语说诸诺课调谈谌谏谢谣谬谭谯谷豆象豪豹貊贝贡责货质贯贰贲贵贷贸费贺贼贾资赏赖赛赠赤赧赫走赵起超越足跑跨路跳蹇蹉身车轨轩转轮软轻载轿较辅辉辑输辕辛辜辟辰边辽达过迈运还进远连迟迦迪迮迷迹退送适逄选逊逐途通速造逢逮逯遇道邓邗邛邝邢那邬邮邰邱邴邵邶邸邹郁郎郏郑郗郜郝郦部郭郯郸都鄂鄞鄢酆酋配酒酪酷释里重野量金鑫钆钇针钊钋钌钍钐钒钔钕钙钚钛钞钟钠钡钢钦钨钪钫钬钭钮钯钰钱钴钷钼钽钾铀铁铂铃铅铈铊铋铌铍铎铑铒铕铜铝铟铥铪铬铯铱银铷铹铼铽链锁锂锆锇锋锌锎锐锑锔锕锗锘错锝锡锦锫键锰锶锺锿镁镄镅镆镇镉镍镎镓镜镝镤镥镧镨镭镱长门闪闫闭问闳间闵闻闽闾阎阙阚阮防阳阴阵阿陀际陆陈限陕险陶隆隋随隐隗隽难雀雄雅集雍雨雪雯零雷雾需霍霖霜霞青靖静靛非面革靳鞋鞠韦韩韬音韶页项须顾顿领频颖题颜风飘飞食饶首香馥馨马驰驱驶驹驾骆骑骞骨高魂魏鱼鲁鲍鲜鲟鲤鲫鲶鳙鸡鸿鹏鹤鹭鹰鹿麦麴麻黄黎黑默鼠齐齿龙龚鿏鿔鿫鿬鿭𫓧𫟷𫟼𬬭𬬻𬭊𬭛𬭳𬭶!(),",
72+
"zh_TW": " #+-一丁三中乳二五任何侯俊修偉健傅傑六凱劉化北南博台史君吳呂哲唐嘉嘯嚴四園城基堂堯夏天姚姜子孔孟孫宇宋宜家宸尹屏展峻崔市廖建弘張強彤彬彭彰徐志思愚懿戴投振擎文新方於日旭昊明昕星晉晟晨智曉曹曾月期朱李杜杰東松林果柏栗桃梁梓棕楊楷榮樂橙檸正武段毛江汪沈洋洪浩涵淡淵淺淼湖源潔潘澎澤濤瀚瀟灣灰炎炫焱然煊煜熊熙熠燁王琪瑜瑞瑾田白皓盧省睿石磊祥祺福秦程立竹笑範粉紅紫紹綠縣羅義翊耀聰胡胤致臺航色花苑苗荷莫華萬葉董蒼蓮蔡蔣蕭薄薛藍蘇蘭號街袁褐西覃許語誠謝譚豪賀賈賴超越趙路軒輝連週遠邱邵郝郭鄒鄧鄭金鈺銀錢錦鐘鑫門閻陳陶陸隆雄雨雪雲雷霖青靖靛韋韓顧風飛餘馬馮馳駒騫高魏鴻鵬鶴鷺黃黎黑默齊龍龔",
73+
"zu_ZA": " #+-ABCDEFGHIJKLMNPRSTUVWYZabcdefghijklmnopqrstuvwyz",
74+
}
75+
`;

test/locale-data.spec.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,67 @@ function checkLocaleData(data: unknown) {
1616
}
1717
}
1818

19+
/**
20+
* A set of locale data paths that should be ignored when checking for characters.
21+
* Because these usually contain data using Latin characters that are otherwise not relevant to the locale.
22+
*/
23+
const ignoredCharacterData = new Set([
24+
'.airline.airline[].iataCode',
25+
'.airline.airplane[].iataTypeCode',
26+
'.airline.airport[].iataCode',
27+
'.finance.currency',
28+
'.finance.credit_card',
29+
'.hacker.abbreviation',
30+
'.internet.domain_suffix',
31+
'.internet.emoji',
32+
'.internet.example_email',
33+
'.internet.free_email',
34+
'.location.country_code',
35+
'.metadata',
36+
'.science.chemical_element[].symbol',
37+
'.science.unit[].symbol',
38+
'.system.directory_path',
39+
'.system.mime_type',
40+
]);
41+
42+
function uniqueCharacters(data: string | string[]): string[] {
43+
return [...new Set(data)];
44+
}
45+
46+
function allCharacters(data: unknown, path: string = ''): string[] {
47+
if (ignoredCharacterData.has(path)) {
48+
return [];
49+
} else if (Array.isArray(data)) {
50+
return uniqueCharacters(data.flatMap((e) => allCharacters(e, `${path}[]`)));
51+
} else if (typeof data === 'object' && data != null) {
52+
return uniqueCharacters(
53+
Object.entries(data).flatMap(([key, entry]) =>
54+
allCharacters(entry, `${path}.${key}`)
55+
)
56+
);
57+
} else if (typeof data === 'string') {
58+
return uniqueCharacters(
59+
data
60+
.replaceAll(/{{(?:[^{]|{(?!{))*?}}/g, '') // remove placeholders
61+
.replaceAll(/\d+/g, '') // remove numbers
62+
);
63+
}
64+
65+
return [];
66+
}
67+
1968
describe('locale-data', () => {
2069
checkLocaleData(allLocales);
70+
71+
// This test exists to keep track of the characters used in each locale.
72+
// It doesn't matter if new characters are added as long as they belong to that language.
73+
it('should only have known characters', () => {
74+
const characterSets = Object.fromEntries(
75+
Object.entries(allLocales).map(([locale, data]) => [
76+
locale,
77+
allCharacters(data).sort().join(''),
78+
])
79+
);
80+
expect(characterSets).toMatchSnapshot();
81+
});
2182
});

0 commit comments

Comments
 (0)