private void loadLocaleIntern(string localeId, bool setLocale, string prefix, string packagePrefix) { KlyteUtils.doLog($"{GetType()} localeId: {localeId}"); string load = Singleton <R> .instance.loadResourceString("UI.i18n." + localeId + ".properties"); if (load == null) { KlyteUtils.doLog("File UI.i18n." + localeId + ".properties not found. Probably this translation doesn't exists for this mod."); load = ""; } var locale = KlyteUtils.GetPrivateField <Locale>(LocaleManager.instance, "m_Locale"); Locale.Key k; foreach (var myString in load.Split(lineSeparator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) { if (myString.StartsWith(commentChar)) { continue; } if (!myString.Contains(kvSeparator)) { continue; } bool noPrefix = myString.StartsWith(ignorePrefixChar); var array = myString.Split(kvSeparator.ToCharArray(), 2); string value = array[1]; int idx = 0; string localeKey = null; if (array[0].Contains(idxSeparator)) { var arrayIdx = array[0].Split(idxSeparator.ToCharArray()); if (!int.TryParse(arrayIdx[1], out idx)) { continue; } array[0] = arrayIdx[0]; } if (array[0].Contains(localeKeySeparator)) { array = array[0].Split(localeKeySeparator.ToCharArray()); localeKey = array[1]; } k = new Locale.Key() { m_Identifier = noPrefix ? array[0].Substring(1) : prefix + array[0], m_Key = localeKey, m_Index = idx }; if (!locale.Exists(k)) { locale.AddLocalizedString(k, value.Replace("\\n", "\n")); } } if (localeId != "en") { loadLocaleIntern("en", false, prefix, packagePrefix); } if (setLocale) { language = localeId; } }