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; }