diff --git a/CommonAPI/Systems/LocalizationModule/LocalizationModule.cs b/CommonAPI/Systems/LocalizationModule/LocalizationModule.cs index 4ace7a4..8c8d3bd 100644 --- a/CommonAPI/Systems/LocalizationModule/LocalizationModule.cs +++ b/CommonAPI/Systems/LocalizationModule/LocalizationModule.cs @@ -70,7 +70,7 @@ public static void RegisterFontForLanguageFromBundle(int languageId, string asse var languageData = GetOrCreateExtraData(languageId); languageData.customFont = fonts[0]; } - + /// /// Get language id by it's abbreviation /// @@ -95,7 +95,7 @@ public static int GetLanguageId(string abbreviation) return language.lcId; } - + /// /// Load mod translations from path. This path should point to your mod plugin folder, and have the following structure: /// @@ -124,7 +124,7 @@ public static void LoadTranslationsFromFolder(string path) { string directoryName = Path.GetFileName(directory); int languageId = GetLanguageId(directoryName); - + if (languageId == 0) { CommonAPIPlugin.logger.LogWarning($"Failed to load translations from folder: {directoryName}: not a valid language"); @@ -132,7 +132,7 @@ public static void LoadTranslationsFromFolder(string path) } var subFiles = Directory.EnumerateFiles(directory).ToList(); - + subFiles.Sort((path1, path2) => { var file1 = Path.GetFileNameWithoutExtension(path1); @@ -147,7 +147,7 @@ public static void LoadTranslationsFromFolder(string path) foreach (string file in subFiles) { if (!File.Exists(file)) continue; - + try { var streamReader = new StreamReader(file, true); @@ -175,7 +175,7 @@ public static void LoadTranslationsFromFolder(string path) CommonAPIPlugin.logger.LogWarning($"Failed to load translations from '{path}': found no language subdirectories!"); return; } - + if (failCount == 0) { CommonAPIPlugin.logger.LogInfo($"Successfully loaded translations from '{path}'"); @@ -201,10 +201,10 @@ public static void LoadTranslationsFromString(string data, string languageAbbr) CommonAPIPlugin.logger.LogWarning($"Failed to interpret '{languageAbbr}' as a language!"); return; } - + LoadTranslationsFromString(data, languageId); } - + /// /// Load localizations from string data. Use this to load localizations from asset bundles or other locations. /// This method uses format identical to @@ -216,7 +216,7 @@ public static void LoadTranslationsFromString(string data, int languageId) Instance.ThrowIfNotLoaded(); var lines = data.Split(separators, StringSplitOptions.None); int failCount = 0; - + foreach (string line in lines) { if (!LoadTranslationFromLine(line, languageId, false)) @@ -239,17 +239,8 @@ public static void LoadTranslationsFromString(string data, int languageId) /// /// Translation key /// English translation - public static void RegisterTranslation(string key, string enTrans) - { - Instance.ThrowIfNotLoaded(); - var english = GetOrCreateExtraData(Localization.LCID_ENUS); - - if (!english.modStrings.ContainsKey(key)) - english.modStrings[key] = enTrans; - else - { - CommonAPIPlugin.logger.LogWarning("Trying to override translations via RegisterTranslation, this is not supported. Use EditTranslation"); - } + public static void RegisterTranslation(string key, string enTrans) { + RegisterTranslation(key, enTrans, null, null); } /// @@ -263,13 +254,21 @@ public static void RegisterTranslation(string key, string enTrans) public static void RegisterTranslation(string key, string enTrans, string cnTrans, string frTrans) { Instance.ThrowIfNotLoaded(); + if (string.IsNullOrEmpty(key)) + { + CommonAPIPlugin.logger.LogWarning($"Trying to register translation null or empty string via RegisterTranslation, this is not supported."); + return; + } + + if (enTrans == null) + enTrans = key; var english = GetOrCreateExtraData(Localization.LCID_ENUS); if (!english.modStrings.ContainsKey(key)) english.modStrings[key] = enTrans; else CommonAPIPlugin.logger.LogWarning($"Trying to override translation '{key}' via RegisterTranslation, this is not supported. Use EditTranslation"); - - if (!string.IsNullOrEmpty(cnTrans)) + + if (cnTrans != null) { var chinese = GetOrCreateExtraData(Localization.LCID_ZHCN); @@ -278,9 +277,8 @@ public static void RegisterTranslation(string key, string enTrans, string cnTran else CommonAPIPlugin.logger.LogWarning($"Trying to override translation '{key}' via RegisterTranslation, this is not supported. Use EditTranslation"); } - - if (!string.IsNullOrEmpty(frTrans)) + if (frTrans != null) { var french = GetOrCreateExtraData(Localization.LCID_FRFR); @@ -288,7 +286,6 @@ public static void RegisterTranslation(string key, string enTrans, string cnTran french.modStrings[key] = frTrans; else CommonAPIPlugin.logger.LogWarning($"Trying to override translation '{key}' via RegisterTranslation, this is not supported. Use EditTranslation"); - } } @@ -301,6 +298,12 @@ public static void RegisterTranslation(string key, string enTrans, string cnTran public static void RegisterTranslation(string key, Dictionary translations) { Instance.ThrowIfNotLoaded(); + if (string.IsNullOrEmpty(key)) + { + CommonAPIPlugin.logger.LogWarning($"Trying to register translation null or empty string via RegisterTranslation, this is not supported."); + return; + } + foreach (KeyValuePair pair in translations) { int languageId = GetLanguageId(pair.Key); @@ -310,13 +313,21 @@ public static void RegisterTranslation(string key, Dictionary tr continue; } + string trans = pair.Value; + if (trans == null) + { + if (languageId == Localization.LCID_ENUS) + trans = key; + else + continue; + } + var languageData = GetOrCreateExtraData(languageId); if (!languageData.modStrings.ContainsKey(key)) - languageData.modStrings[key] = pair.Value; + languageData.modStrings[key] = trans; else CommonAPIPlugin.logger.LogWarning($"Trying to override translation '{key}' via RegisterTranslation, this is not supported. Use EditTranslation"); - } } @@ -327,7 +338,7 @@ public static void RegisterTranslation(string key, Dictionary tr /// English translation public static void EditTranslation(string key, string enTrans) { - EditTranslation(key, enTrans, "", ""); + EditTranslation(key, enTrans, null, null); } /// @@ -340,15 +351,24 @@ public static void EditTranslation(string key, string enTrans) public static void EditTranslation(string key, string enTrans, string cnTrans, string frTrans) { Instance.ThrowIfNotLoaded(); + if (string.IsNullOrEmpty(key)) + { + CommonAPIPlugin.logger.LogWarning($"Trying to edit translation null or empty string via EditTranslation, this is not supported."); + return; + } + + if (enTrans == null) + enTrans = key; var english = GetOrCreateExtraData(Localization.LCID_ENUS); english.stringsToEdit[key] = enTrans; - if (!string.IsNullOrEmpty(cnTrans)) + + if (cnTrans != null) { var chinese = GetOrCreateExtraData(Localization.LCID_ZHCN); chinese.stringsToEdit[key] = cnTrans; } - if (!string.IsNullOrEmpty(frTrans)) + if (frTrans != null) { var french = GetOrCreateExtraData(Localization.LCID_FRFR); french.stringsToEdit[key] = frTrans; @@ -363,6 +383,11 @@ public static void EditTranslation(string key, string enTrans, string cnTrans, s public static void EditTranslation(string key, Dictionary translations) { Instance.ThrowIfNotLoaded(); + if (string.IsNullOrEmpty(key)) { + CommonAPIPlugin.logger.LogWarning($"Trying to edit translation null or empty string via EditTranslation, this is not supported."); + return; + } + foreach (KeyValuePair pair in translations) { int languageId = GetLanguageId(pair.Key); @@ -372,26 +397,35 @@ public static void EditTranslation(string key, Dictionary transl continue; } + string trans = pair.Value; + if (trans == null) + { + if (languageId == Localization.LCID_ENUS) + trans = key; + else + continue; + } + var languageData = GetOrCreateExtraData(languageId); - languageData.modStrings[key] = pair.Value; + languageData.modStrings[key] = trans; } } - + #endregion #region PrivateImplementation private static string[] separators = { "\r\n", "\r", "\n" }; - + internal static LocalizationModule Instance => CommonAPIPlugin.GetModuleInstance(); internal const int FIRST_MOD_LANGUAGE_ID = 50000; internal static Registry languageRegistry = new Registry(FIRST_MOD_LANGUAGE_ID, true); - + internal static Dictionary modLanguages = new Dictionary(); internal static Dictionary extraDataEntires = new Dictionary(); - + private static readonly Dictionary _textReferences = new Dictionary(); private static readonly Dictionary fileOrder = new Dictionary(); @@ -405,7 +439,7 @@ internal override void SetHooks() internal override void Load() { Localization.OnLanguageChange += RefreshAllTextElements; - + //TODO too lazy to read the file right now fileOrder["base"] = 0; fileOrder["combat"] = 0; @@ -469,7 +503,7 @@ private static bool LoadTranslationFromLine(string line, int languageId, bool al } var strings = GetOrCreateExtraData(languageId); - + if (!strings.modStrings.ContainsKey(key)) strings.modStrings[key] = translation; else @@ -484,13 +518,13 @@ private static bool LoadTranslationFromLine(string line, int languageId, bool al return true; } - + internal static TextDefaultFont Get(Text text) { _textReferences.TryGetValue(text, out var value); return value; } - + internal static void Add(Text text) { var find = Get(text); @@ -499,14 +533,14 @@ internal static void Add(Text text) _textReferences.Add(text, new TextDefaultFont(text)); } } - + internal static void Remove(Text text) { var find = Get(text); if (find != null) { _textReferences.Remove(text); - } + } } public static void RefreshAllTextElements()