From 0bbba81fca3dca5d84b5f800a3496cbf4c9a1b45 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 3 Jun 2024 23:32:45 -0500 Subject: [PATCH] Update 24.06.03 Stream translation text when loading. No need to allocate a few thousand strings and an array. --- Directory.Build.props | 2 +- .../Resources/legality/mgdb/wc7full.pkl | Bin 627984 -> 627984 bytes PKHeX.Core/Resources/legality/mgdb/wc9.pkl | Bin 113208 -> 112496 bytes .../legality/wild/encounter_go_home.pkl | Bin 132056 -> 133516 bytes .../legality/wild/encounter_go_lgpe.pkl | Bin 28784 -> 29108 bytes PKHeX.Core/Util/ResourceUtil.cs | 6 +++--- PKHeX.WinForms/Resources/text/changelog.txt | 19 ++++++++++++++++- PKHeX.WinForms/Util/WinFormsTranslator.cs | 20 +++++++++--------- 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index e0616d5e6..e64c2a02e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 24.05.05 + 24.06.03 12 enable en diff --git a/PKHeX.Core/Resources/legality/mgdb/wc7full.pkl b/PKHeX.Core/Resources/legality/mgdb/wc7full.pkl index 248b650e6729a3ddd1a891eb55f30b3ec365038b..3b5af26168cc7bd65329a5af371b464d9f55c68d 100644 GIT binary patch delta 131 zcmbQRN^Qa_wT2eP7N!>F7M3lnMS@IEK20wXWDS_OfrTlMaeAT_tH}0yf~-rJm=?X8 z-Xa2)m>j_*(f&b%6^Plke-L30;$!-Bf4Yk@J6M-CRM$FXcA&2CZPP>4P$b&-sj&kw L$M$_{oI!a2z?>{0 delta 139 zcmbQRN^Qa_wT2eP7N!>F7M3lnMS@K1i>H?evIel3&Sqi=WSpL;#VWG>o*?TICMGWT z=`A8anXVa33_1{*_IDzzK+LxNod|mfAJdr?(_NI=1K19hGBIdF^{!K92kJdLZF-0r XP{wyAT&8`W8aohkY~QEG8I%VAJ}fCB diff --git a/PKHeX.Core/Resources/legality/mgdb/wc9.pkl b/PKHeX.Core/Resources/legality/mgdb/wc9.pkl index 2bf6f306bbe44018e648523ba168db58d4e452d6..652ecaf8f6005e26a49f5365dfa1f6c8c3f21cd9 100644 GIT binary patch delta 53 zcmdn-h3&&Tw#^Y7KW=Q~IKi|z;Gu)q<{7L&)`agB!rM1&VLZXKor9b4M(^eeOhD#? I8H^{S0nzvwjsO4v delta 395 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 DoM%OG delta 5379 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 diff --git a/PKHeX.Core/Resources/legality/wild/encounter_go_lgpe.pkl b/PKHeX.Core/Resources/legality/wild/encounter_go_lgpe.pkl index 9af64a6ac190f6113c2cd72e60a844940d629690..f0b0010fa012e6392c16d4c979b242a2566fa7a9 100644 GIT binary patch delta 1318 zcmZY7Pi&KQ9LMp`(?09dK7D{OJNG!sR&c@HwVsL5#FIP9>)Vm$b+MB9bKD|wz@ zzrXLlr%NU4_I)e=>BS#)GbDWciYlwD8eVDU`UlEc0{puiBWo zNYe7EDI~M(Ovf4`WoIJ_=9b%Nmg*L3u9*2qin|JjF z3p;j6+&N`Uk^0}#lz#_L^ZHFiz#OpgUr#()~bTROxJg|TkYBOotRuT!dPX5 zJKeptF~i*xUiAud_$SX;H331cXFTLqn+W_8FqHWRffFuZ7mAHK4 zrQW!t`)=u$Elp%0TS|KvbEOwv>5fmD^h^FcX)newi^_RYKSq#5$9$<5Nu*GdFAXDq zfz(pK{6eWbAdMr9;36e7vWORSESBPhBne7W=v^YUEtTwL1Vbpq8Vn$bmgOWys7Q)p z7~vJtC<4Vagy2f)3))L4c9ql(h54Zyk2eK=5sR>>j7rgq{Izs~VWiMr zPLUN-BSz7`jxQ-EJmb8 z8ic=A+5&qAMPUv-J4t}aIttuH63n1^kJPo7V)s!XhB1fY{ahKIVq-lyFcakj5778Q zDe<&{N*XBu<9iLsf@=s7~Lqa;7ZRkTQ-5I;^gtpq~w1RcZ(bdsw%#rtXYVj@m~ zXQU73IHfk?!+)MQc#qIUP6o+#RVjUmiObvvrZCb$Cszo7u}(U?N>N=@jmOtn*KJ)Fg>^NAO4V;8JUp01Nau7COB&)iNjZvUJ7&{pC#zdOHKjpkbC%|{1|oPn+~cb?BZ X?dh{}>?sdV&c_?CEYowdhTVSwRKD61 diff --git a/PKHeX.Core/Util/ResourceUtil.cs b/PKHeX.Core/Util/ResourceUtil.cs index 7043ef83f..329190908 100644 --- a/PKHeX.Core/Util/ResourceUtil.cs +++ b/PKHeX.Core/Util/ResourceUtil.cs @@ -155,6 +155,8 @@ public static string[] GetStringList(string fileName) if (IsStringListCached(fileName, out var result)) return result; var txt = GetStringResource(fileName); // Fetch File, \n to list. + if (txt is null) + return []; return LoadStringList(fileName, txt); } @@ -168,10 +170,8 @@ public static bool IsStringListCached(string fileName, [NotNullWhen(true)] out s /// Loads a text into the program with a value of . /// /// Caches the result array for future fetches. - public static string[] LoadStringList(string file, string? txt) + private static string[] LoadStringList(string file, string txt) { - if (txt == null) - return []; string[] raw = FastSplit(txt); // Make sure only one thread can write to the cache diff --git a/PKHeX.WinForms/Resources/text/changelog.txt b/PKHeX.WinForms/Resources/text/changelog.txt index 75ca63d29..4bbf4452e 100644 --- a/PKHeX.WinForms/Resources/text/changelog.txt +++ b/PKHeX.WinForms/Resources/text/changelog.txt @@ -1,7 +1,24 @@ PKHeX - By Kaphotics http://projectpokemon.org/pkhex/ -24/05/05 - New Update: +24/06/03 - New Update: + - Legality: Added automatic (basic) Trash Byte checks for Switch-era (Gen7b+) files. Further refinement & expansion in the future. + - - Fixed: Mystery gifts distributed with nicknames no longer flag IsNicknamed as invalid. + - Added: Entity editor move dropdown now displays the move's type on the left side. + - Added: Entire boxes can be dragged & dropped. Must enable via setting as it is not intuitive. Drag from the Box tab rectangle. + - Added: Report grid can now specify extra properties to show, as well as properties to hide. Change via settings. + - Added: Gen1-3 save file language/version detection updated for more edge cases. + - Added: Gen2-5 localization text files added for less popular languages. Thanks @abcboy101 ! + - Added: Gen3 GBA<->GC string conversion logic to handle special text entry. Thanks @abcboy101 ! + - Added: Gen4 Seal/Accessory/Backdrop editors. Thanks @abcboy101 ! + - Added: Gen5 Geonet/Unity Tower can now edit country/region data. Thanks @abcboy101 ! + - Fixed: Gen6/7 entities now save the volatile status effect rather than wiping it (see previous release notes). + - Fixed: Gen3-7 Nidoran/Farfetch'd text char quirks updated to better align with GameFreak's mess. + - Fixed: Gen1/2 quirks with box data have been rewritten and resolved. + - Changed: Gen1-3 emulator save formats that store RTC data are now detected more reliably. + - Changed: More performance improvements as always! Additionally, translations can now handle Enum localization. + +24/05/05 - New Update: (101440) [8778313] - Legality: Added Regulation G. - Added: Entity editor can now modify battle-Status effects (Burn, Paralyze, etc). Click the bottom right corner of the window for the GUI. - Added: Gen5 trainer records can now be edited via Misc editor. Not documented well, but exposes the values for editing. diff --git a/PKHeX.WinForms/Util/WinFormsTranslator.cs b/PKHeX.WinForms/Util/WinFormsTranslator.cs index da5291f4b..c8f6d4b7a 100644 --- a/PKHeX.WinForms/Util/WinFormsTranslator.cs +++ b/PKHeX.WinForms/Util/WinFormsTranslator.cs @@ -108,21 +108,19 @@ private static void TranslateControl(object c, TranslationContext context, ReadO } } - private static ReadOnlySpan GetTranslationFile(ReadOnlySpan lang) + private static ReadOnlySpan GetTranslationFile(ReadOnlySpan lang) { var file = GetTranslationFileNameInternal(lang); // Check to see if the desired translation file exists in the same folder as the executable string externalLangPath = GetTranslationFileNameExternal(file); if (File.Exists(externalLangPath)) { - try { return File.ReadAllLines(externalLangPath); } + try { return File.ReadAllText(externalLangPath); } catch { /* In use? Just return the internal resource. */ } } - if (Util.IsStringListCached(file, out var result)) - return result; var txt = (string?)Properties.Resources.ResourceManager.GetObject(file); - return Util.LoadStringList(file, txt); + return txt ?? ""; } private static IEnumerable GetTranslatableControls(Control f) @@ -320,9 +318,10 @@ public sealed class TranslationContext public void Clear() => Translation.Clear(); - public TranslationContext(ReadOnlySpan content, char separator = Separator) + public TranslationContext(ReadOnlySpan content, char separator = Separator) { - foreach (var line in content) + var iterator = content.EnumerateLines(); + foreach (var line in iterator) LoadLine(line, separator); } @@ -352,18 +351,19 @@ public IEnumerable Write(char separator = Separator) return Translation.Select(z => $"{z.Key}{separator}{z.Value}").OrderBy(z => z.Contains('.')).ThenBy(z => z); } - public void UpdateFrom(ReadOnlySpan lines) + public void UpdateFrom(ReadOnlySpan text) { + var lines = text.EnumerateLines(); foreach (var line in lines) { var split = line.IndexOf(Separator); if (split < 0) continue; - var key = line[..split]; + var key = line[..split].ToString(); ref var exist = ref CollectionsMarshal.GetValueRefOrNullRef(Translation, key); if (!Unsafe.IsNullRef(ref exist)) - exist = line[(split + 1)..]; + exist = line[(split + 1)..].ToString(); } }