using System; using System.Collections.Generic; using UnityEngine; public static class Localization { public static Dictionary dictionary { get { if (!Localization.localizationHasBeenSet) { Localization.language = PlayerPrefs.GetString("Language", "English"); } return Localization.mDictionary; } set { Localization.localizationHasBeenSet = (value != null); Localization.mDictionary = value; } } public static string[] knownLanguages { get { if (!Localization.localizationHasBeenSet) { Localization.LoadDictionary(PlayerPrefs.GetString("Language", "English")); } return Localization.mLanguages; } } public static string language { get { if (string.IsNullOrEmpty(Localization.mLanguage)) { string[] knownLanguages = Localization.knownLanguages; Localization.mLanguage = PlayerPrefs.GetString("Language", (knownLanguages == null) ? "English" : knownLanguages[0]); Localization.LoadAndSelect(Localization.mLanguage); } return Localization.mLanguage; } set { if (Localization.mLanguage != value) { Localization.mLanguage = value; Localization.LoadAndSelect(value); } } } private static bool LoadDictionary(string value) { byte[] array = null; if (!Localization.localizationHasBeenSet) { if (Localization.loadFunction == null) { TextAsset textAsset = Resources.Load("Localization"); if (textAsset != null) { array = textAsset.bytes; } } else { array = Localization.loadFunction("Localization"); } Localization.localizationHasBeenSet = true; } if (Localization.LoadCSV(array, false)) { return true; } if (string.IsNullOrEmpty(value)) { return false; } if (Localization.loadFunction == null) { TextAsset textAsset2 = Resources.Load(value); if (textAsset2 != null) { array = textAsset2.bytes; } } else { array = Localization.loadFunction(value); } if (array != null) { Localization.Set(value, array); return true; } return false; } private static bool LoadAndSelect(string value) { if (!string.IsNullOrEmpty(value)) { if (Localization.mDictionary.Count == 0 && !Localization.LoadDictionary(value)) { return false; } if (Localization.SelectLanguage(value)) { return true; } } if (Localization.mOldDictionary.Count > 0) { return true; } Localization.mOldDictionary.Clear(); Localization.mDictionary.Clear(); if (string.IsNullOrEmpty(value)) { PlayerPrefs.DeleteKey("Language"); } return false; } public static void Load(TextAsset asset) { ByteReader byteReader = new ByteReader(asset); Localization.Set(asset.name, byteReader.ReadDictionary()); } public static void Set(string languageName, byte[] bytes) { ByteReader byteReader = new ByteReader(bytes); Localization.Set(languageName, byteReader.ReadDictionary()); } public static bool LoadCSV(TextAsset asset, bool merge = false) { return Localization.LoadCSV(asset.bytes, asset, merge); } public static bool LoadCSV(byte[] bytes, bool merge = false) { return Localization.LoadCSV(bytes, null, merge); } private static bool LoadCSV(byte[] bytes, TextAsset asset, bool merge = false) { if (bytes == null) { return false; } ByteReader byteReader = new ByteReader(bytes); BetterList betterList = byteReader.ReadCSV(); if (betterList.size < 2) { return false; } if (!merge || betterList.size - 1 != Localization.mLanguage.Length) { merge = false; Localization.mDictionary.Clear(); } betterList[0] = "KEY"; Localization.mLanguages = new string[betterList.size - 1]; for (int i = 0; i < Localization.mLanguages.Length; i++) { Localization.mLanguages[i] = betterList[i + 1]; } while (betterList != null) { Localization.AddCSV(betterList, !merge); betterList = byteReader.ReadCSV(); } return true; } private static bool SelectLanguage(string language) { Localization.mLanguageIndex = -1; if (Localization.mDictionary.Count == 0) { return false; } string[] array; if (Localization.mDictionary.TryGetValue("KEY", out array)) { for (int i = 0; i < array.Length; i++) { if (array[i] == language) { Localization.mOldDictionary.Clear(); Localization.mLanguageIndex = i; Localization.mLanguage = language; PlayerPrefs.SetString("Language", Localization.mLanguage); UIRoot.Broadcast("OnLocalize"); return true; } } } return false; } private static void AddCSV(BetterList values, bool warnOnDuplicate = true) { if (values.size < 2) { return; } string text = values[0]; if (string.IsNullOrEmpty(text)) { return; } string[] array = new string[values.size - 1]; for (int i = 1; i < values.size; i++) { array[i - 1] = values[i]; } if (Localization.mDictionary.ContainsKey(text)) { Localization.mDictionary[text] = array; if (warnOnDuplicate) { Debug.LogWarning("Localization key '" + text + "' is already present"); } } else { try { Localization.mDictionary.Add(text, array); } catch (Exception ex) { Debug.LogError("Unable to add '" + text + "' to the Localization dictionary.\n" + ex.Message); } } } public static void Set(string languageName, Dictionary dictionary) { Localization.mLanguage = languageName; PlayerPrefs.SetString("Language", Localization.mLanguage); Localization.mOldDictionary = dictionary; Localization.localizationHasBeenSet = false; Localization.mLanguageIndex = -1; Localization.mLanguages = new string[] { languageName }; UIRoot.Broadcast("OnLocalize"); } public static string Get(string key) { if (!Localization.localizationHasBeenSet) { Localization.language = PlayerPrefs.GetString("Language", "English"); } string[] array; string result; if (Localization.mLanguageIndex != -1 && Localization.mDictionary.TryGetValue(key, out array)) { if (Localization.mLanguageIndex < array.Length) { return array[Localization.mLanguageIndex]; } } else if (Localization.mOldDictionary.TryGetValue(key, out result)) { return result; } return key; } public static string Format(string key, params object[] parameters) { return string.Format(Localization.Get(key), parameters); } [Obsolete("Localization is now always active. You no longer need to check this property.")] public static bool isActive { get { return true; } } [Obsolete("Use Localization.Get instead")] public static string Localize(string key) { return Localization.Get(key); } public static bool Exists(string key) { if (!Localization.localizationHasBeenSet) { Localization.language = PlayerPrefs.GetString("Language", "English"); } return Localization.mDictionary.ContainsKey(key) || Localization.mOldDictionary.ContainsKey(key); } public static Localization.LoadFunction loadFunction; public static bool localizationHasBeenSet = false; private static string[] mLanguages = null; private static Dictionary mOldDictionary = new Dictionary(); private static Dictionary mDictionary = new Dictionary(); private static int mLanguageIndex = -1; private static string mLanguage; public delegate byte[] LoadFunction(string path); }