From b5342a82e1235c8ff576c8d512f79698c89aa549 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:02:56 -0800 Subject: [PATCH] fix: Fixes language casing and adds localization reset command (#1703) --- Projects/Server/Localization/Localization.cs | 12 ++++++++++- .../UOContent/Commands/ResetLocalization.cs | 20 ++++++++++++++++++ docs/commands/commands.7z | Bin 12426 -> 12496 bytes 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 Projects/UOContent/Commands/ResetLocalization.cs diff --git a/Projects/Server/Localization/Localization.cs b/Projects/Server/Localization/Localization.cs index ea0ef5bd8..f5440cb23 100644 --- a/Projects/Server/Localization/Localization.cs +++ b/Projects/Server/Localization/Localization.cs @@ -28,7 +28,7 @@ public static class Localization public const string FallbackLanguage = "enu"; private static Dictionary _fallbackEntries; - private static Dictionary> _localizations = new(); + private static readonly Dictionary> _localizations = new(); public static void Configure() { @@ -44,6 +44,7 @@ public static class Localization public static void Add(string lang, int number, string text) { + lang = lang.ToLower(); var entry = new LocalizationEntry(lang, number, text); if (!_localizations.TryGetValue(lang, out var entries)) { @@ -60,6 +61,7 @@ public static class Localization public static bool Remove(string lang, int number) { + lang = lang.ToLower(); if (!_localizations.TryGetValue(lang, out var entries) || !entries.Remove(number)) { return false; @@ -73,11 +75,18 @@ public static class Localization return true; } + public static void Clear() + { + _localizations.Clear(); + _fallbackEntries = null; + } + public static Dictionary LoadClilocs(string lang) => LoadClilocs(lang, Core.FindDataFile($"cliloc.{lang}", false)); private static Dictionary LoadClilocs(string lang, string file) { + lang = lang.ToLower(); Dictionary entries = _localizations[lang] = new Dictionary(); if (lang == FallbackLanguage) { @@ -145,6 +154,7 @@ public static class Localization /// True if the entry exists, otherwise false. public static bool TryGetLocalization(string lang, int number, out LocalizationEntry entry) { + lang = lang.ToLower(); if (lang != FallbackLanguage) { if (!_localizations.TryGetValue(lang, out var entries)) diff --git a/Projects/UOContent/Commands/ResetLocalization.cs b/Projects/UOContent/Commands/ResetLocalization.cs new file mode 100644 index 000000000..1d567d48c --- /dev/null +++ b/Projects/UOContent/Commands/ResetLocalization.cs @@ -0,0 +1,20 @@ +namespace Server.Commands; + +public static class ResetLocalization +{ + public static void Configure() + { + CommandSystem.Register("ResetLocalization", AccessLevel.Developer, ResetLocalization_OnCommand); + } + + [Usage("ResetLocalization []")] + [Aliases("ResetLoc")] + [Description( + "Clears the localization table. Cliloc will be reloaded the next time they are used for that language." + )] + private static void ResetLocalization_OnCommand(CommandEventArgs e) + { + Localization.Clear(); + e.Mobile.SendMessage("Localization table cleared."); + } +} diff --git a/docs/commands/commands.7z b/docs/commands/commands.7z index a7067618d8f04dc727b5e6135391918814752566..cf5b93cc621317f80e0f1e7993abe45441dd46f8 100644 GIT binary patch delta 9304 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 G0001E6%0rK delta 9233 zcmV+sB<|bLVTxfTH+sCUCma9-?^FoN2rvKu00000VgLXD00000`?8Bq;f>cY0I?;V z41dYmT)cbztU9u-w-H?{qP_@&xfjBGs|?MGq@FmX1o(S}(vZa!)4uC068qEzsCm9v zH%)Z*B|03UW;_jbwyj~AocTYN!Ugpdgd8;TTDjcduh_(vZhB{73If0s$cU%7XFts% z;VE1bl@+ka2&ul?ltRRL2Cfep#U(O6n19J!P67#6Mbktrtit#lx6-t@NM*s(2iRh$ zd4@T8fE>;9^dc0Fd(~*?8(N3*M9hSWBuPZU5w;jgX}RTsSqax0$WF#dl}$KnP+T60 zYjC|L)JVa~H=<@tf@PGaB6&0y8(n}3v%Eh}80G!=} z!C`5NDKVrJY61>%^&A}x@&>%78X?J{(3xCe^g!xsI1u9ldejfQ(j=nN84HF&4Qv}6Y!TfHw?ZJ72!1lH8b7ln@(kxsE%Fnfq>`C zJmLK5_c9&(x-ZZbf4{-%P^?2(xHSJO;!aotYKpaZNZ&tjzDpg(sHS|AG-HQHb&rv3eWo21F2M~s(H;wg{dx*FN#BZ1G z^^B7$`q!u!($RP4AJ41qw112uY*eyIpd}>P?!aCsMF2bpx~_I|W}2=HRxL%n8t4)n zcJPC{9gncvj~pr>AuQ?|4{Htu9)fI9jqe`N`>5UaI=<<5k%=a+qJ*Xk#nBfy&V*$R zwG0PA+h`QwYC-dly!qq%7X@a^#%?Piw|~o~K%H~Ruvx!>LOd0r$A8Mg$cv+#;k%wx zfYGxn?OhAwmN2apL$E5fAIbOfA4j9+G3~D>a87*S90O3|oX^q!6l`grz;cC6&1gmM zJsJI8^(m36>)b*QbOWjv@$2&%NA}bImk!D=V*jm-{PT0oN2ZvWQXNy+{8h;WD>Fne z2XdYBg5&Qdt7xo727l&=p?54lSmgGocZM`D{&r?|lU4MUN`$P@qY7pCf7Zp~LzkN_ ziB1kQ(^|Nzxn466aKWAbO{$(|N4sY|$PW1anePcaJnjH>#I}}EI@fwELaStnA+Gce z6TXI7nD@a=%mbiZ7RY_|&u@RenT}PUJ2q*Q&>t-hi*6W(^M4;~61UE|TN5m~!ugf4 z)snOkU5g(`gaDEY@6+AgH zbsqWq_`;RYhyk(ppi`U}OV@5Gx!xxI=5DI>gM|M9OqOXh6X5)MDLR)^I#V3{3ETs* zp4%m9?1B5@CX%PwZR_lP*!&hvk^xuYX+V?r+1Auooqv#FnE`S^+Bm#{Ro6UVgS99l zN;bQaCFO#VO#W%5S<*KVT5E{%mb!ox_|vg@9!F_T0@voZDvJ>`6z8D$oN{8V^`1d5(} zLXq_uDSxpq)y5HQGY*Nh@><0Yj>F0@Y!FMupm)>9W-XN#Qtcr>?ukRTV2FSw1VB$8 z--6W+ouC?}6RVS2!V06IfPQXs0Gu#(3Cm}JdL_pTjobuhxr9-2$Pc{P?JEq-pL9{o^408hNJ{LHP8%Y>YU-hZr|oz2wO^qvfmfBH`a?|JB^0mW_r z7=t2ZM@J$FTrb3WYKNepr~Z=y#uv!jwtk=Rcd7b&g~gyfTM*`L@mvPr)>nE@Bbp

q25c?Y3A&{Od}yt})z@(G2pU$Op-6_zHP zd4JNB1;&?#{WJNmj!H-ZCG#aL&LXyx#yABCDMzJF=@*5K4X@P+)!mX6|TKI2*m3Sx6Tz<>d`j z8sSeQZ9;MS54s~zrD-EK=wEi_}i;0XA# zYr2)V&|71j7q!ucfKFEMd{j{4_8d9)WRs{_>UBj8Dkdll;C8=_bj*>QPOC&%vVZZS zvqb#F(%SC56ydf`iY{_FkjA)2in6BnUIA}wyL$#unaKwZbP1n&m5wAziOh7GIZ+0I zu3ML;b?eJP;3kX=S;Q-Tl8i9?>7ThA+IxX1+#u2)14g)Xnehv{t@fCu^oP(<$+lfc z)Tp-M8n(-Hb$(86k+^kdvwmQi? zfPKj`DxGg{K<|~qLoh$m5>>0XrvxcDTK!zMNjy$S9#|uYAQ|7W^lU#GOyhkVcrhAYHB~SZ;xD7PJY5B;wDs$me%>`(Ai)YbaIxno3xjxl4)NvBz3U za|w~c3FlbeS}k#3NXGkXbbm11+^7VFUGBSe^d$gM?d|1-^xc$@x7;gVm!^$Pqy8}9 zSq;B$1_$U>Yh&ci5Rk-om9;k*gS&QckzXm8qwCC{gB$xlk1&;l;-b*e}6TJmUqOqw1N{c zTPF@>@1qAH5abR06n$Y$Z=FhRK{fgQ>z#bl{bOXYksv~ccADxnFKsNJd-A~olkjErD zkBsv$u*JO7I>iYS;F|}?FEb^VqWN)aGJYdKrLtYE?=Re)HVE~eRo?$d*f7}yLqdcn zU%9Lv7n=R@B6V~fmq)B8D@Xe-@Nee66YvA8H`=M|12xrRy>>!dFq(Sqhk5?7 z!3tU|MHD&RQo^=EltxSe9()N-cd5#V-oV9=4@1*rp^)yAEP`vGPx`gB-Yi+T)a?68 z6$}%p^e1L7L4Wj>7fDz6WpRY*V&fii^r=|i3me-=9Q&C-z$DxnQVC4lyHs%;R=9{X zq9{$=*jM{&=B7qniR(S#MS^^!zZE{MDpk3NA&8cycCBQU2aDM0wY**jdqiMGY{z#J zbFwb??8smC;BfG9@4~UwgOXYB&Jmjw0UGAFd($4wy?;>mec)Iw<~2=!@j;{;L?Njy z2s&r3tvhU@YzEY2^l$Zhnxx)cb2HIsEkZN2*6X^2toaI4VDvx^v0FCZZ=fq1iXBa{9{Jw9!5U)%CsV^( z?+nbx(Z;J4sCQiNoyg>F;mjjn>4vGOs5!jF!rpAcs${nCtQx;Wo;FRbJXHA%CUqY` z_v+hf_&HrG6QWdXYRx_g%TDvHZEkN{F`0 zm!p0zJ?pc#pyoWyjG2KSq~5ie!9|R58S>|`?bu!FsBxNsyFfa6y|N?fSRV9O#2Tay ztABmuURUHKadlJFE7lruACU-XiQrV+fm2em3cJJYdK|@}P#XO2Urq!gx#FZol+R0X z&A(pw?hLp8l>bD+k)kCXywiRmY;iC1*u2ZLq0bRYpDyEy+%k@jTZGSXQ&i@lrdM03 zIxx~)UfysdE*ux_j;8JAAz&TQEb)UJFn@)rTp*08LAHu+X1R4{lkqAc!@(}~{47d* zDjGh>a#5s`)^;1K{3NPgl+NqT^-9SjPZ^}@98K)a0Ocg3$c)EKw(IkIzX~Ww;>h}C z-Pk>e9odRha&6w`9rj954M@(&d;fG)QoDbE%vQgG-BcsrseQ*xyF-LIzP1e#V1If3 zy9NS-w+wpf_PDdIv(YwbhPr>UV#72Hg83sl%lV`oC$yWiwg(8D0Z)G{W4HD2aBN2O z>@m@oPDdK6Vc%pzX$=Xfn{G6d>4QrmX}Q zGM-OXW%pWV3M3}DRKA(7XRt7R%Mfk)<+<(w#{#Tk#2)B?m4KU0qZJRB(mw@*Mn6glMp1jmkqLeL>H?gD2{ z2mxmEszXgMGIHUuH;}w;4u6O6I6pLQL@{cFGDI~QXpt9+6A=|9oeKHN5O6(~;g1pD z4Nf1M^w%@H1f^xUhAYX}f%SATUSlnmAQ>Wtf;D4SbmH@Ju{tnln ziX&-?=yQ&$@Ctnyj-4x-?)*X2mV`;di{ejma3JbM90z3?Dy~HyZ?$N_0tUiYQ z2rdY3R77X}Nq}k4D9_?fQV^d&NX_FW=H0Tr^Zaxech*isnTG|ceK$qa;0cjY3O zFlmraebOrAQVPSPReyKLFuLYp0qK+IRhQ~emBqrc!et<+9e)C+&J&0x#j?D+5VZnp zVklt!HLT0&tg(}jcCCbhAW%XeAs%WCJTiP~YcqJ+J!Vqs+>ns zfdiP!2Xu>4ejeBL18xNsp0P>GUw(s!^AoPWI*-cqy_P zHa}C?nh;%}`grX$L~_geVRZ?K?S#P$9IiRz3r@r(kckFMUdF^>0Jqc(<0OB)nAu^= zDN6siy#|!!j(@C?ciycJsr}p2NKAku&^B&7++xame>Y6=qDdM*PfU57<&M*!^nCbb z3L-Mk8jOK={lnyU+(l2Lsak<<=1;}{_k)KVU@%D2UB*Gmu$#CT`&@`JW)(sRw_oCf zwJe<497S~co8S1p>OqoBYb?*y)Q9$;XU#8{t;jO8;o+y&|f`7dtBu2Wfj0D=uCJIA``ed(i5oVF@^tDj_0L zP=aJQb+~#;Sv$0XI>%do zfwd+3A#z4&IJ>}G{c>Xf@!rHZtGB9=`|YhfGI8MF`$9PDw(sav*5E#ZJkLT8&rk)G zD1VYR_tflVBxq!NLEUwnoJxV}8+8R%vx>F+X4#GY)Owb^Hiq|!#PkPKhtKg1y~Xtn z3Y^_-@KmkIku1^ZNvOO1gL|55ysyM8qzsUDGEC|Q6&%3z<2g^Ab~+0>JP}d`QB&VB zuotRZY5<^0R0bPKoy?;xW5u9~$bG;N@_$QBT}1WJ%?9JScJq#~!c~~#SfSMBhTl`l zt4YUDd?C}DQyrHkH%qN__(5#m1-17%hyft9UqCF`6np@+&M`HSbFeH*#=&!g4Fk(j z-imVX1&8FBK>h#R(+|n1B8mNZcBV*=Sh(_k`}kWO**&7N%;$T(jou`|z=r?a*Nfj@_R@7EXzmb7!muW6@aWxTPq!dooE z&V6aBaJ;_m13;}c@)lKZqNko{T7N_K4p^4E6-{48YDY;M(33pX&5tBi*J5;~#^4zz zH=CQ!*6VR+so%G>;bRaZu)Qc5xQy?ta}Wn>ma_C$O$ZuBm_Zt<>)$O_4amk;FLW*jvcpnqkcqTQakuLw+7 zwA{ajLs(D+P+eG~?23(#!Dtemk5ImH!NCU7)jjw$F#OtGM}ntM_CMbQjT+c^)@flN zx<}ImEp2?T11|w?p{(UKf@o>lp|C%e}=RmV=kdw2ce-PA=2Fz3%0BOP^bgV;^ za9_@ir763?65gM5(SJzY+`N^BBv$ynhQ79E1bkDN(%?Y?3Sy%Hg z^#NiSkADkM#@ySRCL(H;n=AL#D3db;YeEkOHw<2yp^*HM=xPxb(9rOl&l;u^ZnoV#NlST;i3 zf#pqIzBGHfIi{VJXIZmqc-47 zVgg^9tYH)7e$E1I;45haSPqxP`d6^6uIRZ-4YC&4Gb!D`*rQLhz0ii51b|a;n%`Q&rEa zE^yMG$3e&Nwhv9rQ2VTpb+xf*>C3>uHWek4n#HiFwZYCybO`?ac&%KY3+GsAa7V}2 zm7?Z(QQ3w6ONcKIp!&X#qbz@|KEyt1^09vcP=GLW(f%+&T6Tepm&_~(ziQpWy%&zJ%{fcSe%DSr=;TNekqeKmzd-8B ze%k^lGcBk0laC+1_g^%WUKeO+ds>B0JHb91_yA=rcRStyOf)TPvVt)zzMc1SH0KgSe;)N^0sOx7bS!*bt}1EZmMPX zwT9zu4>WyQb{I>V9OUv?%3>v$jmsAH!kg*@)~;2)o$7v~I=`y^Q2gTWZ+|F2nI3F? z(JvqtkkhzN2Xr|f3J)WwWv_=h)dPo6Pu;XuUtKsyGiST4ai|oLjUZLN7`s_!QKv8> z_PT;zXu+jn<>>Eawh2bPuuS@DVA~9H_W~^o+NuG$BSo>9iP)Egg^+dcq47hSLbRpP zdfl9w;Urk%D8jHa*V#rTD1Y1qzW|qk2KZ6xCk%dDf=jv+D3;!`#;Aa7JXcI|d}~$z zRi43Mn(|}9R-QMRgon?DRQnI1Drd6*x9VG~53#1MKJ&QFidF})yjfOR$=iItOg(cI){ zT*J2=XK*c8ISp)DuYVRdNm3NPo27DYj2XbA)KekNxgwJlC3+@wkkX?l7C86vY9g`p z{=NP#S!Ex8iNTO+S0y<(Dr%eNwDsSD)nJt)CIii+5+yh>5_g+V8GG>mvIL($h(xq& zCmBLbw;_AjF3CAwifsIy|4FGufl>GxKT=RMv{j%)xX&Frn}0KtSJk4!K%etp+6?3p zD#ep6YR$8D>!59a!E{?zrgD^OXzb)B@clTX(&+6}T$&)VALv!#I=gZO3{ZYI+i3u_ zag115SdTZJyn_u&j{6HJ2cxfkqCjZyX)4GpUzru_*)m=>f)@m)D-YuIAYjms2p!|d zG=J5f;*!HCPk+8zqA+y2#|o|fr#$=oXlXGv;ZUJ|xrI@3eDD}ThTjanHYO1CFT>jR zxnnsd#UnsaCKL4Um1tDc%;IM@cU0}UE=70P(e zE2r3m_HrUSM8U5Kc~h2DnsZL9JJo=$*y^|fKl=XJtLFCu$!sr7^_;p$%dt*+vK5e( z7g%v-SH_=Vv3kzW9i%~Xl5ywCNN{Im;b3EKMS6VW`!e|sUz$~aP1!v0n959i@_#I zwhkrU3dfEwwYJ(+`kS9H!ms2Qw>YRax3jsbe}D3Sx0hco$k@csrOoAyam>B0f}XZY z$Z3V-bv9uUnU-Q;$Y)WqD@t04mtxR!eQMTpaY=SHu!lPxPP~b@NvQtolxn8$+DGnI zNzOv!{eu{D&J9|fP^TaC@+Trqe+_sx@#OveXRq_-zx70Gs}%xXDI}u@CX0l!qbska z;D3p3EO>{U72fNpEiiw-?KF(H@xe;|Jy!Pu787EH>+KK*fL-lUh7jX6V07Uufgo?n zTt0nA>lIWw7q?2`w5`KCR^Nhhs#=4Ex+jD%AoFqXj~Z6gO*WO{nEYzoa@Qh~)(-1oUT> zkIUF%jyJS~T?CW%DS9!wB3`O@8du=3=jwosX2D;FaKBX6HyYQP=k$$|oeEHO_u(^b z-oJ(4{E)V+5hEDrs+T+wh_#fygV$_+$|%9zy;r&=vk_aZ;oKyyF-;W7&sFvogMTH0 z{&TLt+RWhGKtU#zadzAY;&bZ`4hSRIR-^xPlMCT{K5YdF6+cK{SUu2I>AFl5T-bP6 zm4_r0cu1wyP8+1P`t2L0(o^!TpJu1%sGvo?E@Cq=gD;n8odYxE3l33YG7obY`F|;R zm3)Vk)EC+!`CEwdG%saimSra#!he{HGaVhBtS%>a1e}jTTN6XuH&yx0*&6%DIMQCn zGQ3X*vgrHNbIa##L(@PfoQD&Amavi_*>>-w>!{9u^&_V4j>=srB(SAngKsUvuY;cz zJU9-Pp?~h==KhyNANq_KT|5NV98=w*0xoncj|o&y5?JK6v|=nT-jz~kGk>D-6*?ma z^TC5>MEkA%{3-)LxdfiuJ7(H|G?xGT1kU3FgmsZmSycQ*7r=`0n>b?j`stQ_4Go6{ zM{Z8V((SIjDm0cnyT!M+5!`AI>R1=H>9O*{n5Xk&(&q7#y6uF#if57T zGWox6gbL0NDK5E1x}uy9?l@W@3GBo^{y~q+au>Fvt}FZln~uGSa!Xb=yU;HU4hiqQ z=