From 3ad2c4d3be2177ace018a2484d5e7c838f2a2fc6 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 03:17:10 +0100 Subject: [PATCH 01/10] =?UTF-8?q?=F0=9F=90=9B=20add=20icu-only=20surrogate?= =?UTF-8?q?=20files=20for=20proper=20nls=20resolvement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Codebelt.Extensions.Globalization.csproj | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj b/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj index 34ff398..fd05394 100644 --- a/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj +++ b/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj @@ -1223,6 +1223,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 875144ff7d35cd0c3fbb5a0a845999c401c95316 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 03:18:23 +0100 Subject: [PATCH 02/10] =?UTF-8?q?=F0=9F=8D=B1=20icu-only=20surrogate=20fil?= =?UTF-8?q?es=20for=20robust=20globalization=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Surrogates/bgc-in.bin | Bin 0 -> 628 bytes .../Surrogates/bho-in.bin | Bin 0 -> 631 bytes .../Surrogates/bm-ml.bin | Bin 0 -> 527 bytes .../Surrogates/ccp-bd.bin | Bin 0 -> 691 bytes .../Surrogates/ccp-in.bin | Bin 0 -> 690 bytes .../Surrogates/ceb-ph.bin | Bin 0 -> 517 bytes .../Surrogates/chr-us.bin | Bin 0 -> 614 bytes .../Surrogates/ckb-iq.bin | Bin 0 -> 655 bytes .../Surrogates/ckb-ir.bin | Bin 0 -> 634 bytes .../Surrogates/cv-ru.bin | Bin 0 -> 598 bytes .../Surrogates/doi-in.bin | Bin 0 -> 618 bytes .../Surrogates/en-us-posix.bin | Bin 0 -> 530 bytes .../Surrogates/ha-gh.bin | Bin 0 -> 540 bytes .../Surrogates/ha-ne.bin | Bin 0 -> 539 bytes .../Surrogates/ha-ng.bin | Bin 0 -> 532 bytes .../Surrogates/iu-ca.bin | Bin 0 -> 618 bytes .../Surrogates/jv-id.bin | Bin 0 -> 517 bytes .../Surrogates/kgp-br.bin | Bin 0 -> 547 bytes .../Surrogates/mni-beng-in.bin | Bin 0 -> 703 bytes .../Surrogates/pa-guru-in.bin | Bin 0 -> 644 bytes .../Surrogates/pcm-ng.bin | Bin 0 -> 563 bytes .../Surrogates/qu-bo.bin | Bin 0 -> 548 bytes .../Surrogates/qu-ec.bin | Bin 0 -> 532 bytes .../Surrogates/qu-pe.bin | Bin 0 -> 546 bytes .../Surrogates/quc-gt.bin | Bin 0 -> 549 bytes .../Surrogates/raj-in.bin | Bin 0 -> 620 bytes .../Surrogates/sc-it.bin | Bin 0 -> 544 bytes .../Surrogates/sn-zw.bin | Bin 0 -> 524 bytes .../Surrogates/tg-tj.bin | Bin 0 -> 584 bytes .../Surrogates/tzm-dz.bin | Bin 0 -> 523 bytes .../Surrogates/tzm-ma.bin | Bin 0 -> 586 bytes .../Surrogates/yrl-br.bin | Bin 0 -> 507 bytes .../Surrogates/yrl-co.bin | Bin 0 -> 515 bytes .../Surrogates/yrl-ve.bin | Bin 0 -> 516 bytes .../Surrogates/zgh-ma.bin | Bin 0 -> 596 bytes .../Surrogates/zh-hans-cn.bin | Bin 0 -> 571 bytes .../Surrogates/zh-hans-sg.bin | Bin 0 -> 578 bytes .../Surrogates/zh-hant-hk.bin | Bin 0 -> 584 bytes .../Surrogates/zh-hant-mo.bin | Bin 0 -> 584 bytes .../Surrogates/zh-hant-tw.bin | Bin 0 -> 586 bytes 40 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/bgc-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/bho-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/bm-ml.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ccp-bd.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ccp-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ceb-ph.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/chr-us.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ckb-iq.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ckb-ir.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/cv-ru.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/doi-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/en-us-posix.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ha-gh.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ha-ne.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ha-ng.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/iu-ca.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/jv-id.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/kgp-br.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/mni-beng-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/pa-guru-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/pcm-ng.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/qu-bo.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/qu-ec.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/qu-pe.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/quc-gt.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/raj-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/sc-it.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/sn-zw.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/tg-tj.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/tzm-dz.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/tzm-ma.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/yrl-br.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/yrl-co.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/yrl-ve.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/zgh-ma.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/zh-hans-cn.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/zh-hans-sg.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-hk.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-mo.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-tw.bin diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/bgc-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/bgc-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6acdbd9deedd45f2d7a0db5c49b1adfea2c19cf GIT binary patch literal 628 zcmV-)0*n10iwFP!000003hY(EYTG~%y$A9Sdnr0JE~K~WW+EI4m1?R&>2YmM?4{Bw ztX2Wt5*LG^6nZIzQrgS94Q((Xkdj=|Us>`cWp^ccWhwc9(u=|G&6}C`){H&O;U!66 zkg^1GcY6z=zVAUsCKU6Oxv1|eY!AmkBg|d_ym^tw;GzLx8TW9ZSPydu;Se(;ae9tI ztBU6bO68(3r;({2QKGvA zRaK*Hvx%QlKJ{=>(?+kTVZ-)N+YYBGxoX~#;Td?sElv1j#gO_s++>kETi)(gKxUIO&L3F z$#>oDN)Qf$}a{N!_b! z?YrBNgLOwA+4Me3^F#Z{?l?9b7Re}$U35FU)-G^RAps6FQf~H?9uP`+E$H1YzS?|9 zCba%zYs9p~>ogknL0f6^3u%%-i+x?KL!o$`4F{)EOY za8t~Iv1b*y)N2-ttu-3;YJHE?c-|^#ycD7!~w{{12)Tl$S?SBFUS*<9mNT4u#e$H>qdS$P6QRHpfR(N2Tk-dW;oPE#WsDT3#NbYi0}zvqEA** z_v$+PHr$k5jXV0tqz`$V9-BvY&oXI0i^g$iqua$5xWHb8c-RA^-0T@UqKt}KFt}ZP zF?pX(S^dY>h^f6`>Cpi+&xK+)sMT04v- zGN6_Tlv9pfU`}HU0 z7h)|rOHwysbgIL21Nlt0@wpDAo_$#x5+-i~T8O5>0PpVpIoKcea4)}Bpog{Io}N4a R009600|2f&8zR{S0082={22fM literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ccp-bd.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ccp-bd.bin new file mode 100644 index 0000000000000000000000000000000000000000..5ddbac45b6a117719158741f51cc409aa4c5b0ef GIT binary patch literal 691 zcmV;k0!;lMiwFP!000003hYRYp_D-19R4 zyue2}-Vw+$>H;s|wgpTOi6Q-f(C4>Bf?Tk|G-p06IqE}(B6JUFMVWD1gTJ}u92Z0d zi7W3_ktBXCyM~M*N?Z`faXbMr2!bG(fU+!0aOb9}o9BQr&U&4Z9cPU&8n;g1Zj>M+ z?9PX!j3W3PT6fA`3tM!TQPx$R1+zv=paZd5iQAQ)7_Pys9}%P?hnB+SK_?;-eG6fV zaxsr7xcKzmG)>F0Y`Z*o z5P!$fRD7+eO2&P;Kd#Q-Y%6dshc0UtD4P_eELHBEXqL#)_dAl{Q?EH}XtxRY>wl|9Y@=vvtdoOos`ETm7oY6Ps zZ)h2YZuf5x!3;m3Bi?{xxBRr9r~N$b=g3xuMY=&$`G{E*lp?Y%eYC|XOnkh+)9dUs%7129w>StDgd-CeGs!y%aac+~L@uaZ^I7v`re*E%7nCqtY>#ECY Z;Hs>r=V!kG009600{{nfF^EqO003TvTK)h4 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ccp-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ccp-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..c2be0b7aba605f041cbaaaa083786298bdebff9e GIT binary patch literal 690 zcmV;j0!{rNiwFP!000003hYf*lMA6MmXwiP&+W1GDk>uck7-Sr03@HQKY9x!AmK27z1oT^x7<+hqj z1;0C)s&0&SV$os?RaXw&onuv3s!p|abvez4Ow-ZktG@xdx1`HxG16QrZjQGdb<^`?EH}XElp^y+Z#!L`KMaaz3+Bu`ETm79POL( zH?#~xwfi@SV1^&i5pTe;TYlQl(|(@zQ?r#}k!}!`K4KOHrHE`xA8m086Cdv|%Uxj0 zScrCzFK+u^{7OdGS&n$F=5f>O!5xv)@VP+M$C$E01hSVC>bDIo}XN@($NrKu+AAbsS-PB=Sby*Eu YmG%7m>^A@a0RR630BUOcWls+P0JC*YKmY&$ literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ceb-ph.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ceb-ph.bin new file mode 100644 index 0000000000000000000000000000000000000000..2145fd4e7177626c9140743dc506fd07aaa38257 GIT binary patch literal 517 zcmV+g0{Z*ZqzUkzE|oy_=0j^(*=&cElsyYs?&%dA&!&HG;1}n zE5|O%t>VN}@Cv{y?UNw?By!SaZ;0DyzWIJ;5@(?C6Yp>!}#_~>Z#<7|7Qin;Q_ZbY+fLE|kF-Fg7&=+=-mqnt>Bs8(zF9^z|m`9jtqPt!W9ro_4q$HD_FK&(S1p^fd z?uaS5F<*W0e(aP`xsO^^3ZFP=tpAa$TPPO366lKptA+5U8XaJA2NVF!b15jvrC-)(IA-XP<8}qA9SVJn7NC>77b#~u1l8zm zT*UCTlIAgfIIARv%b}}eOUdEeZ?^^HV<(5)bwaWa;+_kxCqjDo{v*aq-Uv#P)Tz(T zv`pr~zvP;qYDo>~Y3`UXc{O$!Z(E!;eg5Uz;i${K!dfHj*Lr<^_6Gm}|NjF3+=Nt1 H-vs~wW3mB7 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/chr-us.bin b/src/Codebelt.Extensions.Globalization/Surrogates/chr-us.bin new file mode 100644 index 0000000000000000000000000000000000000000..b413c766b29fad1527354eb5855a2440f0b3d10d GIT binary patch literal 614 zcmV-s0-60EiwFP!000003fxppZ__XszE9eJ@Bx$qEd`FbO^Z4qkx&sN#L;cuwHApp zInJcqV5n$2%sz}=CV>z_oe)Ee10N^;i}y>Aoj7y4(jUO>_51jFpXYhgI=~#Bk_?79 z%P{vhHxSwi11QLpVxBV}ZH2nGjZ>frX3qd#JSkJ~(U7o$2e{H`fH}mlhgnS-=$^$N z?`n>Z;*uuy?O~awK_ffDoCBjiN|Ge$p)d?Xlq9{Xswy<|v&=6F#JOfY%IQ?I)-dd~ z&fxBpFsFPL;HrgdzJ^Af*dr4=p5=^pRKr0suv!MaA=W7AzOxh0_jLC;U}ijY4D?WE zB$&lTID^7`kUmoKjgrT$gh$u=PTTkG7sG@!8hrO8l|)p^~TOBag=n_6g>Y ztkhEC!j)6vo2#hgD_7JxYF+23r5z_)y)ok$FbnBe5TBHMt;BD8JXd0I9aMbKI`X@n z`cBCUB@Z0*z}eQR5?_`0WzjE6UMhKHj|(M!UUTJ{3D2(WeFg00G-E A(*OVf literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ckb-iq.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ckb-iq.bin new file mode 100644 index 0000000000000000000000000000000000000000..d0c02a84a0a5e4f891d20c3b388ee68801229215 GIT binary patch literal 655 zcmV;A0&x8wiwFP!000003hY#|Zrd;v+ymqvxOr$CHyyPV5fT)rRHH6Xbflvfo2Wzu z6ctokhQ#n-q?6Zxd?FDX#Vo?y z+1)|tt>;2Q1{Cv{IY_Sd@&dEk7)=FIwCCLF3uF{Vh%kx!>nL+RIS86 zoGOlkdMOQx+ec{_x@K}0a}JC;CW8#5cLBLLc@@+H&y~t|_J=hX}wT<>|_?X4%nZ2s^S~lFvqJA9ey(s?dKV5v+ zUa()*eeCOs(f5v?5=!`n)_xlQu<;%lPzSZzdPXIzy1oMZhq`KDb*e#M=9UVj-W^?F p9tlGzt4|ldb=f3aw`E+FaN+9J?#^ET009600{~P+BzRp1004R-LF@nk literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ckb-ir.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ckb-ir.bin new file mode 100644 index 0000000000000000000000000000000000000000..76d96c8806a3537ffb81f3067cc14fdbac119ea8 GIT binary patch literal 634 zcmV-=0)_n_iwFP!000003fxq|PTMdTz9aDtzDzlc(!p)HO+*ExrK{RW(~d6rDb^AP zISyKGLsMHc^%AH6kGhVCO^!;X0PV-OeDN3Q%NF3Ku=x4x8$0!B5 z(ISTS13k7jjv&z|(m<<8zKXe7Z}atDhio8uXYgyYF7-+F`wY$q<`C5UEagbd zjtYOrS=ZM-P{PR>{2%?b)2I*3dM5T##(*AW9vqPfhaMRap1A0Z&9z~G z)dQLF?G>iOgVhzip^uxYVJNVPb%){%MI)ZC|@Tt z)Qh?&L3h>+z`E+&Hoec{^wfR_wj7)8Wl=v4U3A#(>Mn4*K-##i5tHnY9urDK2uuR1+?n($BAiZ%FysqnwSV9*2{Ze)mZS@$n>pv6d(OT4u!)3sG=M%A z0g?Fd0HK~^Lr5o#NG>qyIT|}5J}{4n_W&Q?Mm}KFry`Vn9toSo8r4-ckuZcyA~I=L zW2Vj~@tbp9g^|OVM`FW7zHjID10p2|hLPua-VySU<2VkA<2ZhpezSHftBcOga1h`y z)Y8|SO|b^4oYUpTy2ZXbuv>wip!T0SDW-^w<_?@ zm3WaZ)lYNjjYa~lD3Rd(V>`2mhT$e%mKwEH>*{i!%#%faUaO5-XXo82nHQ(@rt+I7 zvvgUNRDIU!E?uf^nf$)!lzd9Rt4)5Ms&%r+C6?6|`xF?J^a}oq_-+)8K-50^lSl|) zpPmQ#DW;~Ke_^0;OC`d4~n)eBAqk1lKUudj7>7zZQnWArdH&%-5d zfw;sqNFMDKJEx4wQqXx=+}8OaoiL27j`42nX+K&;M1& literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/doi-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/doi-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..5575881b70347cb845ca1ab919cb806ed36d3b76 GIT binary patch literal 618 zcmV-w0+szAiwFP!000003fxppYt&E_-52^F-bS*pAL=qYX=o8l92`MhzG-f!50jVj z@>0mI9Viw=a3i9Ks~a6uhEk}E8~ax-{U!2V^3r5Fb}jDa-jj3gIX9Uba1GBy3fq}V zx%O9A7<(87kc+Y8I#WI)oD*J9^@{M!pj$iv8FTd<;N{aI0iSIPmFs|)1`W7|Asld3 zlQ&Jz;ZODq$7jPr#`V+NMUn)KfdSVVl=N8~$MG7A*H{>aAuG$WWcz-a`gzW@Hmt{) z92?dx4EI=1xUUjsQtt=6yjHPv0}U1zaCP*7@Uwx2`yMkmaI> z-m@3V2n~x-u7xhN$fVDrOoD-G56cGD$ntRmP`e=YGFk)O%DdsRm!VPZ+>MPcyrZ(> zpnFu-ye>Q}(@~cA>}vAMrr?q5L_D&c#@QpeC#29VVg2gVo;!yR#aQ~xTes@HH7z=; z!N2(GuWFInptp0KL+_63h9XIzO?qTchg<4mt|pd)>sWVJSN;G10RR630HCNjRR#wD E0O+SSp8x;= literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/en-us-posix.bin b/src/Codebelt.Extensions.Globalization/Surrogates/en-us-posix.bin new file mode 100644 index 0000000000000000000000000000000000000000..af5253f84612ede3bf2d4a7fdebf60ee418668ca GIT binary patch literal 530 zcmV+t0`2`DiwFP!000003dB=8j@vL0?HAZPut=aHR-8@A&R9Wd%nKwZk5B4@~%_9Ov+24y*JQ*k(t^WK{wSx^mI-a{!>Pc^>3Luf?`7Hq z5o3%k5Fvyhwm{=Jj_82<9uEW3+E#s&qP0~wD&nyT@sx!~p$`Qe&#<@k| zRX9)GJvNPk6Q>&3j88|+%@vk69 z>*!)_x^Tv{K?;sOc-cG6998n|% z?F!ydO-_n&`UI*jzPuh3S6eOsUI U@BRV+0RR630B7pcQ_uwf0C4&ARsaA1 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ha-gh.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ha-gh.bin new file mode 100644 index 0000000000000000000000000000000000000000..9cfe18595867415496eef873a3c04d495588df2d GIT binary patch literal 540 zcmV+%0^|K3iwFP!000003dB>rZrd;r-UH+vxD*;1)kwE;Ga|^XVJb!ypzwII&N2~+ z3@9>%wxCm=qOZ^{eIY+d!5;~d>}2gk^1l1N`|e04pz(n>m`c@vrq@@5ELnmruLNkR zD9KYByMr1<3F;f-<5yE7B`H^}PN1`B0vdCC0_7S3Few0d2%P!cWujbIRazibPjOG&2$VPVv%DI?Ym}sJ#T?P%d?oMK|Ifj+{^#Q_J z`E^Ea!SK2zP>p`ooly$K zzDsb=8>karaotk#ag1eHfi*rnj89{9D_cH69oGrvrf4Zd(EaFBd>F$kCC$_L$J|6?IPaQ5)|9M1pMLyxeL&X7GRRyc zc>5v_TyQ;5;?vJxV?5`Tpd^Z&{$x;dZytQb*>qTQYCzxS_70tMY zQ2|A!&@RiKqE~3o7kuh3N^O&9cE;G@F#cY6ZmiG&PC&v4%m@$EdVKbmRR3_7nA_%NB#O?txkJGff5rdlD%Ew4GT5Z0mJ-FTi*d(m zsA67n)l%{$T0UZL?Ykstu7;%9@#n9Q&v+>)iDtIKXjD^oj(o@4cwEy|&wiZSJB+S+l<}&<9zMSPv9KTP dv@hRQPrJ50U0(bJ009600|0ppiTKV1003;J3{3z4 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ha-ng.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ha-ng.bin new file mode 100644 index 0000000000000000000000000000000000000000..0f98b189f994a72dcfb982b643ea89e7e8997303 GIT binary patch literal 532 zcmV+v0_*)BiwFP!000003dB>pZrd;v-2>zwxD*;1)kwE;Ga@*tVJb!ypzwHQUCTry zGN8y5+KNv7ijJN8P5F|74+)g)WX(kC9-ed0xfCB*?R$O&DgWjSUXe{svl&36gZNTpjmO}}XqVlI#rfIU!b_-gg z5|mU`RgsD?#@H3<`@Sc4ceHJ3*ICL&irP|MKR%qAh{h633VqC=A3@6{m4&vGz&mDZ z#Zf9fZMk5Jp_4;TTUp3fqgf<0vDF=dat@~LCwl1Sl|zf2yN8r)j$!3~eSq+-{JL!X zx;Ek4C0&-K!eK%f4=5IeG zI};A?OlZEWLx2K;ulvWa$;}VH$+!!bk|a6j<`xCl{2AZVRc_i6RrHc>j8Z7}eTIA9 zLX+{D>yDDoF_vQu*7*2ie2LMm?DzzATqjhRveR4}&846umjW&1J)CRkk&|}U?ggOQ zqtNGQ0eX{n;_~`T`sh)7is4%&%~Skhu96ro`nHq}B`?4Jx)hKPl^k+c3C_NX0~cJ6 zg!JY2pBOKAEhtG+r#>0e+?fYo@iiUQoEp%#xr4*x!%$_sX>d&X^Pek+q0V!KSOe^1 WeZ0K*4*&rF{{sNl>75121polbT?4rQ literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/iu-ca.bin b/src/Codebelt.Extensions.Globalization/Surrogates/iu-ca.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc9673a7d21bb3aed4549ab27583cb63fc6bc53b GIT binary patch literal 618 zcmV-w0+szAiwFP!000003e;3hZ__{!y;tgg*aOH15&|53i)y7p!X_d}h~p-nCM)c9 zwO&{94UqulL&c795J(_#;gCv{ieEJSC1@S5V<&0v+;-;eoA=)M!=e(NG9P+@@ToNS z_Xz3Q7KCifsSJcky0+>aP!G6E#WR2xPa+RY(qkf&7L65ZQ3(S$rea0usGi0jA1RJW z1`&5xw|kN2S*2{BN(q9S#C2V_W!tt*T(=d+aZDzr@0(#rq*SCw0Us;U^#pyZF}69x z4!E3HG+qxOYJ!6LjnMs~H<$!MHbpyjM{5=6mRPBz`n8Q1rlGpefr`RIMN#st#zZK# z=1?EP;%T%AW~ch_wmc;7_2E)O7v&+%8=dZODBy%q3GVh-On+hesTz*+pEyq{2~4J# zzFSKqm$=9jrP9hS)^cf%*%Gt0I_6(7U0|MIp5uJFVWwC^!_Md5m?fCa$}(SI{vGo# zWjQ}@C?_*a{$l<{qf1Ptdd@j!uk?9|*|#;6d?+G*tl2-S<$H~3QrqZE8L!IpOx@R| zVeHCt2%JfF0{?d|C-R3NYCnX7NC@Dg*n$!Bsb{emfg4oXP5X`|9*Z9UrhUH;K_MW;d3!>1zdE zyPEzov>W6H*n!&tzZ{7^03^aac4eq3BK&RJNgluVsEvp4+sZx?8 zwsr#?MFr{!@%3mprew!dt25{6OduKS$!q@|7jY_1X zstBc&lCJAIa(B0GnswXS?r&1mwtKNNHjJc(Y$}C*$)KCEEp}Mgvv`q8PsVL1-Na!I zpHH)ptqzW`wzVG!%30{!N7kJhx-;d_VC&AmB9!@9h!DAtNA&R_#C?c`cF$Ip3NH*a zRx`aQgniOWmQk~bq9G}8D(f~G3hyE4?V=0?<&*6>BoxCodlQ=XCJf)!rqyxS*(Z;$ zp_0psPcn2bxe6~d^>d4YX?DT?>nk@+iE8i@-58}%oVpB8tO1^}n&~zrpNCkEHCXHY z$MI!|9%Rc#sN*`J!j!FM+Gr+4N^&XOhu}R-27djAERQ>&I-$@@v;e)!o4FkA5L5@h zMe->bHry&{&eOjpf<@PqlBeY8-XMoO7IMg4B^bLG&rC4g_pjc5{T|{4t3^tZm76@e z(%hJb7j2C%HKzvrJ#KWEe25InILBCi`}xO}!%e4qg|#B=*ZO#U^%npD|NjF338!G3 H#03BVM;Q7) literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/kgp-br.bin b/src/Codebelt.Extensions.Globalization/Surrogates/kgp-br.bin new file mode 100644 index 0000000000000000000000000000000000000000..42c9c68e408ec59accff1ab7769c7adc0e446c97 GIT binary patch literal 547 zcmV+;0^I!{iwFP!000003d~bIZ`&{s-2>!5aA={Sc3kD7ZMYc`oD?lpBPvjIq^*lg zM4}9eGN7$ve?|6eodaabFG+q$L5id(OGwvFdboG*-n+9IQ3>B!0gF-;RN}(}gytlI zie;S2QeZSEs&+wh;3*Y90B*1A957liQOSrlijAm*1h!PPl9{Sm{@abxV3gE6ZMzqB zo=3)ZNu>nAF-p@kouCv290EiLArsUzO@pqka8cl@Qo^q#&y?_ABHPoQ*c@(d$)~MePh7ECk^!L~$I)C|yEzUDrz}P16)@g?S#9 zB@#ksJucWlXWf!v!@R`b$^lg1rS zf-unN3xYY!;1A$cB;Z?ub5g=`md!#Al-#vD*;8_;rD>`Kja|yZLj?>XdUQ;9SW=NF3>Nv!~>-rS_COGqYLb$Xp*Khj7Ju zJx+Eg79{<@)xmmweM5-Ve=3W7hw>+?d8Z3caAUxk{d^BnAVywIVw&+3LlAWAe~uhY zZvYn!&9t*ips9W_)K}98K!9tWk5&c^*oarDl z&AirznQ6QV4=Le&!o<9^mbx`>X5Q5~J~%JyJ(u3#MYZidyGwyfck8@YWFflV{S7K` zVvz(VfV7i6Vw;pvF-};%-v8|KT{>VP3YMX|XVdg#hP+`e->T`vHXOv(CjXanTV)-&)CPedCWYr$7QB`T4>g%iuKqL zl`C>Jp?vjeJ_PyJ+s9mB9_dAB4H4dZSdT*6H0K=oW=z*Pg0bP1NJ@ zOgtYLmBx(IXd7E*8rPGV1Vfsz%-m9!AbhopTf3Os#g$zw?cxT@v0Iya?)N1-=2Wrh zVP}Ndw(E}NXN0-i&#_z}d_%Z)&=rF~YTJ?;FBh9{I`oQP0S6j(^(hCJ`-H=WAn@h>W zpzzs%Cp7l?kgLoiFX~*#hEyl#{<570eUN6nK^xX|>gD}Rag{5c3Xg=TV47N)Sa;%z zd3c_AS(qF!q1MSN>Pg)Lmpg05uRSr_b$VZ>`BDA-+3M8kUXk?E*duq7-)0ILS|p^Q zK`Ljj#32`4IYIYsdQs0X2)UQyWOMngqy2c*8<|ULTDflCYa-0kW+Ks&9-FHWc5mj);Du{)wsKWbu z2)!W@)U4oC35iimG^1C%2|2tjSzw&?g6R~4>nEqN<=p(T$W?@tX(eG4MEnntv} zw=iN&jfaI#G?q?ihsI`(O8pD=jVqlA?uY?^-hZD4n)+r3<^p0>4~@9+Hq009600{|XX(}5ob008Px B3~c}a literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/qu-bo.bin b/src/Codebelt.Extensions.Globalization/Surrogates/qu-bo.bin new file mode 100644 index 0000000000000000000000000000000000000000..99c39438341ae0975e8b51d271b908bc1cb55372 GIT binary patch literal 548 zcmV+<0^9u`iwFP!000003dB>*j?*v@zOS_J;0yABO}ijYzLiE@DoE%O5aKwgXB(@D zQyhDx+&JenC5_GQ^ zfmt`R)g`njIjFCQ`%k7tMpi-%I)~AsIcTi#0Lqi*wifY^50=A7WhD3AE7P`l7`y?k zQAtKP=lq6nP6L%2!R^h%%km>0!7PIdTnY?x_*9NcHi z2=`&{1NhMS(D+a%EsMHV_$WXlKNAwt8O+FDv_VV@pL{pYK}MF1vzw818+!KCoXNU9 zQsH|Odf!2qumMNP2#m@ni!oSUM;D8j+&5vVFI`C9gN&?W<=_)aFS)rxDYSUR|LLkU zU5zSvaZ95V%I%orR&>zjVkh*#$mWIE5i15{g-`VuWb6W(nCPF&tzSU-IeH#BXyQ@uGP@GJ$Zv8(%*k+*{@ zmr%w^38kw9XKVQ&q|iq~_Vn{tidSMM8KIdQeR8I$GY?<%b$Y5PHQ;~aMu+r8WE7%p mF_xcx{C4GV)bqW literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/qu-ec.bin b/src/Codebelt.Extensions.Globalization/Surrogates/qu-ec.bin new file mode 100644 index 0000000000000000000000000000000000000000..687f76b12b4d6193e030055c218d61e5888bec8d GIT binary patch literal 532 zcmV+v0_*)BiwFP!000003dB=8Zrm^s?G5-2EE1@Qm330GGc2qVAW{}lfWYNQ9BTJ=RNKR*@L2&7lhp88BV+rpaw}v zl9<>nbSN0eABgQY-617=E+>`2Y|so8mNeNU&!kiQI~G2|B!17T4q63Yjnjv37V#7M$0Ax6dE zhmA>;$3dzy2fIAqg?biW6*PzmMpH_t)w@TK*2gJ--GkLcJI(@noa{BFgbTOAlUtws zxwfQ~wA!CrkK6U8sw6&gP{>w#DhLJ!1j*w`(?j(ULe9CYZ6_9Pb=SGw7zD>)8fFnCWM_L%&#$D67ojVj<@ke}BTZQf`l+jna)l#CU=L~D! zLznS}tBI12F;-v$#`)=ed|1GTVd4weqE@NY)ug!6iVuR4Vi0H`XJV_OL)P`|S3p^# zP+K$)t$5cFxN>>D(SH0nu97(6P7ZpE;P)|D&V4m>l)SM$KoQOb6gJ|0eHIT~aCJ&g zpMU+1@sc-!k|ec-7eiY6a`2|B<)GG7kN=Mw942oABj;U*A^iOFj}7~gp7-V33b1SI W-Q~q!00030{{sNC&N`p!1polY3H{8|w>C@#7xrt8_@T0Y)-MCFPgL!;!-V8-$pz$N)xRHv3rsrpbtn&;q=CIT^1W} zL2FcklDe+z1*u7%=lOzIYb|M8$~oU?<5ixohK3$L?ikxSV6>WqCa(GwL3twwj`NU^8c8zIMZd!WIQIT_Qj&#m z6N2}hlDiPzhVVIr(qCs)DSTj{v7QS_9;J+kVxVHe{``uH2BRj6NeR_V*AFsQzBOG) z-hkghO15A^0yef-+t~eD#53z5xosgNpLk5(L3Fsbhsr)ANpi}~6$+-=1O87}h2a&d z(aX9tN}<@<40nt}m$8QFo|4yNtiT4G@xyoVY65R%&nB=(y;5naUNdbplY){$3V&b0 z#Ho$}Iqv5l0;(MfeTo*LBi_XbJaTz)V*JsgSdQTh5VXT+uXMX_z0RR630H6yx=Gp}S0HR+BSO5S3 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/quc-gt.bin b/src/Codebelt.Extensions.Globalization/Surrogates/quc-gt.bin new file mode 100644 index 0000000000000000000000000000000000000000..0cf8b3f11ff8ffe1ec352d9c679cc0289c0d7a87 GIT binary patch literal 549 zcmV+=0^0o_iwFP!000003d~czZrd;r-UH+vhyaC##&+6~TM)rPfl76&0!7A?b+IW+ zq)m~rwRP-M^cnh0d6I$@sZg?7WX#0Vef)mzY{sDQJF9UiWDSa5UJ!Dd#MrP62PGsW zFt6vPdj}Qr0^|?G-8Wq!B}*n76+>!+o>2icJprswf5kA_1@B6!i=Uh1lfo$(5k zLdhv9ilVqCMG+B+>n(|rBuRYTwrxwcw61B>5T%U9XTdi{6T#IshW14> z6f-wggWc@iZnCYAY7}OXBnxkA@iSj%YWl(IA{v?Q1A?@1ddk#1Rv7J;Q>d}Azu%0M zx;uB!o#N!aONWc@JUaYn@89OR#3u#{i!;4LC{KMmkFY{dt9pSlsEt?ub#*lr^By@<>&%HZ|hX(^Gf+ZflZhAL(orW#5t#wp*cGBUe*22c7Y50&qIzX!_t?%|rNJ3cU{>-E|bgSzG6#qU5Wc z0aE{+LTWoM*C+nSI8*)g+4Ha8A)c`frzDzL?ZJ}9xjOJ4sfLRhQyuz$u1^@f^WB71 n75et`&p)>9Ryv-`jpgBPtoN4}e*pjh|NjF3puDZ>JO%&&p_d1v literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/raj-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/raj-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..c749bde844fbd2dbdf6d4417723817ebcbe3a9be GIT binary patch literal 620 zcmV-y0+an8iwFP!000003hY(EYTG~*ya)0Rdnr0JE~K~WW+EI4m1?R&>2Yms?4{Bw ztX2Wt5`)1|dMtrb+RM5PZ7?Q~;$G5US@I=ipR~$Ka`FMCmj%tddGF0gtUN5pYnqTj z$`dTy-5rGbzDF`TVOXTxMSWjm2RJ4y!u$;(?_T9GanXSCOnA7^tcL{&$uZ`o#OXO2 zH5D(9w8}+c&Z4q@kjJrC4IW}42xl%TilRWi@B1j)Ls1k(XzC`3n`KA{Eqal%i5A^2 zFjbAV%_e@z#MHw@O_zF24I8$HU^|?qTy%!^e7{#t1HLn^nx%0&6&F%@OE8Bmx<2ZT z1ab>-LNa(GJ*4DX$!jJ5zI=Uz^iMz`3#C{n09KwpQg7BuF94$`I7rX{QB#gI1ds z?l{{5IwXt=dP4pO)d(uclM&(8ReO+gPT08c$e1QL_UMF)%tcRaE+7-Ev#jrnXEr-b zGumK53ys2jlnE+wK~v_U0GjACWjNMF~G z^NCF#@-#oTuhc!qro$o`rLl`{XTQM(4h$0D0FY|4=j@0wDr!ORcJamLLpovgZ>$kh zd$W?fXRl^dZE3|mtTh`tj|}S5I3~5zQ~0_}sBK@BEkl>K9`Ek_1pom5{{sNtI-V`{ G2LJ#T6ehv| literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/sc-it.bin b/src/Codebelt.Extensions.Globalization/Surrogates/sc-it.bin new file mode 100644 index 0000000000000000000000000000000000000000..e89854fa3a323eb82df5e26037ed8136424348e3 GIT binary patch literal 544 zcmV+*0^j`~iwFP!000003dB>rj?+L8?oYaR*ao=(6CE^YyXdUskXREDBy{CCJ8>55 z-P8V@G>HUQ&yo7 ztpuwyB~#{mm(Zc)pg$mfdgnT%WG1w+Gv#yzgYWvO3M?-126UuOd@syZFuYy+DN2}< z9EO0nuB(#$0<1+XDdC)R!b!ogAdE2>1{Q zOi8<`V0aLG(DL|V?=p+fTW*xL2Pr0uO-93jA3J);ce8U9wD8?)1Ra9x2!B{5C}TKo z4LzFhcqQQ~h?k^uG8R4PRBXSesukN`v07~~7G`_bgy(M>jkf|U@_(ls7R$t+0lY7dcjA3qJbpn|YO^3uVL}`ZD~jUTEnWV}*5AC`n1JWY{uh zIAs`-BfE?6d!SySw5MnZdX#sR^5Vqy`Tz2)$OqzDLSC_|S?&L)7-@TLjuo)S9AFscLU#nSd3r zSH@n+w;uZxeTF_$o}}_0GRr2{p2o~K^Ue1Sn35{^#wOSaIZ=hLuMoN;CCsenR0)aE z9kIEBj=(!AzXLpd)gxfEV{%p{H5M(Yf(DLM`j#xuY&KSWd9+;^HJW$6ey7K=41;T` z6iAMdF~%T52tnNq>bkB&_xE_3@I2d=&w}^1<>m5NwIWR^h~R1{saZhZZJ~N)xptPD zK}fY3nG=%xSq|S0vyjcE`@n7=KY&W7Ve4Vx1Glk?PB6Q7k)!71Bhfw<#}HMBJVfU) zN2GV}ux%xr7*)`1_(UWO%*7BXhsZfZ(jl_yb6V#lC9XQ=51;f?Jji%xBi}MJ)D(jw z&QWEkKkRiFzSnMSb*U{t zul8+Jt~>v|7@+E)Tw-YQ3oQ)_}g=8x>}6W0tUSgqVK*_1C4tO3!@-TM_oQ-d$h)0{{U3 O{{sMUYzaWj1pojSIRYgB literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/tg-tj.bin b/src/Codebelt.Extensions.Globalization/Surrogates/tg-tj.bin new file mode 100644 index 0000000000000000000000000000000000000000..391d8f69929126569bfb8b2dc8612cba391bb63d GIT binary patch literal 584 zcmV-O0=NAiiwFP!000003d~bYZWA#S-dE}!yg{>oL@I2Mcc`PZNX!rsB*fB5UQ>%1 zPv!Acnq3P>?TX$2afGxG6++TToWRo~^d!jk*!5&W*X%yM?|tukKXyn2yrn7hGM*BF zx3>^_5rvS`2_quo7zKff?UDr8nDBQ1AKnxRVAP{L7a=JX8xjEnI3nCgx+-S**9S_2 zQIxT<$?g?N64thTA_Q=T(HKQh6rr*#%K%lU-2mx4@^1g(rp}78ri3f)n7fsJ`H;TH-((!FKMX9K_jsWX|?}2dLgcG#heHm>ln5BFRhKI{_v@Q{(sPUWu}|E#{qrH6mJ{44q0b}eTv z=SI$}k2PM(o9e<&DQ9wSusQU4$9ur2pvUmPcODn%5V-emcMHyejmi*4G$lz$CsgDZ zJ@vU5CPWSA-r#ee?Pob{u+Q}GR)q$|Fc(x5f@Tb(IAfqF)59i1!?f&n^mhY30wy-e zYU)8gd&ysK)pAmLDvkx-XT^CmSo z_Q8wy=ae}pEs!o8R1Xe0Y*F+6ISQ{9S#kg1g8Gt^4G;6X5Ep)dT zxJY@svVHzAZi<|+*UCO*@Sk5fT919B1V&`zw_sIjRIKuynC!j0=aQR=Uq1c#nd3F@ z3g-SJbq4c=6CeBi6 zH>_3x-FhsAIv2O#Hk8_5kbp(WA(wv2eo5JtRvB3$AJCI#=FQA|GppTzX?Vv|7)zBh zO%D$Uc@YMX@r7VoDoO?e8#`tRh?uGO03YAx2~aZTD$@ZgEE+HkQ#fa;E*ZHRpYi6@ zR#6g45m))+JV}C@c*3*>B`AsGI3AKXCSe$cLsAq)L0-}{rCDZcUQ4mCH4o+cyjEY- zBa}j)1*||lT(!j}JyTE5q|$q&qc9wKE{Au>EMkLrBh>Z#08BXzO@3Ru>j!RW5lbO+ z$1x(NT$^&~?X4*65tlnmT>84SHA0wBiVX%>D(U(UEL>Jbc>QJ`Plu6-0!CRY04|_TD!f`E3>;n zsy6rT?vE+IG|AQfvOm=c2(I}B{14Mbc{&4yo{8gJDG>7_fH_ZD67U7r86{6K7Quqq z1vLNrbBs=8##`t!_n6p5(|nd`u5-<$pd^w4EL3UeBdm}P-4l1SLCrzvzOowX)EyzP zqw=U{dVJT11DtT8WPXm|zrQg$Ez+4xXti*6$`Om2pgoamQ?7{nEbaBNhC3Cn`IR{3 zg6pQ!$b9~V@hM-3=1FcXu&cR(`xUph*sZPc2aCPN!6RQ1@+5&~-cQ#qTrYfovU)HN YSA#u1JopCy0RR630GSByc*6z&0P*e?Z2$lO literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/yrl-br.bin b/src/Codebelt.Extensions.Globalization/Surrogates/yrl-br.bin new file mode 100644 index 0000000000000000000000000000000000000000..e174a85d7723a5d43f24bb96079a2742999ab944 GIT binary patch literal 507 zcmVZrm^s><#!2EE1@Qm4nlTonhhZ0HJcQ0t7Cp(^@7h zk^)5gMjP8-^;5-EnKd zC`!7n>&{3=7-Nih?>)J`rc%;r3Y4!}^?~yL_SCfy%_W#t_P*l&p9GQvv|9w;VXe8> z#y%UlVQiCTA-*0Kpis@WQP3h(Z-E>1a3CzaqaNVKYA#{In<$ACHXfXb2lp1kAhq1UP%@M<-#7KN>YnrqMN@XDwJfz&?OmhV??|64z556D<0vkozzaYV6tE5(isD4?DTWZZ$z&sDN3BY*wWhA3?H?%+|-&H x@t3&CVevjOm>32~<)@#2upD>#JXegB;5pWZ)04jd009600{~Z7u;97{0000u_?-X% literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/yrl-co.bin b/src/Codebelt.Extensions.Globalization/Surrogates/yrl-co.bin new file mode 100644 index 0000000000000000000000000000000000000000..d8ad8578f8b99cbe25c78d3c5d58b4111f2b3e8d GIT binary patch literal 515 zcmV+e0{s0SiwFP!000003cOQGZrd;v+y}@VxCyjqWFy^`yTXEl0+nJ^1&S^y>qRCa zk^(;gxbw27=oQj4`6LA?(xEIhyJjWg&6{~Mk5oZ4e5VYyLNcQ9^%X*&%K{YbIMG64 zL{_Kc3tKs0LwevXkv{;QzL_2{+ES@>L99ayqM?R?$dR{pwTM4FIu1s);qBPHHGN-% z**l^&NRCn4w(TuyQCXHHvesI3z>Hy~PRAFm9qp^&oumDm61yhCmolZ``cM%2D&qwl zw40;{1o<}+)Sx<&DSN#b@dNXIzB#74pzruFz*i$^H@u18w9;^wFBF0~D(@1!xL__k119`N1WO7 zJNT5MJE7ji!QQR0-}Ajvkfv4>oqziv_rUcMEkJMbW-jj*(x?Bx zZI(9NOJRltUZr4dStELkHV-?Wf>g0mk;+$svoHLSa;ndS{PgR0ir2K`7-hL1Jz3M- z*$6NCnyzY24ftE!=rFs9jFR>}#PaF*$CtxWFLQ-h5gucGxW4)e009600{{`rZQ0QU F002Jy_#OZN literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/yrl-ve.bin b/src/Codebelt.Extensions.Globalization/Surrogates/yrl-ve.bin new file mode 100644 index 0000000000000000000000000000000000000000..16b9f30a72f8f17259e83847a3d7050f31e7afef GIT binary patch literal 516 zcmV+f0{i_RiwFP!000003cOQ0Zrm^w><#!1YyuUrcHwkk7g$~+K%^|9Ac0G2^{gc< zk^(;l*ln3p}hV;N&B7XureltB_w4qYzf>?(ZL_-Y&kt1*IY7zhX;5Zo7hPPw)#`Jv= zW^aksAUQ^D+qPGzMP*r*$XaXB9y5lOIv$?2cC;^ocaHXNO6-~lpUaej>wQ7&i;Nd= z&~}o3cu8OHh16%W*JZhmLp?s5dK&4FWIY+qT=gD^^kz<^Nf56IeuWibp#1&hh*2+@ zBW7ecu*Y~%<3X8WJXjMTMU21RrjhVOiH7z+$@)O4u!W!!)q)sp$M4`3ay0nRIT~2_ zhQ5IYoj5!6+0d6|OAhXUQ%#@Xt({bcH6W88>c&V3d}j;TQAYZLc2p~jKBQO$9dTw) z@8DyKZiS)~)N{R1Z5pMiHkt~KQ6;!fIC@wbI3lxg*Z%E;+yU21v;e)zo4LGRNT2=# zS6SL{Cxsajc$I>+WsT@D`f*$P6r_rkid4Q5oPFjGlv8~ozYTG~%hVOyA!(NIGt#MlDWp5$ENug3rT_`=St%pTXG29#&QCxxay z5io*d!mAd2owNMaq1Ip&q%5kc2YDR(wT&SW0yx7cilPWbCn@yBXg)N1K=2vR1Fd{Q*fNF$Ago%PG5DsNT!Q~%@-a|d&T(NW4p+ebg>+xdoe z4QQmZ&V4-W>Fhfo-1uq)W^wJT=?CV9AxR)J|5XneJC~|lI^jaeS&PckRaibKdC?B9 z*NT-qThEkt=Fu3BIh;@;Ao@pan1i*9Xx+@2e52&W%9lJd&Fo~|@=a1vf-5p=XUOcd2`M!of+D!cx%E>Rp@z}w%P|q1wDcPVY@I-#=xDA%wEnp zuu0*=geD~R>6D5Lqh~G)VM_D?n)l(kONVJjTlA^<^yo&Te4Gg?azRsuQJ6B&sPeFB zU`0CPOv54Y2{5rqR-=w?$AKM}I~%rlzXeY`w_u;A`LTn4eRt`oNXBW5QLyWqHArYP zAqh>Uw)TP@Qbt81=&6t2Tt1>xhLP7Zvs-uSTC4D8W9?&gwKe~%*n0FHSxG?S7;IX7 iFb})E>-uK(Vis46J>K5>4FCZD{{sNqvj$D*1^@u$wu3viwFP!000003d~b6Z__{&-YfM#+=6ZZlcqp{+fc0(By6Gv2{B&c*Yt#a zSDnw5ymdhe1%^mS9U8G!%7VneP#F0sRh{2~?(DnRahjR!)A!wb-}j#Ve5&9rOQ0uY zLKWHGLg+={L(0aSDj^BFy*@9#PBgzyW8e{$?*Kj=W-$=dV=`4f&9&-N1p_#tvMlRp z&gyTDbPYj);8FRym&LJPS@)?@AUQ#Kp69su{R;Ra>PjjaQi`gVvTwH0fzcT#iYWTsikgDa~2|AHeTYg&6WNj^&n0W7j zN)zL*NnBGf3k+!jsrfh_s)Bmx_WG;>f4*4eQwfU8ODlb=n2$fqw;c{8oHD8)T4`HM z=dN=xoxA25+x~{P7Sp+NF>kEVbl&zdv)0|Zio;bAU&{Kz=IrQA2 z?#>b}UAjvfjMs%b0L~OUh5smIm?cAywZq)cqy#?7eHgKX#y%S}l@hdD*FqRmJ%{_T z8fssptfB6h)76az*)Ua1Wr_(-P$)QPsm!p>uvA)hU2{YrN5Iv(vP#-m*Gk!4Gkxu- z9@gapDYBFL#XZ1vd5|YV5fk*+{OTbMEfLbtFjcTu{D^U;+$>f6ZzaN^P^qRWlpfdC#9k_` z!fF-J&7}mKwmBFAIoRzjUP=_j14%IsUT>%_+Flm6@EZt;1Ly{0KR<4V<4!*L?%62DAuDALO7p83S8d(!9HHi#yG;O%PWkeL_?A!B+Jy`yOa;q z;O-&Y*^qAv`6-t}j}|rUuV&+Db$O-8?#2mzm=lD;(Rg{6U`dKsfLEAQu97zwn^X5*mAKz+^_y zYnKaPK-G%%-|>~pcGHYC*q8d{E1@v&Ws=EUvXm1Pq#P7gW!Pp|G289BAo{@NwlPEP zoO_V6v4c@{p5hCaJ``zw?7q|I*rmfF>7_A2PxKBnu-^d08NZMOZs1lJlq=;WrC6@9p(5~0c=A*fDo4hwO@4a!>p%UJ+2wJg- zs3f~P2)%S2NLawBj0Hi{$=BIMU*Y>S1nyJu0pQcSGz5ZLOeE5wnPMF(!GjYj%CV-x zD*o+}njy$bxnFj-(lB(4bcad_f)kWwS%znKzp;ypQ6KxbxV*vWkVFwl5;gTE=7E~p zK2dcp?Y6eKF_*^<&1%jqMt#4yyisIlCHyxN-aC$kT+;TNZd2*k?3$ip6lk3V6K(G! zP@!!+l%!q?`haa3L83oS0~wT1EE^7WkT$&T6YoCwVdI*Y+3npAbILICe&4)j<=Lx%-SCIr2( zxi$n;MXdjh&uz97Cv2V7i@da(NG4OsVop#y=Afw3!zRI!S(Dq-PY*;7xZE^msI7Br zF84O1x1QoNn?4Y6dSbuRr`V>wEb7J~L5Hs&=@hhGA@i&2;>To`|JAth_lh4e&SX8- zxbI)vyvG7g5N>FVrDLu7E6E4kEgx)k)UexUD~I@Tg}N*Zp@Q%8Um7;2UCm`;RdgBa W$?ncS00030{{sLVv_Mc*1^@upI3`X2 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-mo.bin b/src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-mo.bin new file mode 100644 index 0000000000000000000000000000000000000000..5645a5b1536e1b617262bd844ab030f9593e4cc6 GIT binary patch literal 584 zcmV-O0=NAiiwFP!000003e;1dF1GZ@hvHmy>WQ;b@Y?_(k;a7>A6~%lsDygACPH*+M?REv6Fe<@cS-Z$4 z)#gPusg|p{+^=yXvB)NsitZUM@ii@-)mEELvwS?L>@Vx-Syj(RBdce)#7}Rn{_ht4 zdx_s)E%Ebjc5O?mpO!ktn|$vBXOf-3|KY!#gk2EUbKXmY0NzU-=&_In4(l@+6ZFRB z+R&#eV)b`?ZL^&yW;OPee(-9Mmvm#vWFlF_32H|i6jgZGBv>$;S!|?>#?coXKje z@i@4)d5`ruLAaqcYR6jjSCCJ*s~>E2)UexUONaPbiMlKZpoAZ@KN>ctUCm`;m2?s7 W`R>j?00030{{sM)NCmo81^@tZHy*_R literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-tw.bin b/src/Codebelt.Extensions.Globalization/Surrogates/zh-hant-tw.bin new file mode 100644 index 0000000000000000000000000000000000000000..6915cf5d552612888881280fe4669329d61acc4c GIT binary patch literal 586 zcmV-Q0=4}giwFP!000003e;1$>f6ZzaN^P`RcGlpfdC#9k_` z!fF-JO{D~!wz)avU?;bnN}z@woYJoew!nW;cD0h%vg3PiPo*nDsf8ksxS3`?k0kD*S*3z8S) zQtnojoon-JliY~QfkV@Zck{{6&#!J3*{L1jyE%e4h=knmZ@NvtVz+uKRuR^TFwrqT z0TnvRV;fb2K_9bCLx}Z0NEN`7FyP!z%u&o}E|qVm!8bMl1a6&g%ba z;XhaS{q+jJ_+r<#wfbqfW4tZ*A#f(yDf}P#+ez33VLk1GLvMu|Lwl?ptDdhQA4#`pF literal 0 HcmV?d00001 From 59da3f63f3832864aabd26103c838496173289e3 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 03:19:27 +0100 Subject: [PATCH 03/10] =?UTF-8?q?=F0=9F=86=95=20add=20icu=20to=20nls=20map?= =?UTF-8?q?ping=20for=20culture=20name=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tooling/gse/Program.cs | 85 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/tooling/gse/Program.cs b/tooling/gse/Program.cs index c70ca9d..4bd087b 100644 --- a/tooling/gse/Program.cs +++ b/tooling/gse/Program.cs @@ -1,4 +1,7 @@ -using System.IO; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; using Codebelt.Extensions.Globalization; using Codebelt.Extensions.YamlDotNet.Formatters; using Cuemon.Extensions.IO; @@ -41,16 +44,92 @@ static void Main(string[] args) o.Settings.IndentSequences = false; }); - using var fsRawYaml = new FileStream(Path.Combine(SurrogatesPathRaw, $"{cultureInfo.Name.ToLowerInvariant()}.yml"), FileMode.Create); + using var fsRawYaml = + new FileStream(Path.Combine(SurrogatesPathRaw, $"{cultureInfo.Name.ToLowerInvariant()}.yml"), + FileMode.Create); fsRawYaml.Write(ms.ToByteArray(o => o.LeaveOpen = true), 0, (int)ms.Length); fsRawYaml.Flush(); using var cms = ms.CompressGZip(); - using var fs = new FileStream(Path.Combine(SurrogatesPath, $"{cultureInfo.Name.ToLowerInvariant()}.bin"), FileMode.Create); + using var fs = + new FileStream(Path.Combine(SurrogatesPath, $"{cultureInfo.Name.ToLowerInvariant()}.bin"), + FileMode.Create); fs.Write(cms.ToByteArray(o => o.LeaveOpen = true), 0, (int)cms.Length); fs.Flush(); } } + + WriteIcuNamedNlsAlternatives(); + } + + private static void WriteIcuNamedNlsAlternatives() + { + // Maps ICU-only culture names (absent from Windows NLS) to their nearest NLS equivalent. + // When a surrogate is written for the NLS name, a copy is also written under the ICU name + // so that ICU-based environments can resolve it from the same embedded resource set. + var icuToNls = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + // Script subtag added in NLS + { "bgc-IN", "bgc-Deva-IN" }, + { "bho-IN", "bho-Deva-IN" }, + { "bm-ML", "bm-Latn-ML" }, + { "ccp-BD", "ccp-Cakm-BD" }, + { "ccp-IN", "ccp-Cakm-IN" }, + { "ceb-PH", "ceb-Latn-PH" }, + { "chr-US", "chr-Cher-US" }, + { "cv-RU", "cv-Cyrl-RU" }, + { "doi-IN", "doi-Deva-IN" }, + { "ha-GH", "ha-Latn-GH" }, + { "ha-NE", "ha-Latn-NE" }, + { "ha-NG", "ha-Latn-NG" }, + { "iu-CA", "iu-Cans-CA" }, // ICU defaults to Unified Canadian Aboriginal Syllabics + { "jv-ID", "jv-Latn-ID" }, // ICU defaults to Latin script + { "kgp-BR", "kgp-Latn-BR" }, + { "pcm-NG", "pcm-Latn-NG" }, + { "quc-GT", "quc-Latn-GT" }, + { "raj-IN", "raj-Deva-IN" }, + { "sc-IT", "sc-Latn-IT" }, + { "sn-ZW", "sn-Latn-ZW" }, + { "tg-TJ", "tg-Cyrl-TJ" }, + { "tzm-DZ", "tzm-Latn-DZ" }, + { "tzm-MA", "tzm-Tfng-MA" }, // ICU defaults to Tifinagh script + { "yrl-BR", "yrl-Latn-BR" }, + { "yrl-CO", "yrl-Latn-CO" }, + { "yrl-VE", "yrl-Latn-VE" }, + { "zgh-MA", "zgh-Tfng-MA" }, + // Script subtag dropped in NLS + { "mni-Beng-IN", "mni-IN" }, + { "pa-Guru-IN", "pa-IN" }, + { "zh-Hans-CN", "zh-CN" }, + { "zh-Hans-SG", "zh-SG" }, + { "zh-Hant-HK", "zh-HK" }, + { "zh-Hant-MO", "zh-MO" }, + { "zh-Hant-TW", "zh-TW" }, + // Language code differs between ICU (CLDR) and NLS + { "ckb-IQ", "ku-Arab-IQ" }, // Sorani Kurdish → ku in NLS + { "ckb-IR", "ku-Arab-IR" }, + { "qu-BO", "quz-BO" }, // Quechua → quz in NLS + { "qu-EC", "quz-EC" }, + { "qu-PE", "quz-PE" }, + // POSIX variant not present in NLS + { "en-US-POSIX", "en-US" }, + }; + + foreach (var (icuName, nlsName) in icuToNls) + { + var sourceBin = Path.Combine(SurrogatesPath, $"{nlsName.ToLowerInvariant()}.bin"); + var sourceYml = Path.Combine(SurrogatesPathRaw, $"{nlsName.ToLowerInvariant()}.yml"); + + if (File.Exists(sourceBin)) + { + File.Copy(sourceBin, Path.Combine(SurrogatesPath, $"{icuName.ToLowerInvariant()}.bin"), overwrite: true); + } + + if (File.Exists(sourceYml)) + { + File.Copy(sourceYml, Path.Combine(SurrogatesPathRaw, $"{icuName.ToLowerInvariant()}.yml"), overwrite: true); + } + } } } } From fc5fedd55928a67fc88818adbb11b7930ffdfeed Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 03:20:00 +0100 Subject: [PATCH 04/10] =?UTF-8?q?=E2=9C=85=20test=20for=20ensuring=20all?= =?UTF-8?q?=20icu=20cultures=20are=20mapped=20correctly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CultureInfoExtensionsTest.cs | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs b/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs index a4dbb42..9af95bf 100644 --- a/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs +++ b/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs @@ -1,4 +1,6 @@ -using System.Globalization; +using System; +using System.Collections.Generic; +using System.Globalization; using System.Runtime.InteropServices; using Codebelt.Extensions.Xunit; using Xunit; @@ -16,9 +18,9 @@ public void UseNationalLanguageSupport_ShouldHaveDifferentFormattingAsWindowsVar { var sut1 = new CultureInfo("da-DK", false); var sut2 = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) - ? new CultureInfo("da-DK") // Linux uses ICU - : new CultureInfo("da-DK", false) // Ensure we do not read from user culture settings on Windows - ).UseNationalLanguageSupport(); + ? new CultureInfo("da-DK") // Linux uses ICU + : new CultureInfo("da-DK", false) // Ensure we do not read from user culture settings on Windows + ).UseNationalLanguageSupport(); Assert.NotEqual(sut1.DateTimeFormat, sut2.DateTimeFormat); Assert.NotEqual(sut1.NumberFormat, sut2.NumberFormat); @@ -1267,7 +1269,8 @@ public void UseNationalLanguageSupport_ShouldSucceed_ForAllSupportedLocales(stri [InlineData("aa-DJ")] [InlineData("aa-ER")] [InlineData("aa-ET")] - public void UseNationalLanguageSupport_ShouldSucceed_ForAllSupportedLocales_FromReadOnlyCultureInfos(string localeName) + public void UseNationalLanguageSupport_ShouldSucceed_ForAllSupportedLocales_FromReadOnlyCultureInfos( + string localeName) { var sut = CultureInfo.GetCultureInfo(localeName).UseNationalLanguageSupport(); @@ -1277,5 +1280,33 @@ public void UseNationalLanguageSupport_ShouldSucceed_ForAllSupportedLocales_From TestOutput.WriteLine($"{sut.EnglishName}/{sut.NativeName}"); } + + [Fact] + public void UseNationalLanguageSupport_EnsureAllIcuCulturesAreMapped() + { + var allCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); + var missingIcuNames = new List(); + foreach (var culture in allCultures) + { + try + { + var sut = culture.UseNationalLanguageSupport(); + } + catch (Exception exception) + { + missingIcuNames.Add(culture.Name); + } + } + + if (missingIcuNames.Count > 0) + { + foreach (var missingIcuName in missingIcuNames) + { + + } + } + + Assert.True(missingIcuNames.Count == 0, $"The following ICU culture names were missing from the test data: {string.Join(", ", missingIcuNames)}."); + } } } From 90a5de9f6240e4999a82701d740999f6db3e6cc2 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 04:31:52 +0100 Subject: [PATCH 05/10] =?UTF-8?q?=F0=9F=90=9B=20new=20surrogate=20files=20?= =?UTF-8?q?for=20additional=20support=20on=20ubuntu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tooling/gse/Program.cs | 108 ++++++++++++++++++++++++++++++++--------- 1 file changed, 85 insertions(+), 23 deletions(-) diff --git a/tooling/gse/Program.cs b/tooling/gse/Program.cs index 4bd087b..4c2e517 100644 --- a/tooling/gse/Program.cs +++ b/tooling/gse/Program.cs @@ -33,35 +33,66 @@ static void Main(string[] args) var cultureInfos = World.GetCultures(region); foreach (var cultureInfo in cultureInfos) { - var dtSurrogate = new DateTimeFormatInfoSurrogate(cultureInfo.DateTimeFormat); - var nfSurrogate = new NumberFormatInfoSurrogate(cultureInfo.NumberFormat); - var ciSurrogate = new CultureInfoSurrogate(dtSurrogate, nfSurrogate); - - var ms = YamlFormatter.SerializeObject(ciSurrogate, o => - { - o.Settings.NamingConvention = NullNamingConvention.Instance; - o.Settings.ReflectionRules = new MemberReflection(); - o.Settings.IndentSequences = false; - }); - - using var fsRawYaml = - new FileStream(Path.Combine(SurrogatesPathRaw, $"{cultureInfo.Name.ToLowerInvariant()}.yml"), - FileMode.Create); - fsRawYaml.Write(ms.ToByteArray(o => o.LeaveOpen = true), 0, (int)ms.Length); - fsRawYaml.Flush(); - - using var cms = ms.CompressGZip(); - using var fs = - new FileStream(Path.Combine(SurrogatesPath, $"{cultureInfo.Name.ToLowerInvariant()}.bin"), - FileMode.Create); - fs.Write(cms.ToByteArray(o => o.LeaveOpen = true), 0, (int)cms.Length); - fs.Flush(); + WriteSurrogate(cultureInfo); } } WriteIcuNamedNlsAlternatives(); } + private static void WriteSurrogate(CultureInfo cultureInfo) + { + var dtSurrogate = new DateTimeFormatInfoSurrogate(cultureInfo.DateTimeFormat); + var nfSurrogate = new NumberFormatInfoSurrogate(cultureInfo.NumberFormat); + var ciSurrogate = new CultureInfoSurrogate(dtSurrogate, nfSurrogate); + + var ms = YamlFormatter.SerializeObject(ciSurrogate, o => + { + o.Settings.NamingConvention = NullNamingConvention.Instance; + o.Settings.ReflectionRules = new MemberReflection(); + o.Settings.IndentSequences = false; + }); + + var name = cultureInfo.Name.ToLowerInvariant(); + + using var fsRawYaml = new FileStream(Path.Combine(SurrogatesPathRaw, $"{name}.yml"), FileMode.Create); + fsRawYaml.Write(ms.ToByteArray(o => o.LeaveOpen = true), 0, (int)ms.Length); + fsRawYaml.Flush(); + + using var cms = ms.CompressGZip(); + using var fs = new FileStream(Path.Combine(SurrogatesPath, $"{name}.bin"), FileMode.Create); + fs.Write(cms.ToByteArray(o => o.LeaveOpen = true), 0, (int)cms.Length); + fs.Flush(); + } + + private static bool TryWriteNlsSurrogate(string cultureName) + { + // Attempt to resolve the culture under the current NLS runtime. + // Returns true and writes a native surrogate if Windows NLS knows the culture; + // returns false if the culture is genuinely ICU-only (CultureNotFoundException). + try + { + var ci = new CultureInfo(cultureName); + + // Guard: Windows may silently substitute InvariantCulture (LCID 0x7F) for + // unknown names instead of throwing — treat that as "not natively supported". + if (ci.LCID == CultureInfo.InvariantCulture.LCID) return false; + + // Guard: if Windows normalised the name to something else, the surrogate + // would already be covered by a different entry. + if (!ci.Name.Equals(cultureName, StringComparison.OrdinalIgnoreCase)) return false; + + if (ci.DisplayName.StartsWith("Unknown", StringComparison.OrdinalIgnoreCase)) return false; + + WriteSurrogate(ci); + return true; + } + catch (CultureNotFoundException) + { + return false; + } + } + private static void WriteIcuNamedNlsAlternatives() { // Maps ICU-only culture names (absent from Windows NLS) to their nearest NLS equivalent. @@ -113,10 +144,41 @@ private static void WriteIcuNamedNlsAlternatives() { "qu-PE", "quz-PE" }, // POSIX variant not present in NLS { "en-US-POSIX", "en-US" }, + // Geographic/regional fallbacks for ICU-only cultures (no NLS equivalent - Ubuntu 24.04) + { "ar-EH", "ar-MA" }, // Arabic, Western Sahara → Arabic, Morocco (nearest NLS Arabic) + { "blo-BJ", "fr-BJ" }, // Anii, Benin → French, Benin (official language) + { "csw-CA", "en-CA" }, // Swampy Cree, Canada → English, Canada + { "en-DG", "en-001" }, // English, Diego Garcia → English, World (British territory) + { "es-EA", "es-ES" }, // Spanish, Ceuta & Melilla → Spanish, Spain + { "es-IC", "es-ES" }, // Spanish, Canary Islands → Spanish, Spain + { "ie-EE", "et-EE" }, // Interlingue, Estonia → Estonian, Estonia (no NLS for Interlingue) + { "ko-CN", "ko-KR" }, // Korean, China → Korean, Korea + { "ku-TR", "tr-TR" }, // Kurdish, Turkey → Turkish, Turkey (no NLS for ku-Latn-TR) + { "kxv-Deva-IN", "hi-IN" }, // Kuvi, Devanagari → Hindi, India + { "kxv-Latn-IN", "en-IN" }, // Kuvi, Latin → English, India + { "kxv-Orya-IN", "or-IN" }, // Kuvi, Odia → Odia, India + { "kxv-Telu-IN", "te-IN" }, // Kuvi, Telugu → Telugu, India + { "lij-IT", "it-IT" }, // Ligurian, Italy → Italian, Italy (no NLS for Ligurian) + { "lmo-IT", "it-IT" }, // Lombard, Italy → Italian, Italy (no NLS for Lombard) + { "prg-PL", "prg-001" }, // Prussian, Poland → Prussian, World (only NLS Prussian) + { "syr-IQ", "syr-SY" }, // Syriac, Iraq → Syriac, Syria (only NLS Syriac) + { "szl-PL", "pl-PL" }, // Silesian, Poland → Polish, Poland (no NLS for Silesian) + { "tok-001", "en-001" }, // Toki Pona, World → English, World (constructed language) + { "vec-IT", "it-IT" }, // Venetian, Italy → Italian, Italy (no NLS for Venetian) + { "vmw-MZ", "pt-MZ" }, // Makhuwa, Mozambique → Portuguese, Mozambique (official language) + { "xnr-IN", "hi-IN" }, // Kangri, India → Hindi, India (no NLS for Kangri) + { "yi-UA", "yi-001" }, // Yiddish, Ukraine → Yiddish, World (only NLS Yiddish) + { "yue-Hans-CN", "zh-CN" }, // Cantonese, Simplified, China → Chinese Simplified, China + { "yue-Hant-HK", "zh-HK" }, // Cantonese, Traditional, Hong Kong → Chinese Traditional, Hong Kong + { "za-CN", "zh-CN" }, // Zhuang, China → Chinese Simplified, China (no NLS for Zhuang) }; foreach (var (icuName, nlsName) in icuToNls) { + // Prefer a native NLS surrogate for the ICU name if Windows supports it; + // only fall back to copying the mapped NLS surrogate if it does not. + if (TryWriteNlsSurrogate(icuName)) continue; + var sourceBin = Path.Combine(SurrogatesPath, $"{nlsName.ToLowerInvariant()}.bin"); var sourceYml = Path.Combine(SurrogatesPathRaw, $"{nlsName.ToLowerInvariant()}.yml"); From 33f31c95c06643dbc17b63ace11e93bcee1f52e7 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 04:32:30 +0100 Subject: [PATCH 06/10] =?UTF-8?q?=F0=9F=8D=B1=20additional=20=20surrogate?= =?UTF-8?q?=20files=20for=20ubuntu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Codebelt.Extensions.Globalization.csproj | 58 ++++++++++++++++++ .../Surrogates/ar-eh.bin | Bin 0 -> 638 bytes .../Surrogates/blo-bj.bin | Bin 0 -> 553 bytes .../Surrogates/csw-ca.bin | Bin 0 -> 530 bytes .../Surrogates/en-dg.bin | Bin 0 -> 533 bytes .../Surrogates/es-ea.bin | Bin 0 -> 551 bytes .../Surrogates/es-ic.bin | Bin 0 -> 551 bytes .../Surrogates/ie-ee.bin | Bin 0 -> 533 bytes .../Surrogates/ko-cn.bin | Bin 0 -> 548 bytes .../Surrogates/ku-tr.bin | Bin 0 -> 540 bytes .../Surrogates/kxv-deva-in.bin | Bin 0 -> 644 bytes .../Surrogates/kxv-latn-in.bin | Bin 0 -> 530 bytes .../Surrogates/kxv-orya-in.bin | Bin 0 -> 649 bytes .../Surrogates/kxv-telu-in.bin | Bin 0 -> 615 bytes .../Surrogates/lij-it.bin | Bin 0 -> 529 bytes .../Surrogates/lmo-it.bin | Bin 0 -> 529 bytes .../Surrogates/prg-pl.bin | Bin 0 -> 537 bytes .../Surrogates/syr-iq.bin | Bin 0 -> 608 bytes .../Surrogates/szl-pl.bin | Bin 0 -> 562 bytes .../Surrogates/tok-001.bin | Bin 0 -> 533 bytes .../Surrogates/vec-it.bin | Bin 0 -> 529 bytes .../Surrogates/vmw-mz.bin | Bin 0 -> 560 bytes .../Surrogates/xnr-in.bin | Bin 0 -> 644 bytes .../Surrogates/yi-ua.bin | Bin 0 -> 658 bytes .../Surrogates/yue-hans-cn.bin | Bin 0 -> 571 bytes .../Surrogates/yue-hant-hk.bin | Bin 0 -> 584 bytes .../Surrogates/za-cn.bin | Bin 0 -> 571 bytes 27 files changed, 58 insertions(+) create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ar-eh.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/blo-bj.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/csw-ca.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/en-dg.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/es-ea.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/es-ic.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ie-ee.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ko-cn.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ku-tr.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/kxv-deva-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/kxv-latn-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/kxv-orya-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/kxv-telu-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/lij-it.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/lmo-it.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/prg-pl.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/syr-iq.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/szl-pl.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/tok-001.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/vec-it.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/vmw-mz.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/xnr-in.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/yi-ua.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/yue-hans-cn.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/yue-hant-hk.bin create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/za-cn.bin diff --git a/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj b/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj index fd05394..83882ee 100644 --- a/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj +++ b/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj @@ -1309,6 +1309,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ar-eh.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ar-eh.bin new file mode 100644 index 0000000000000000000000000000000000000000..86931e82a2b4db5f9479460659ab496fd2fce1d0 GIT binary patch literal 638 zcmV-^0)hP>iwFP!000003fxq|Zqq;zy;tf#>;>gOQ>k!4zM)zvNH|mk331#s({zQs zuGZ^Hz7;0$1gcO&*=xT9?RxF5-Ovx<;`P2aZ|2Rcy*`!jl10#p zMMR~yzDCI7z=wqOIhC>S2>#O8HVuLIsCWhN=0zHUM_NoI(x;hbeJY^?hg9T}Mzf*O zBI5bJR(T|dc`uJ|rD5pX!n;&T5ZoiZ9tnaV*dSS!W#ow$MP8EV=w~tS>*&>yMMNc+ zqYh#&4}6-{)tcL_bgG6L>m0;F*2*=5pjp&1{Hfj@m238ADBV4 zX#|Nmf+oT9d{ra6pV@U`*9*JO?YcBa*X;^8VpKw}o^PrKc!KA6>FmGaOpVl}tf8@) z8sHRXIK?j&qPTvq6Rmtnv}W5rmL~DALu9kuWQgbF18z`O!h_0hg;}mbz1S%jMRJ?wwzM z)1`MroF2OO!bZcTJ6Y6?LyzF)rW$TuAAdBx&~}0AL&fEv&$v+U)KGoEsR^)lpYnai znJlw3ug9NUzQg*wypSuitJ}@Vf0(V#uP(Lh-P*!o<6eOVEDWK5uaCbQ*iO3Mmu;({ Y^S17iwFP!000003d~cnZrd;r-2>zwxC9zn*J-;H+zbm!3Y4l*6(~BMt+PW{ zBn^rZpv_~yqI;%v@901Amjt9phq98+neOo3y}NfOF$II)xxh?m0ft^)5He#a)_fzu zC{4+XS!@m!$`bSs#9!Z<3Mt9Bu1yM^Wm7O%;0|;znOZFHU)NSc2~)D{tFxx6Qa^S9 z#-Nszlx10xk}$>?>AJ2Xx3^RXTGv+bMahj-yjUHI1})Lig0ci7mAlth;bn zai_F7n>b}`8fH0uJj_xSjc$?9#G*eDwDWKh47|I3=2`PCWtEP_ve8fI( zeQbTK9Y0$xHMSfKmZN^+UFax%CP0S_L$<}nXDx=h8hUNi-7OUN--2v?`TB6*o*IL8 zA7Mfu!u)RAhRah{c^1^+pYd~XXFRG_A(JZ1DG&E6pC-w3{%%lm!&`h^KJ!K_QAdw% z-e`?-)up)N0;-g6xTz_*j=3B+U{^W)L!V-Hp=v&0Kf0%B8x_s6HrzCZD@jSNr2Aib z4`%~EJTaqj@7;4jy+Uc8lX+^SyN<|_%fW`eYy5uRCUL=yR?RM=kNbz1E;_MP6(!km z|1i&HZWqV{nnUgo@9(o*bIHv~G&%nM6Y~Y%NJ^54GcY*T*k4b-;BI)bvDowfR|l8L rRnRbART$vo{;z}mdCzzAs|C7W?ak%IBLDyZ|NjF3%0d_X{{;X5Cs+v7 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/csw-ca.bin b/src/Codebelt.Extensions.Globalization/Surrogates/csw-ca.bin new file mode 100644 index 0000000000000000000000000000000000000000..8a005199c2a09f59d3c30c25b3a775e8206c8348 GIT binary patch literal 530 zcmV+t0`2`DiwFP!000003dB^gZrd;r-2>zwIJD5vsAxNKGa@L6Q7S@Z!01R>7nz7e z8Wd?jTgQGyzoFlhFDXbKRmoPfb|QK2?!9+MQ5iR|6FuZg_uSCi8$vcLgF&>C8>K1P zFc-V$9mt03J;2L1+W{rH(1XeN=+KNCsNlqPC`r=9MPtU(v#X+{va$*Jx$U|Pg-dP> zXh{iUjFIM!jN>?xBkg-S48$0h|5eG><*(+(gaz5Mo+)XL86PLO@eB?s7tNMFRvnc# z3q7ZkGL|;YgkQ;_mW$74LH#Vg1J~ZgqJ_T=cuMf&DtHfrzlfAnHmppAb%*CY;Q1KV zTw^}>7g*OC&Vn0guJ~jm#Ldnk)gGG2i6Xfck=0z#`c~$|TaJ7=)TqGG)8>R57A`*} z+vs9zJIt{yO2H{?o(^6!C51YNO$LXsNs=`;4yO_)j3d453)_ltXzRo6 U%^v^&0RR630Ap#jLCFOG0G!+Wn*aa+ literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/en-dg.bin b/src/Codebelt.Extensions.Globalization/Surrogates/en-dg.bin new file mode 100644 index 0000000000000000000000000000000000000000..16fbdd390e4e7fca03d89823ecdff50a8c5c8a26 GIT binary patch literal 533 zcmV+w0_y!AiwFP!000003dB>rZrd;r-UH+vxD*;1*KJ2`K?DUgO2vo_q#aMzMJ6hd z21Ods*0E2~XXrEKNeYrjSF)X~op`#B-_Ma^4i-1E$3mMPEWf^D>{jGB$X0>XhBN4W z?+!Xt4VWjyACIm>&I)M;o5SeQ94uD22NNkv-%I$zv*&Oov})q+!gXCvwrj8!jpD3n zn&yTzOb8*^IF2LR@xJH7z^wJ8uUfU9^g1E!n#s;ZgjRN!!}w1m&^@%C4ZROTS37O& ziRn^^WpWGnnH_og{^U$Dp84)~1QSvmDYN`R5yQEa(Bly9W5FsHSE1v&q38T`0#m14;6E;bcObR2Dsy&enlT3wIKzaq%H6ot0W~R%#XQGG@4B7?I0%YcyL_ z_7aVtH+g3%XETuM;3iBUjP6A|NjF3B_`=E)CB+l;3@<} literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/es-ea.bin b/src/Codebelt.Extensions.Globalization/Surrogates/es-ea.bin new file mode 100644 index 0000000000000000000000000000000000000000..518f81750d371228663cd47a7e67197e01817a29 GIT binary patch literal 551 zcmV+?0@(c@iwFP!000003d~czj?^#^?oYaRaD!5CyL&)`+@Xv10A0e0Anqt9@odhJ z*el0b$sMBNDUj$Xcn99(o&@voU6;hyxH0+N(w0$ z7{`oVmxu8i&>EGXgfYf02+IgVk`+Z!cw~$*`+%UFkEwpXgX@Xzm?iW$ zxR13Uxeqr!IL8Ze=fi6s-uqCwuUpp&_Z&2`qee_FJ?O>&dWe7r@G(;Rm>GV3Umo>! zi=>@VV5r_=J@r-rK^;*KW||`=)Wy0s8XRyJkZg27Lhb`%ya~vEt7B)^D7fZ({9hcF zV_&069^loe6pF^=*zg{@oVQ#Llsrwj5?ioKO#jRCl-Y{ygade`c^KowBTCFahK4`l&nl&%Z`$V zFF)KCP{vFNrOO0ouf&!Mt|!6b;p?}QuXrmc$rf((!I|dHJblvF;i=}*!2eAf9cGWB pqTpSJ)25$)x^y_|@m^uANc*)OpP&5(009600|0S6(H8**004GU6v+Sp literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/es-ic.bin b/src/Codebelt.Extensions.Globalization/Surrogates/es-ic.bin new file mode 100644 index 0000000000000000000000000000000000000000..518f81750d371228663cd47a7e67197e01817a29 GIT binary patch literal 551 zcmV+?0@(c@iwFP!000003d~czj?^#^?oYaRaD!5CyL&)`+@Xv10A0e0Anqt9@odhJ z*el0b$sMBNDUj$Xcn99(o&@voU6;hyxH0+N(w0$ z7{`oVmxu8i&>EGXgfYf02+IgVk`+Z!cw~$*`+%UFkEwpXgX@Xzm?iW$ zxR13Uxeqr!IL8Ze=fi6s-uqCwuUpp&_Z&2`qee_FJ?O>&dWe7r@G(;Rm>GV3Umo>! zi=>@VV5r_=J@r-rK^;*KW||`=)Wy0s8XRyJkZg27Lhb`%ya~vEt7B)^D7fZ({9hcF zV_&069^loe6pF^=*zg{@oVQ#Llsrwj5?ioKO#jRCl-Y{ygade`c^KowBTCFahK4`l&nl&%Z`$V zFF)KCP{vFNrOO0ouf&!Mt|!6b;p?}QuXrmc$rf((!I|dHJblvF;i=}*!2eAf9cGWB pqTpSJ)25$)x^y_|@m^uANc*)OpP&5(009600|0S6(H8**004GU6v+Sp literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ie-ee.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ie-ee.bin new file mode 100644 index 0000000000000000000000000000000000000000..40817fb9d90e0e5c997e9aad868e4e120fcf7a3e GIT binary patch literal 533 zcmV+w0_y!AiwFP!000003d~b6Zrm^s><#!2YyuVW9bmf&*cn#N4s6PTWgtkoI;~~K z5_zD=1K0(r@`@lu$`pBn^Ao=$ASs=z0FKOG-u5+4eDQc(LQ$LiA+QvPY6#5|r z`_dz*9hZ-G&plQ=NTpv5T{5;DhIxKE%~1}G4wBHsp`Q?xH?b3p%=>=mkCs7;o&P8c zl85j5wa~}sY2TR`Kh$O^n$=<0D<=s zW5i3^^eLD+Bpq&a$mC<62)PYOg+tpUnR9l5f@{9T|HWZu+7eatvd)cCDAqQ`HE*Fw zdChf4$w|y*Sc6+)_iwz5*<5yf#Gd+h=Nc8J>@?R#b15jvq(Dan4|4+pGZ}a6p8={h z3Oy(5slB?1%j22t<9BhC#03{hnoUGM{fODZwxw(+dH(v#uL0SBWZ-|_!P*CL&jr^z z!Q%Pb_n0quEhtGAe)i~2Q)_{qH#R=jRNM1=#e>J>%^+dCX>hmem){=l@A`VPezAcL Xi@iNO_zM64|NjF3+U_d|-30&uQu77J literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ko-cn.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ko-cn.bin new file mode 100644 index 0000000000000000000000000000000000000000..9802e6acaef2f128715eea5ba9104df3ed79e211 GIT binary patch literal 548 zcmV+<0^9u`iwFP!000003cOT3Z`42#?IYzsY=gD{qg?pj4#m0%37b=l6jAP-C%zT- zZnR!Ua)(er_XDm7It8Uj0~IAjeoac^{0FojHf!e+(LnV^^Y+cWnO!@i3f{5;#zGcU zkpY*=W!1qGUbRXicG{nwE;GN-@C+ ziUkKvSr3DT+kcq#?Is{+z|}gLqwdt*aM_!|RrMbJL!aK2qB``yiU-)Ile(CSoS@5( z=C#E%ZZk2BO~yHU#Sa)~suKj4i?2SPu#9)Vsot7~&MbM0ul}lrQpet{Z5`r!Z8lToVMR!iHl?r(1V1^@v6{{sLirAK?&1pojiU<~X4 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ku-tr.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ku-tr.bin new file mode 100644 index 0000000000000000000000000000000000000000..dcd95cd840e4ac35ae3bd8dacbc6e4d33cc4d705 GIT binary patch literal 540 zcmV+%0^|K3iwFP!000003dB^sZq+at-7EDSyr2w_D`50?mGt%^a2k60M;Ma~bbOm@EGbG~!F#7U`wOV+|p$d)R6dVUtDPpMnv$+p5FCM zle)$^RSG1>s6vDgf`(xjP*qhG+V64O;;z$-4}#a4@z>M-&_ps+AcCvwlnyfm4dt`I zg)SD?LaJ%Y4IvxdaDSv(Rco+#|fKd<3yfWHCXWm4Na_UxP*TOv? zzj*-cn)Gfp2e)M@;f_%S)k5&zZSF_OX4I5k)NPX9B#Kee&UHap zFk_vsn6xq4dmoqJT5O+wxD025b98pY?B+dn{H=6NqG-*}IdG=f9sFNkS>Ki*gBz9f zQUX5=DI8c!o0Qc|br`)3u?%Xet&g9_n-I-K$0q1&bL+HF(U+ZKs#i>Kj55K^7hyfD zHMGcjyBy>JxLTt*Xu%7?h094ory5?3S5bK2T#Ej7{ul9JF|?&=rhzf(m!GEW ehC0vXVtLrcdU<;C2LJ&7{{sLUNMS3|1pojJ!VA{` literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/kxv-deva-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/kxv-deva-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..72d3f24b72ae402cec546a7e8d9cbf8710a19a0f GIT binary patch literal 644 zcmV-~0(<=*iwFP!000003hY(OYTG~*-3Rgyvng6M4o#QZg$O5wN;P$%bUBW1oT1Vv zj79X)9JYcaHiBw3=1tnO5goU1_zbpsAjWwfb3|ukbwAlW_&zBJ>4)oI9wxwzC{fXh&Vu zH_W`ju4fkfZPmKq3~#LbbiY~1Ob$b2S%sXNApOs$8dC@&mgq+mz?6vuPhVlk61!+qK57C{G3;oOf<77XtWU z5x^l!XdJK+lbKImx?BV!Y8&jd=ABQM0M3tR(-Tt8P`Zbj3bhYZZFWEE=*nhHBF@{HUy{ e&AnD@S-M>7`R2x700030{{sN7MnFbs2LJ#K+cUNR literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/kxv-latn-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/kxv-latn-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..a836a322cb597f10ec1f27080bd41944967c8818 GIT binary patch literal 530 zcmV+t0`2`DiwFP!000003dB^sZrd;r-UH+vxD*;11xQD3Mg%1>O2w!Q7#%6;A`_KJ zgCY%RD?0Tl`V3wBI(d?Ue+nh5Sv&D`-`)3pcQl<*1$)**E@V#?zP>_eLoygx%c&9) zqYW{+d)fhSs5}6C`=UF*C}(m|866FpQ3WNOsB|q!nwV^;cz!Wm7?qkgu0GdYmwDkG zRSG1>sA&)(grIR8NA&oJ`yLO2ss1c@YpPc(L&1zH?k0k(V@AifZrg02-E7dE&6P(X z)j};LBn?^?zZ5f&$;Mm2b_-vDO6y^2F!DEOMhJFM1?^$5SCFDoyORia?)~=x{P)qF zx%BnaUR_m5I5VoCx!~i0&i_Yq4EmUd)l0QK-{&b zXd7H?b?0kz>!sl2g6G<5rl=5S7i3VoAW7ETJOF2ko#B7FDs*3gj2_XwmJ)b9W>B-9 zb{T7#8Zi14V+FL-7@vL_cQbe=1~!8&YMDx14T>qPnBW){g4?TfCe{=ka;axu0mvG- zT5I#ryL}ff?^ec-p2ckpKS-fZ@te6xVz?apN^}^#{`h03phd_Ow6GcP?1{fH&eYV9 zzW)3b<0WhP^uIJ))6$s(|KV%Cs%5K3-|r0$lMf+FSl7Wc>G$6@?U%Zo%a0XcH`d4N UtG@sM0RR630BZH2^2P-K0IgW|*Z=?k literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/kxv-orya-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/kxv-orya-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..a10fc8b227fb513fa3b65dae52c5165ad562e000 GIT binary patch literal 649 zcmV;40(Si$iwFP!000003hY%uYZE~fz8Cr*<{~-R1nO~brAu1DU4s$C<0N@a2X|-7 z>}+9gsZuLw@g$;%!IME}L#UwjV*kpJUn281vz<-So;-R9FYkNb`@Z=mOnfTgF^i#{ zh?q)mbAynbz=xC#IhBd<$WCB-yEFnmpyCO@vqxD39%(a?N}uKi^{Ip|98pnH8qJ33 z+KGn;hUJlN#s}qmJBuQJA>5%-g5Vw*3`h_J0m<_`C;R(e9D8YMrXM7HXr|Xr+JV|C zmmMTr9{Mz2W*e+iJ81`d-NQu4CAnr0G)pN&SG5dex^4&_hVT@qKnoSYh;LQiaUoz% zA&nu$8)y=(X12K0#hF%r?ANI+lrBze{obj6x;5TsuP5M`Q3-=p6|+ZOwU)%RnpUl; zRv&b6Zba0NmaDGS*Ou$RtSe4ht`V)?A$R6<)x;_~&M>38w@+wfVzv}xtY^9yS@b(P zRl0bg)yq0GwZrFHeJnpM^j52Hr6H}Zw7Ss6`F!-|npm7&s~h)|`as#d!2Q+aDMs@P z*N*E!mRe)1r&ufJW>0N8V_m$iLldov8(3e^`Q=))(O4Jj9&jevG5nABAH*AGaSw#^ zT<&H<0Pp8M^jS*LKsqW1Jxt2U4uJG%4#s8xT%}W1^{kYw*6o29uPFcGsvA1RdS8;jgu;duiO=3pRUs0)(3sjii~P zaRjrukR*_qZ_+_Zo+$ZV$xD0vp~^EQm-f0;a%Rt;RXJ7igT0=ct5oIGBHs=2N|kdZ z4JC0{$iUn=>r zs&v4mDqpOe%b8A5&K+c`1 zy=@*dZ8XS-nV=#UG-VitDFaPa88$Vnn9c3_z(>HuCRt5w)m=;3nxS@eUYT1ieZbTF z$bEwLJeM96$uNyEx|;noQ;^UiAqfpqC%eZEDWjqhbgoX{y8M8SS@ZC>*0i3iBL9%9 zy{dI-&2HD)gx(E{1~iVLne>_YA?#Au=c>oDbT!t^-JRb6009600|1FYRhlOU006{S BBk%wK literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/lij-it.bin b/src/Codebelt.Extensions.Globalization/Surrogates/lij-it.bin new file mode 100644 index 0000000000000000000000000000000000000000..e79c8790ab5538532b159ff7682673b7aa22df0f GIT binary patch literal 529 zcmV+s0`C1EiwFP!000003dB>(ZqzUo-B;>Ac!RQl>8P+l-c^mJMIvEDkWiO5lRK$J zVvqcYlpSKlSMUWa_@;gd@@sG&bla7kd+vE$JI+Dl7uMrW$R0GkyddPJ$WgJDgBFsK zEVH#+=#V!czaoD7Y&xW5$E4CbVPp=Yt=g^}G*);5>8V>=bA36CpN_VRl0xtXMu(WL z%Y*$Mv_{D(X_}@X4JnGEAmccW42d}K|Paolcd6J>^)*V6NXcCfHpdW zaXJ$!&<0P1+HZso8!m>BogMtf-_ShG9df4GfG?SC;E?CQBRcq%fxhzDmJr>}%0c^7P}kn*z#MDWP-FWu TUjP6A|NjF3%JOvP(ggqjN?Qop literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/lmo-it.bin b/src/Codebelt.Extensions.Globalization/Surrogates/lmo-it.bin new file mode 100644 index 0000000000000000000000000000000000000000..e79c8790ab5538532b159ff7682673b7aa22df0f GIT binary patch literal 529 zcmV+s0`C1EiwFP!000003dB>(ZqzUo-B;>Ac!RQl>8P+l-c^mJMIvEDkWiO5lRK$J zVvqcYlpSKlSMUWa_@;gd@@sG&bla7kd+vE$JI+Dl7uMrW$R0GkyddPJ$WgJDgBFsK zEVH#+=#V!czaoD7Y&xW5$E4CbVPp=Yt=g^}G*);5>8V>=bA36CpN_VRl0xtXMu(WL z%Y*$Mv_{D(X_}@X4JnGEAmccW42d}K|Paolcd6J>^)*V6NXcCfHpdW zaXJ$!&<0P1+HZso8!m>BogMtf-_ShG9df4GfG?SC;E?CQBRcq%fxhzDmJr>}%0c^7P}kn*z#MDWP-FWu TUjP6A|NjF3%JOvP(ggqjN?Qop literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/prg-pl.bin b/src/Codebelt.Extensions.Globalization/Surrogates/prg-pl.bin new file mode 100644 index 0000000000000000000000000000000000000000..837ba452b41ca8b67a02c6bef539b46f1a0b6007 GIT binary patch literal 537 zcmV+!0_Oc6iwFP!000003dB>vZqzUky;tf#_=0kvS*dVAzEzF3MZ#g#AOXk8W|~@? z*pclNg%d~a+!6P^@C|7Bk$wrXV@FOms<#RC8K)@mqWQdDF0x^J4y zx7~m-s01ZdRaIwX7>0o)EgAzlA=Qd7#u&N2rfo~Lw&FKZ)K>gA!caeJ6q_+A%v}b< zM7nmBr8cuAY@AndCzW~Be8t$xHlO(8W|p#Ow4sD17X65zT!u;D<_OuHAG$5((4ux< zCnW-0!jyC%#>Xe_#z{%n`^OHAM-Jb7k%rQJ-Lh18&%t2zuYBD|v9p5O8$vMry>Ehi zH$FZ?Kn{Divy?Q4eK)?U;GlV^>cAI)uhGFENtOa#q2Pw!<9`m8_ic$PI=9PSDHPiw z!!2*2$#~6;rsPG;ku|N0TL#n6_rq2xn$$D$I(W5IoNzz$6C)nDGnKvXFA%m#TulN8t>?@+B&NH|0U39+2Sx5)^5 zT#d(-yz7!(B3DsUP#{g!1x*%wL%-v$@+D}-W7m(sp4GL_xsP-1cJ>>#kCh)Ag_-i3UuD)wjR8I^vu z4sOWh#Gy&St8(IbitAS`r^fPN5(-(H+Hu`ZK2r0|nP#9ON-ME!OQD~E3N59gs2|iR-LW?f}#57?gXQCtJ ziwnFdGSgDc3KzI4W^Zw$XU`f)+R$fmENh>qQ{YUp3;6%N_2OU%qV!)liG=_@N*oxm zfcg#_Ga1?BWtr>2m@50l$Njp@_QQx(*jM`3p&AY1VI-N1B@4MtdLaizWg7Mk%$UZw z7y34X7y+02$_&-0J1&t8mB)MBmo9d@OrMG{J}=+;Bdbggl3*D6Ho;XJ@7lY|srEv9 zPdF}d`?$he{VA-o1IgvS5{)C=$EZsknUsCk7mE&!$y*=KWH}hs}T*83y|Pu5 zFeNKKIHhZvJd9s*M9`9ws;a6JQW3@&Bf~HZmD zIUoMEaAqqlM~g2Vx4Kpu$0O&A&EqI1PiI-lvdJ+rnpyTEaP1=O4WsC;AGm`RyanSv z$c#t<9&D8KphxAw?oJ1^-u9tL{Ql~ZQKkE$WvSs-aD-~wxZ2M5y#wkofZd%AXua)Y zSrm;b=a0I(&C>n`-C8r!bm&3LwFfu7h|H%rBW&4-O|Zwkd%X?Q`R+azx$ik6weCE~ zvO{q$KnfJM@LyvUU0Z@q9@%-PHOTdl!&hLY{>i(7*iktulLm=Nu?yb@C2-Y|Rk_C3{CqL!3oGdFv5r)e}V9}YG? z*3=vHC(SWq_AFYMXc~z0!{?ul4tIULSy(K}ezE7rM}GhS0RR630LSp*?dSyn0Lw!d A^#A|> literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/tok-001.bin b/src/Codebelt.Extensions.Globalization/Surrogates/tok-001.bin new file mode 100644 index 0000000000000000000000000000000000000000..16fbdd390e4e7fca03d89823ecdff50a8c5c8a26 GIT binary patch literal 533 zcmV+w0_y!AiwFP!000003dB>rZrd;r-UH+vxD*;1*KJ2`K?DUgO2vo_q#aMzMJ6hd z21Ods*0E2~XXrEKNeYrjSF)X~op`#B-_Ma^4i-1E$3mMPEWf^D>{jGB$X0>XhBN4W z?+!Xt4VWjyACIm>&I)M;o5SeQ94uD22NNkv-%I$zv*&Oov})q+!gXCvwrj8!jpD3n zn&yTzOb8*^IF2LR@xJH7z^wJ8uUfU9^g1E!n#s;ZgjRN!!}w1m&^@%C4ZROTS37O& ziRn^^WpWGnnH_og{^U$Dp84)~1QSvmDYN`R5yQEa(Bly9W5FsHSE1v&q38T`0#m14;6E;bcObR2Dsy&enlT3wIKzaq%H6ot0W~R%#XQGG@4B7?I0%YcyL_ z_7aVtH+g3%XETuM;3iBUjP6A|NjF3B_`=E)CB+l;3@<} literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/vec-it.bin b/src/Codebelt.Extensions.Globalization/Surrogates/vec-it.bin new file mode 100644 index 0000000000000000000000000000000000000000..e79c8790ab5538532b159ff7682673b7aa22df0f GIT binary patch literal 529 zcmV+s0`C1EiwFP!000003dB>(ZqzUo-B;>Ac!RQl>8P+l-c^mJMIvEDkWiO5lRK$J zVvqcYlpSKlSMUWa_@;gd@@sG&bla7kd+vE$JI+Dl7uMrW$R0GkyddPJ$WgJDgBFsK zEVH#+=#V!czaoD7Y&xW5$E4CbVPp=Yt=g^}G*);5>8V>=bA36CpN_VRl0xtXMu(WL z%Y*$Mv_{D(X_}@X4JnGEAmccW42d}K|Paolcd6J>^)*V6NXcCfHpdW zaXJ$!&<0P1+HZso8!m>BogMtf-_ShG9df4GfG?SC;E?CQBRcq%fxhzDmJr>}%0c^7P}kn*z#MDWP-FWu TUjP6A|NjF3%JOvP(ggqjN?Qop literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/vmw-mz.bin b/src/Codebelt.Extensions.Globalization/Surrogates/vmw-mz.bin new file mode 100644 index 0000000000000000000000000000000000000000..92aa46259ac615cd0799e854974b694013a9abdf GIT binary patch literal 560 zcmV-00?+*)iwFP!000003d~cnZrd;r-2>zwxD*;1$4I*r+=2*B3RJ351t>b6%(FsQ zBpr%0qD~$A6-6_3%{SD4k}oMpk&0{?LB?zk_wL=jcM?-Dc+CaQlonv<@ev{CS&9v> zBp9VBfm3nnsuxhBWT3wye*a=?q-4f*V^U}xn}Wdt*PuJm)YT&YdFeEi6jrjXduHo8 z4U6Ys3~EUUV~m{;MiPbz$+9f#P}{aGxw@i4(57+XPfAu!{1Rd8-&r&qmMLj&QfQxs zJ&keveCHPHaEszbX|v~Hnq||t((~h;j&jw(p%R+7>Nf=Kt@MI%4nGwAMRO3?_-{2K zOm&_nq`@j6gF2vF3q9g}-(5u8`_jYnvedZYV33W+b6Kf=gZqa4lI`DsZ!KukV=g0Z z@UDm3`x2Pi+vY}KnxoY?h``*82 zH>j{>W4N(~D@jSNBs!||aA;x2jMkm`hlF~8(j1Zn>RH{$<=KJs!*_L(3>z-Bvg-l; z@6V7eT2ZQ+lI&Xg7?8(G4!N%cYaiv3OKy6>RV{{sNM9K2jF1^@u!x)Q|z literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/xnr-in.bin b/src/Codebelt.Extensions.Globalization/Surrogates/xnr-in.bin new file mode 100644 index 0000000000000000000000000000000000000000..72d3f24b72ae402cec546a7e8d9cbf8710a19a0f GIT binary patch literal 644 zcmV-~0(<=*iwFP!000003hY(OYTG~*-3Rgyvng6M4o#QZg$O5wN;P$%bUBW1oT1Vv zj79X)9JYcaHiBw3=1tnO5goU1_zbpsAjWwfb3|ukbwAlW_&zBJ>4)oI9wxwzC{fXh&Vu zH_W`ju4fkfZPmKq3~#LbbiY~1Ob$b2S%sXNApOs$8dC@&mgq+mz?6vuPhVlk61!+qK57C{G3;oOf<77XtWU z5x^l!XdJK+lbKImx?BV!Y8&jd=ABQM0M3tR(-Tt8P`Zbj3bhYZZFWEE=*nhHBF@{HUy{ e&AnD@S-M>7`R2x700030{{sN7MnFbs2LJ#K+cUNR literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/yi-ua.bin b/src/Codebelt.Extensions.Globalization/Surrogates/yi-ua.bin new file mode 100644 index 0000000000000000000000000000000000000000..9394be76410ad641fa6094ab53efa550b1baa1af GIT binary patch literal 658 zcmV;D0&V>tiwFP!000003d~eJZ__{+-YfM#+=4vNP?ZgDs8(AfY^nwc7%%bL^n`t` z&gV+r7#UMgP+Y2zMunzKh@}ij{ENJMe+jzthwhxT0~4G5JnzTzJU*XCCA?%Y>?9(l z(p_I8s@tX!@Q{jE0B;Yn2wbwmL@GU+ zE7qeDx^PTIIc8H~HUHvJ^|-`Ocvx2NWKrZ*Que8oAh=7yFbp?Hh-3UheBbv;p65B) z+jHaCO;gqOJmCY?c7ID&x@!G0YCt{927dIAqji>lspPyb&zzL%g!v9^Lj@VLI=(9dGCe84) z(V%vHt=?4K<>EKa4TVKBMfo(}&YQO(j<6_?O^4tG&eW8KyTWnxJk^z>#_J5fmCuf| z%Ec~lCfNzBa-&jHf3WQe=PmpWe^}u8zj?%w`iizw9ODcpc&c`pu5oB#mHVYyokJT{ zi3C~P17Tca+nEr+`?&{w7SqUM113|KJT|!i22_RC{AEu}c0Wm(#p+%?sGIdt$z z!d((1928Y*ShcWZmey_QD+WX#xLnm%QTO&OsoYxO-nd~Nne?tmvSai5*>Fs{o5#H* za>;A&K)awpjRZ8%NTuuu3viwFP!000003d~b6Z__{&-YfM#+=6ZZlcqp{+fc0(By6Gv2{B&c*Yt#a zSDnw5ymdhe1%^mS9U8G!%7VneP#F0sRh{2~?(DnRahjR!)A!wb-}j#Ve5&9rOQ0uY zLKWHGLg+={L(0aSDj^BFy*@9#PBgzyW8e{$?*Kj=W-$=dV=`4f&9&-N1p_#tvMlRp z&gyTDbPYj);8FRym&LJPS@)?@AUQ#Kp69su{R;Ra>PjjaQi`gVvTwH0fzcT#iYWTsikgDa~2|AHeTYg&6WNj^&n0W7j zN)zL*NnBGf3k+!jsrfh_s)Bmx_WG;>f4*4eQwfU8ODlb=n2$fqw;c{8oHD8)T4`HM z=dN=xoxA25+x~{P7Sp+NF>kEVbl&zdv)0|Zio;bAU&{Kz=IrQA2 z?#>b}UAjvfjMs%b0L~OUh5smIm?cAywZq)cqy#?7eHgKX#y%S}l@hdD*FqRmJ%{_T z8fssptfB6h)76az*)Ua1Wr_(-P$)QPsm!p>uvA)hU2{YrN5Iv(vP#-m*Gk!4Gkxu- z9@gapDYBFL#XZ1vd5|YV5fk*+{OTbMEfLbtFjcTu{D^U;+08NZMOZs1lJlq=;WrC6@9p(5~0c=A*fDo4hwO@4a!>p%UJ+2wJg- zs3f~P2)%S2NLawBj0Hi{$=BIMU*Y>S1nyJu0pQcSGz5ZLOeE5wnPMF(!GjYj%CV-x zD*o+}njy$bxnFj-(lB(4bcad_f)kWwS%znKzp;ypQ6KxbxV*vWkVFwl5;gTE=7E~p zK2dcp?Y6eKF_*^<&1%jqMt#4yyisIlCHyxN-aC$kT+;TNZd2*k?3$ip6lk3V6K(G! zP@!!+l%!q?`haa3L83oS0~wT1EE^7WkT$&T6YoCwVdI*Y+3npAbILICe&4)j<=Lx%-SCIr2( zxi$n;MXdjh&uz97Cv2V7i@da(NG4OsVop#y=Afw3!zRI!S(Dq-PY*;7xZE^msI7Br zF84O1x1QoNn?4Y6dSbuRr`V>wEb7J~L5Hs&=@hhGA@i&2;>To`|JAth_lh4e&SX8- zxbI)vyvG7g5N>FVrDLu7E6E4kEgx)k)UexUD~I@Tg}N*Zp@Q%8Um7;2UCm`;RdgBa W$?ncS00030{{sLVv_Mc*1^@upI3`X2 literal 0 HcmV?d00001 diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/za-cn.bin b/src/Codebelt.Extensions.Globalization/Surrogates/za-cn.bin new file mode 100644 index 0000000000000000000000000000000000000000..1fd5894db6d1ace09f5b0b483fe912c8ab47c6d7 GIT binary patch literal 571 zcmV-B0>u3viwFP!000003d~b6Z__{&-YfM#+=6ZZlcqp{+fc0(By6Gv2{B&c*Yt#a zSDnw5ymdhe1%^mS9U8G!%7VneP#F0sRh{2~?(DnRahjR!)A!wb-}j#Ve5&9rOQ0uY zLKWHGLg+={L(0aSDj^BFy*@9#PBgzyW8e{$?*Kj=W-$=dV=`4f&9&-N1p_#tvMlRp z&gyTDbPYj);8FRym&LJPS@)?@AUQ#Kp69su{R;Ra>PjjaQi`gVvTwH0fzcT#iYWTsikgDa~2|AHeTYg&6WNj^&n0W7j zN)zL*NnBGf3k+!jsrfh_s)Bmx_WG;>f4*4eQwfU8ODlb=n2$fqw;c{8oHD8)T4`HM z=dN=xoxA25+x~{P7Sp+NF>kEVbl&zdv)0|Zio;bAU&{Kz=IrQA2 z?#>b}UAjvfjMs%b0L~OUh5smIm?cAywZq)cqy#?7eHgKX#y%S}l@hdD*FqRmJ%{_T z8fssptfB6h)76az*)Ua1Wr_(-P$)QPsm!p>uvA)hU2{YrN5Iv(vP#-m*Gk!4Gkxu- z9@gapDYBFL#XZ1vd5|YV5fk*+{OTbMEfLbtFjcTu{D^U;+ Date: Sat, 21 Feb 2026 07:56:22 +0100 Subject: [PATCH 07/10] =?UTF-8?q?=F0=9F=90=9B=20refactor=20main=20method?= =?UTF-8?q?=20to=20streamline=20culture=20surrogate=20writing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tooling/gse/Program.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tooling/gse/Program.cs b/tooling/gse/Program.cs index 4c2e517..b4a35e3 100644 --- a/tooling/gse/Program.cs +++ b/tooling/gse/Program.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Linq; using Codebelt.Extensions.Globalization; using Codebelt.Extensions.YamlDotNet.Formatters; using Cuemon.Extensions.IO; @@ -27,14 +28,10 @@ static Program() static void Main(string[] args) { - var regions = World.Regions; - foreach (var region in regions) + var cultureInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures); + foreach (var cultureInfo in cultureInfos) { - var cultureInfos = World.GetCultures(region); - foreach (var cultureInfo in cultureInfos) - { - WriteSurrogate(cultureInfo); - } + WriteSurrogate(cultureInfo); } WriteIcuNamedNlsAlternatives(); From cac26b03b241ec775c7f086c2af851fd2377de10 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 07:57:10 +0100 Subject: [PATCH 08/10] =?UTF-8?q?=F0=9F=9A=A8=20add=20error=20handling=20f?= =?UTF-8?q?or=20missing=20nls=20surrogate=20resources?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CultureInfoExtensions.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Codebelt.Extensions.Globalization/CultureInfoExtensions.cs b/src/Codebelt.Extensions.Globalization/CultureInfoExtensions.cs index 55ea34e..b3b6543 100644 --- a/src/Codebelt.Extensions.Globalization/CultureInfoExtensions.cs +++ b/src/Codebelt.Extensions.Globalization/CultureInfoExtensions.cs @@ -58,6 +58,10 @@ public static IEnumerable UseNationalLanguageSupport(this IEnumerab else { var surrogate = typeof(CultureInfoExtensions).GetEmbeddedResources($"{culture.Name}.bin", ManifestResourceMatch.ContainsName).SingleOrDefault(); + if (surrogate.Value is null) + { + throw new InvalidOperationException($"No NLS surrogate is available for culture '{culture.Name}' ({culture.EnglishName}). Ensure the embedded resource '{culture.Name}.bin' has been generated by the gse tooling and included as an EmbeddedResource in the assembly."); + } var ms = new MemoryStream(surrogate.Value.DecompressGZip().ToByteArray()); var surrogateCulture = YamlFormatter.DeserializeObject(ms, o => { From e89effa08b2148a3bfd5f015b19829c0c5950d2f Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 07:59:38 +0100 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=8D=B1=20add=20new=20surrogate=20fi?= =?UTF-8?q?le=20for=20ca-es-valencia=20culture=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Surrogates/ca-es-valencia.bin | Bin 0 -> 572 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Codebelt.Extensions.Globalization/Surrogates/ca-es-valencia.bin diff --git a/src/Codebelt.Extensions.Globalization/Surrogates/ca-es-valencia.bin b/src/Codebelt.Extensions.Globalization/Surrogates/ca-es-valencia.bin new file mode 100644 index 0000000000000000000000000000000000000000..0c3943121f93551ebdc5bd6210ce309eb4f58d69 GIT binary patch literal 572 zcmV-C0>k|uiwFP!000003ba$Pj?^#^?N7RYaD!5C**%~^?oJo&fkeWJAR)?0Je%{8 z*el0b$=!;IU!b9-L4tqaPxecYojB`UBB(5{%ls3xP=-81N8y%)4Q%lN;X`zdLuiPfU#BEm4L<^_n> zOe%%GPr#hVxB-^hPOh*&Um?GjN>6vM)3x8`*x5SE*kW*(h(@;h5kWZ@WB)vXn~Cm# z88q0sUnwT6a(-gMY7evrr3Vil96V?pxG4&S2M!w9e;Vsjg@Y>;L-P&`HNXbc@9#Z? zpvbEpJ#@l&7al!Q{h)-X>g?!E{K}i(5 z)sr*Lo%Qshuj#4g(t-b*);o-zcty(V8pou^U#>hH^>MBtmZ$qzPcJY200030{{sLx Kwpw^F1^@u2DjGom literal 0 HcmV?d00001 From 7f3edcac9adbcd2cb6b737663a61f02cf7f0a140 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 21 Feb 2026 07:59:45 +0100 Subject: [PATCH 10/10] =?UTF-8?q?=F0=9F=8D=B1=20add=20support=20for=20ca-e?= =?UTF-8?q?s-valencia=20culture=20in=20surrogate=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Codebelt.Extensions.Globalization.csproj | 2 ++ .../CultureInfoExtensionsTest.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj b/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj index 83882ee..d8737d4 100644 --- a/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj +++ b/src/Codebelt.Extensions.Globalization/Codebelt.Extensions.Globalization.csproj @@ -1336,6 +1336,7 @@ + @@ -1365,6 +1366,7 @@ + diff --git a/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs b/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs index 9af95bf..2664ba1 100644 --- a/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs +++ b/test/Codebelt.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs @@ -108,6 +108,7 @@ public void UseNationalLanguageSupport_ShouldHaveDifferentFormattingAsWindowsVar [InlineData("byn-ER")] [InlineData("ca-AD")] [InlineData("ca-ES")] + [InlineData("ca-ES-valencia")] [InlineData("ca-FR")] [InlineData("ca-IT")] [InlineData("ccp-Cakm-BD")] @@ -724,6 +725,7 @@ public void UseNationalLanguageSupport_ShouldSucceed_ForAllSupportedLocales(stri [InlineData("byn-ER")] [InlineData("ca-AD")] [InlineData("ca-ES")] + [InlineData("ca-ES-valencia")] [InlineData("ca-FR")] [InlineData("ca-IT")] [InlineData("ccp-Cakm-BD")]