From 503a9b9d71df32e46ccb562bea4d7c1aed6ef402 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 21 Mar 2017 21:40:33 -0700 Subject: [PATCH] Finish legality string translation feature Same " = " separator as the main form translation, uses the cache style in GameStrings to only load once. Closes #959, feel free to discuss there. --- PKHeX.WinForms/MainWindow/Main.cs | 4 +++ PKHeX/Game/GameInfo.cs | 29 ++++++++------- PKHeX/Legality/CheckStrings.cs | 46 ++++++++++++++---------- PKHeX/PKHeX.Core.csproj | 1 + PKHeX/Properties/Resources.Designer.cs | 9 +++++ PKHeX/Properties/Resources.resx | 3 ++ PKHeX/Resources/text/en/legality_en.txt | Bin 0 -> 18714 bytes PKHeX/Util/ReflectUtil.cs | 3 ++ 8 files changed, 65 insertions(+), 30 deletions(-) create mode 100644 PKHeX/Resources/text/en/legality_en.txt diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 5b349bdce..1f00d092b 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -1414,6 +1414,10 @@ private void InitializeStrings() string l = curlanguage; GameInfo.Strings = GameInfo.getStrings(l); + // Update Legality Strings + // Clipboard.SetText(string.Join(Environment.NewLine, CheckStrings.getLocalization())); + new Thread(() => { CheckStrings.setLocalization(GameInfo.getCheckStrings(l)); }).Start(); + // Force an update to the met locations origintrack = GameVersion.Unknown; diff --git a/PKHeX/Game/GameInfo.cs b/PKHeX/Game/GameInfo.cs index 0150e2a19..92162416e 100644 --- a/PKHeX/Game/GameInfo.cs +++ b/PKHeX/Game/GameInfo.cs @@ -9,28 +9,33 @@ public static class GameInfo private static readonly string[] ptransp = { "ポケシフター", "Poké Transfer", "Poké Fret", "Pokétrasporto", "Poképorter", "Pokétransfer", "포케시프터", "宝可传送", "寶可傳送", "ポケシフター" }; public static readonly string[] lang_val = { "ja", "en", "fr", "it", "de", "es", "ko", "zh", "zh2", "pt" }; private const string DefaultLanguage = "en"; + private const string LegalityName = "legality_"; private static readonly GameStrings[] Languages = new GameStrings[lang_val.Length]; + private static readonly string[][] CheckStrings = new string[lang_val.Length][]; // Lazy fetch implementation - public static GameStrings getStrings(string lang) + private static int DefaultLanguageIndex => Array.IndexOf(lang_val, DefaultLanguage); + private static int getLanguageIndex(string lang) { int l = Array.IndexOf(lang_val, lang); - if (l < 0) - l = 1; - return getIndex(l); + return l < 0 ? DefaultLanguageIndex : l; } - private static GameStrings getIndex(int index) + public static GameStrings getStrings(string lang) { + int index = getLanguageIndex(lang); return Languages[index] ?? (Languages[index] = new GameStrings(lang_val[index])); } - - private static string getTransporterName(string Language) + public static IEnumerable getCheckStrings(string lang) { - int lang = Array.IndexOf(lang_val, Language); - if (lang < 0 || lang >= ptransp.Length) - lang = Array.IndexOf(lang_val, DefaultLanguage); - - return ptransp[lang < 0 ? 1 : lang]; + int index = getLanguageIndex(lang); + return CheckStrings[index] ?? (CheckStrings[index] = Util.getStringList(LegalityName + lang_val[index])); + } + private static string getTransporterName(string lang) + { + int index = getLanguageIndex(lang); + if (index >= ptransp.Length) + index = DefaultLanguageIndex; + return ptransp[index]; } // String providing diff --git a/PKHeX/Legality/CheckStrings.cs b/PKHeX/Legality/CheckStrings.cs index 0e18bdd51..43320f82f 100644 --- a/PKHeX/Legality/CheckStrings.cs +++ b/PKHeX/Legality/CheckStrings.cs @@ -9,13 +9,27 @@ namespace PKHeX.Core { public static class CheckStrings { - public const string splitter = " = "; - public static void RefreshStrings(IEnumerable lines) + private const string splitter = " = "; + private static readonly Type t = typeof(CheckStrings); + private static string[] getProps(IEnumerable input) { - var t = typeof (CheckStrings); + return input.Select(l => l.Substring(0, l.IndexOf(splitter, StringComparison.Ordinal))).ToArray(); + } + private static IEnumerable DumpStrings() + { + var props = ReflectUtil.getPropertiesStartWithPrefix(t, "V"); + return props.Select(p => $"{p}{splitter}{ReflectUtil.GetValue(t, p).ToString()}"); + } + + public static void setLocalization(IEnumerable lines) + { + if (lines == null) + return; foreach (var line in lines.Where(l => l != null)) { var index = line.IndexOf(splitter, StringComparison.Ordinal); + if (index < 0) + continue; var prop = line.Substring(0, index); var value = line.Substring(index + splitter.Length); @@ -29,24 +43,20 @@ public static void RefreshStrings(IEnumerable lines) } } } - public static IEnumerable DumpStrings() + public static string[] getLocalization(string[] existingLines = null) { - var t = typeof (CheckStrings); - var props = ReflectUtil.getPropertiesStartWithPrefix(t, "V"); - return props.Select(p => $"{p}{splitter}{ReflectUtil.GetValue(t, p).ToString()}"); - } - public static string[] UpdateLocalization(string[] lines) - { - List list = new List(); - var current = DumpStrings(); - foreach (var line in current) + existingLines = existingLines ?? new string[0]; + var currentLines = DumpStrings().ToArray(); + var existing = getProps(existingLines); + var current = getProps(currentLines); + + var result = new string[currentLines.Length]; + for (int i = 0; i < current.Length; i++) { - int index = line.IndexOf(splitter, StringComparison.Ordinal); - string prop = line.Substring(0, index); - string match = lines.FirstOrDefault(l => l.StartsWith(prop)); - list.Add(match ?? line); + int index = Array.IndexOf(existing, current[i]); + result[i] = index < 0 ? currentLines[i] : existingLines[index]; } - return list.ToArray(); + return result; } #region General Strings diff --git a/PKHeX/PKHeX.Core.csproj b/PKHeX/PKHeX.Core.csproj index 75bab202c..cc6212915 100644 --- a/PKHeX/PKHeX.Core.csproj +++ b/PKHeX/PKHeX.Core.csproj @@ -3523,6 +3523,7 @@ +