using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace NBC { public class LanguageManager { private string _currentCustomLanguageName = string.Empty; private SystemLanguage _currentLanguage; private Dictionary _lanModuleDic = new Dictionary(); /// /// 变化通知事件 /// private Action _changeAction; public void AddLanguageModule(int type, ILanguage languageModule) { _lanModuleDic.Add(type, languageModule); } public ILanguage GetLanguageModule(int type) { return _lanModuleDic.GetValueOrDefault(type); } public string GetCurrentCustomLanguageName() { return _currentCustomLanguageName; } public SystemLanguage GetCurrentLanguage() { return _currentLanguage; } public void AutoUseLanguage() { SystemLanguage language = Application.systemLanguage; if (PlayerPrefs.HasKey(LanguageConst.LanguageSaveKey)) { var value = PlayerPrefs.GetInt(LanguageConst.LanguageSaveKey, -1); if (value >= 0) { language = (SystemLanguage)value; } } var list = LanguageConst.languageMap.Values.ToList(); var findLan = list.FindIndex(t => t.Language == language); if (findLan < 0) { language = SystemLanguage.English; } UseLanguage(language); } public void UseLanguage(SystemLanguage language) { _currentLanguage = language; if (LanguageConst.languageMap.TryGetValue(language, out var info)) { _currentCustomLanguageName = info.Code; } foreach (var value in _lanModuleDic.Values) { value.UseLanguage(language); } _changeAction?.Invoke(); } public void AddLanguage(SystemLanguage language, bool isDefault = false) { foreach (var pair in _lanModuleDic) { pair.Value.AddLanguage(language); } if (isDefault) { UseLanguage(language); } } public void OnChange(Action callback) { _changeAction += callback; } public void OffChange(Action callback) { _changeAction -= callback; } } }