using System; using System.Collections.Generic; using System.IO; using System.Linq; using GamecraftModdingAPI; using GamecraftModdingAPI.Commands; using GamecraftModdingAPI.Utility; using HarmonyLib; using IllusionPlugin; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using ServiceLayer; namespace Localization { public class LocalizationMod : IEnhancedPlugin { private readonly DirectoryInfo _pluginFolder = new DirectoryInfo(Path.Combine("Plugins", "Localization")); private Dictionary _origStrings; public override void OnApplicationStart() { Main.Init(); if (!_pluginFolder.Exists) _pluginFolder.Create(); string settingsPath = Path.Combine(_pluginFolder.FullName, "settings.json"); JObject settings; if (File.Exists(settingsPath)) { try { using (var stream = new JsonTextReader(File.OpenText(settingsPath))) settings = JObject.Load(stream); string lang = (string) (settings["lang"] ?? (settings["lang"] = "en")); lang = lang.ToLower(); if (lang != "en") LoadTranslation(lang); } catch (Exception e) { Logging.LogError(e); settings = new JObject(); } } else settings = new JObject(); CommandBuilder.Builder("SetLanguage", "Sets the game's language") .Action(lang => { lang = lang.ToLower(); settings["lang"] = lang; using (var stream = new JsonTextWriter(new StreamWriter(File.OpenWrite(settingsPath)))) settings.WriteTo(stream); LoadTranslation(lang); }).Build(); CommandBuilder.Builder("ListLanguages", "Lists available languages") .Action(() => { Logging.CommandLog(new[] {"en"}.Concat(_pluginFolder.EnumerateFiles() .Where(file => file.Extension == ".json" && file.Name.Length < 8) .Select(file => file.Name.Replace(file.Extension, ""))).Distinct() .Aggregate((a, b) => a + ", " + b)); }).Build(); CommandBuilder.Builder("DumpLangStrings", "Dumps the current strings. Set language to en-us first.") .Action(() => { File.WriteAllText(Path.Combine(_pluginFolder.FullName, "dumped.json"), JsonConvert.SerializeObject(_origStrings)); }).Build(); } public override void OnApplicationQuit() { Main.Shutdown(); } private void LoadTranslation(string lang) { Logging.CommandLog("Loading translation for " + lang + "..."); LoadOriginalStrings(); string langPath = Path.Combine(_pluginFolder.FullName, lang + ".json"); if (!File.Exists(langPath)) { if (lang == "en") { AccessTools.Method(typeof(LocalizationService), "Init").Invoke(null, new object[0]); _origStrings = null; //Reset as the object changed LoadOriginalStrings(); Logging.CommandLog("Strings reset to default. (" + _origStrings.Count + " strings in total)"); return; } Logging.CommandLogError("Could not find json file!"); return; } var strings = JsonConvert.DeserializeObject>(File.ReadAllText(langPath)); foreach (var kv in strings) { if (!_origStrings.Remove(kv.Key)) Logging.CommandLogWarning(kv.Key + " wasn't in the original file."); _origStrings.Add(kv.Key, kv.Value); } Logging.CommandLog("Updated " + strings.Count + " strings (" + _origStrings.Count + " strings in total)"); } private void LoadOriginalStrings() { if (_origStrings != null) return; _origStrings = (Dictionary) AccessTools.Field(typeof(LocalizationService), "LocalizedStrings") .GetValue(null); } public override string Name { get; } = "LocalizationMod"; public override string Version { get; } = "1.0.0"; } }