diff --git a/NHSE.Core/Strings/GameStrings.cs b/NHSE.Core/Strings/GameStrings.cs index 5b720b7..85d6468 100644 --- a/NHSE.Core/Strings/GameStrings.cs +++ b/NHSE.Core/Strings/GameStrings.cs @@ -11,6 +11,7 @@ public sealed class GameStrings public readonly string[] itemlistdisplay; public readonly Dictionary VillagerMap; public readonly List ItemDataSource; + public readonly Dictionary InternalNameTranslation = new Dictionary(); private string[] Get(string ident) => GameLanguage.GetStrings(ident, lang); diff --git a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs index 1e2a795..1a7419d 100644 --- a/NHSE.Core/Structures/Records/LifeSupportAchievement.cs +++ b/NHSE.Core/Structures/Records/LifeSupportAchievement.cs @@ -20,7 +20,7 @@ public LifeSupportAchievement(short land, short player, ushort index, string nam private const string Unknown = "???"; - private static readonly IReadOnlyDictionary Dictionary = new Dictionary + public static readonly IReadOnlyDictionary Dictionary = new Dictionary { {0x001, new LifeSupportAchievement( 3, -1, 0001, "CatchFish" )}, // サカナを釣った {0x002, new LifeSupportAchievement( 3, -1, 0002, "CatchInsect" )}, // ムシを捕まえた diff --git a/NHSE.WinForms/Util/DevUtil.cs b/NHSE.WinForms/Util/DevUtil.cs index 5a45ca6..ac325b0 100644 --- a/NHSE.WinForms/Util/DevUtil.cs +++ b/NHSE.WinForms/Util/DevUtil.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; @@ -25,6 +26,7 @@ public static void UpdateAll() IsUpdatingTranslations = true; DumpStringsMessage(); UpdateTranslations(); + UpdateInternalNameTranslations(); IsUpdatingTranslations = false; } @@ -91,12 +93,46 @@ private static void LoadSpecialForms() nameof(SettingsEditor), }; + private static void UpdateInternalNameTranslations() + { + var langs = new[] { DefaultLanguage }.Concat(Languages); + var available = new[] + { + LifeSupportAchievement.Dictionary.Values.Select(z => z.Name), + EventFlagPlayer.List.Values.Select(z => z.Name), + EventFlagLand.List.Values.Select(z => z.Name), + EventFlagVillager.List.Values.Select(z => z.Name), + }.SelectMany(z => z); + + var translatables = new HashSet(available); + foreach (var lang in langs) + { + var str = GameInfo.GetStrings(lang); + var dict = str.InternalNameTranslation; + + var oldKeys = dict + .Where(kvp => translatables.Contains(kvp.Key)); + var newKeys = translatables + .Where(key => !dict.ContainsKey(key)) + .Select(z => new KeyValuePair(z, z)); + + var allKeys = oldKeys.Concat(newKeys); + + var newDict = allKeys.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + + var result = newDict.Select(z => $"{z.Key}={z.Value}"); + var dir = GetResourcePath(); + var location = GetFileLocationInText("internal", dir, lang); + File.WriteAllLines(location, result); + } + } + private static void DumpStringsMessage() => DumpStrings(typeof(MessageStrings)); private static void DumpStrings(Type t) { - var dir = GetResourcePath(); var langs = new[] { DefaultLanguage }.Concat(Languages); + var dir = GetResourcePath(); foreach (var lang in langs) { TranslationUtil.SetLocalization(t, lang); diff --git a/NHSE.WinForms/Util/TranslationUtil.cs b/NHSE.WinForms/Util/TranslationUtil.cs index b33c7f3..e013683 100644 --- a/NHSE.WinForms/Util/TranslationUtil.cs +++ b/NHSE.WinForms/Util/TranslationUtil.cs @@ -84,6 +84,25 @@ private static void SetLocalization(Type t, IReadOnlyCollection lines) } } + /// + /// Applies localization to a static class containing language-specific strings. + /// + /// Dictionary of translatable strings + /// Lines containing the localized strings + private static void SetLocalization(IDictionary dict, IReadOnlyCollection lines) + { + if (lines.Count == 0) + return; + foreach (var line in lines) + { + var index = line.IndexOf(TranslationSplitter); + if (index < 0) + continue; + var prop = line.Substring(0, index); + dict[prop] = line.Substring(index + 1); + } + } + /// /// Applies localization to a static class containing language-specific strings. /// @@ -105,5 +124,11 @@ public static void SetLocalization(Type t, string currentCultureCode) { SetLocalization(t, t.Name, currentCultureCode); } + + public static void SetLocalization(IDictionary dict, string currentCultureCode) + { + var lines = ResourceUtil.GetStringList($"internal_{currentCultureCode}"); + SetLocalization(dict, lines); + } } }