From 49d75638c90e158c6f5083f8de2b10234444c310 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 28 Apr 2021 16:46:52 -0400 Subject: [PATCH] feat: merge resources into main assembly --- Peeping Tom/FodyWeavers.xml | 2 +- Peeping Tom/Peeping Tom.csproj | 14 ++++++++++ Peeping Tom/Plugin.cs | 11 ++++++++ Peeping Tom/Util.cs | 48 +++++++++++++++++++++++++++++++++- 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/Peeping Tom/FodyWeavers.xml b/Peeping Tom/FodyWeavers.xml index 792e185..0e5b339 100644 --- a/Peeping Tom/FodyWeavers.xml +++ b/Peeping Tom/FodyWeavers.xml @@ -1,5 +1,5 @@  - + diff --git a/Peeping Tom/Peeping Tom.csproj b/Peeping Tom/Peeping Tom.csproj index 220487f..b6389da 100755 --- a/Peeping Tom/Peeping Tom.csproj +++ b/Peeping Tom/Peeping Tom.csproj @@ -46,6 +46,7 @@ + @@ -57,4 +58,17 @@ Language.resx + + + + + + + diff --git a/Peeping Tom/Plugin.cs b/Peeping Tom/Plugin.cs index c50579b..19fb919 100644 --- a/Peeping Tom/Plugin.cs +++ b/Peeping Tom/Plugin.cs @@ -2,7 +2,9 @@ using Dalamud.Plugin; using System; using System.Collections.Generic; +using System.Globalization; using Lumina.Excel.GeneratedSheets; +using PeepingTom.Resources; using XivCommon; namespace PeepingTom { @@ -26,6 +28,10 @@ namespace PeepingTom { this.Watcher = new TargetWatcher(this); this.Ui = new PluginUi(this); + Util.PreLoadResourcesFromMainAssembly("PeepingTom.Resources.Language."); + OnLanguageChange(this.Interface.UiLanguage); + this.Interface.OnLanguageChanged += OnLanguageChange; + this.Interface.CommandManager.AddHandler("/ppeepingtom", new CommandInfo(this.OnCommand) { HelpMessage = "Use with no arguments to show the list. Use with \"c\" or \"config\" to show the config", }); @@ -59,6 +65,11 @@ namespace PeepingTom { this.Interface.CommandManager.RemoveHandler("/ptom"); this.Interface.CommandManager.RemoveHandler("/ppeep"); this.Ui.Dispose(); + this.Interface.OnLanguageChanged -= OnLanguageChange; + } + + private static void OnLanguageChange(string langCode) { + Language.Culture = new CultureInfo(langCode); } private void OnTerritoryChange(object sender, ushort e) { diff --git a/Peeping Tom/Util.cs b/Peeping Tom/Util.cs index b605366..833f0e0 100644 --- a/Peeping Tom/Util.cs +++ b/Peeping Tom/Util.cs @@ -1,4 +1,50 @@ -namespace PeepingTom { +using System; +using System.Collections; +using System.Globalization; +using System.Reflection; + +namespace PeepingTom { + internal static class Util { + internal static void PreLoadResourcesFromMainAssembly(string resourcesPrefix, string resourcesExtension = ".resources") { + // get loaded resource sets from resource manager + var resourceManager = Resources.Language.ResourceManager; + + if (( + resourceManager.GetType().GetField("_resourceSets", BindingFlags.Instance | BindingFlags.NonPublic) ?? + // ReSharper disable once PossibleNullReferenceException + resourceManager.GetType().GetField("ResourceSets", BindingFlags.Instance | BindingFlags.NonPublic) + ).GetValue(resourceManager) is not IDictionary resourceSetByCulture) { + return; + } + + var resourceAssembly = typeof(PeepingTomPlugin).Assembly; // get assembly with localization resources + foreach (var embeddedResourceName in resourceAssembly.GetManifestResourceNames()) { + if (embeddedResourceName.StartsWith(resourcesPrefix, StringComparison.Ordinal) == false || + embeddedResourceName.EndsWith(resourcesExtension, StringComparison.Ordinal) == false) { + continue; // not localized resource + } + + var locale = embeddedResourceName.Substring(resourcesPrefix.Length, Math.Max(0, embeddedResourceName.Length - resourcesPrefix.Length - resourcesExtension.Length)); + if (string.IsNullOrEmpty(locale)) { + continue; // default locale + } + + var resourceStream = resourceAssembly.GetManifestResourceStream(embeddedResourceName); + if (resourceStream == null) { + continue; // no resource stream + } + + var resourceSet = new System.Resources.ResourceSet(resourceStream); + var culture = CultureInfo.GetCultureInfo(locale); + if (resourceSetByCulture is Hashtable) { + resourceSetByCulture.Add(culture, resourceSet); + } else { + resourceSetByCulture.Add(culture.Name, resourceSet); + } + } + } + } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1716:Identifiers should not match keywords")] public class Optional where T : class { public bool Present { get; }