// *********************************************************************** // Assembly : Unity // Author : Kimch // Created : // // Last Modified By : Kimch // Last Modified On : // *********************************************************************** // // // *********************************************************************** namespace G { using System.Collections; using System.Collections.Generic; using F; using UnityEngine; internal class LanguageProxy : GameProxy { #region Property public LanguageEntry defaultLanguage { get; private set; } public LanguageEntry currentLanguage { get; private set; } public LanguageEntry[] allLanguages { get; private set; } public SystemLanguage systemLanguage { get { return Application.systemLanguage; } } public override int priority { get { return 998; } } #endregion #region Method public LanguageEntry GetLanguage(string name) { if (allLanguages != null) { return System.Array.Find(allLanguages, l => l.name == name); } return null; } public void SetLanguage(string name) { currentLanguage = GetLanguage(name); if (currentLanguage == null) { currentLanguage = defaultLanguage; } PlayerPrefs.SetString("language", currentLanguage.name); PlayerPrefs.Save(); } private void Load(IDictionary table) { var langList = table.GetList("language"); if (langList != null && langList.Count > 0) { var languages = new LanguageEntry[langList.Count - 1]; var tmpL0 = (IList)langList[0]; int nameIndex = tmpL0.IndexOf("name"); int iconIndex = tmpL0.IndexOf("icon"); int dataIndex = tmpL0.IndexOf("data"); int mainIndex = tmpL0.IndexOf("main"); for (int i = 1; i < langList.Count; i++) { var tmpLi = (IList)langList[i]; var language = new LanguageEntry { name = tmpLi.GetString(nameIndex), iconName = tmpLi.GetString(iconIndex), database = tmpLi.GetString(dataIndex), }; var keySegment = tmpLi.GetIntArray(mainIndex); if (keySegment != null && keySegment.Length >= 2) { language.keyRangeMin = keySegment[0]; language.keyRangeMax = keySegment[1]; defaultLanguage = language; defaultLanguage.SetAsDefault(); } language.LoadEntries(table.GetList(language.database)); languages[i - 1] = language; } allLanguages = languages; } } private void ApplyLanguage() { var languageName = PlayerPrefs.GetString("language", string.Empty); if (string.IsNullOrEmpty(languageName)) { var systemLanguage = Application.systemLanguage; switch (systemLanguage) { case SystemLanguage.ChineseSimplified: currentLanguage = GetLanguage("ChineseSimplified"); PlayerPrefs.SetString("language", "ChineseSimplified"); PlayerPrefs.Save(); break; default: currentLanguage = GetLanguage("ChineseSimplified"); PlayerPrefs.SetString("language", "ChineseSimplified"); PlayerPrefs.Save(); break; } if (currentLanguage == null) { currentLanguage = defaultLanguage; } } else { currentLanguage = GetLanguage(languageName); if (currentLanguage == null) { currentLanguage = defaultLanguage; } } } /// /// Ĭ�ϴ���Id /// /// /// public int GetStringId(string entry) { if (defaultLanguage != null) { defaultLanguage.TryGetId(entry, out int id); return id; } return 0; } /// /// 用默认语言翻译本地语言 /// /// /// public string GetLocalString(int id) { if (currentLanguage != null) { currentLanguage.TryGet(id, out string entry); return entry; } return string.Empty; } /// /// 用默认语言翻译本地语言 /// /// /// public string GetTranslateString(string entry) { if (defaultLanguage == null || currentLanguage == null || currentLanguage == defaultLanguage) { return entry; } if (defaultLanguage.TryGetId(entry, out int id)) { currentLanguage.TryGet(id, out string retEntry); return retEntry; } return entry; } #endregion #region Unity public static LanguageProxy Instance { get; private set; } public LanguageProxy() { Instance = this; } public void LoadBytes(byte[] bytes) { var table = bytes.ToJsonTable(); if (table != null) { Load(table); } ApplyLanguage(); } //// Use this for initialization //public async override Task LoadAsync() //{ // TextAsset textAsset = await AssetProxy.Instance.GetConfigAssetAsync("language"); // if (textAsset) // { // var table = textAsset.bytes.ToJsonTable(); // if (table != null) // { // Load(table); // } // AssetProxy.Instance.ReleaseAsset(textAsset); // } // ApplyLanguage(); //} #endregion } }