//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 Jiang Yin. All rights reserved. // Homepage: https://gameframework.cn/ // Feedback: mailto:ellan@gameframework.cn //------------------------------------------------------------ using GameFramework.Resource; using System; using System.Collections.Generic; namespace GameFramework.Localization { /// /// 本地化管理器。 /// internal sealed partial class LocalizationManager : GameFrameworkModule, ILocalizationManager { private readonly Dictionary m_Dictionary; private readonly DataProvider m_DataProvider; private ILocalizationHelper m_LocalizationHelper; private Language m_Language; /// /// 初始化本地化管理器的新实例。 /// public LocalizationManager() { m_Dictionary = new Dictionary(StringComparer.Ordinal); m_DataProvider = new DataProvider(this); m_LocalizationHelper = null; m_Language = Language.Unspecified; } /// /// 获取或设置本地化语言。 /// public Language Language { get { return m_Language; } set { if (value == Language.Unspecified) { throw new GameFrameworkException("Language is invalid."); } m_Language = value; } } /// /// 获取系统语言。 /// public Language SystemLanguage { get { if (m_LocalizationHelper == null) { throw new GameFrameworkException("You must set localization helper first."); } return m_LocalizationHelper.SystemLanguage; } } /// /// 获取字典数量。 /// public int DictionaryCount { get { return m_Dictionary.Count; } } /// /// 获取缓冲二进制流的大小。 /// public int CachedBytesSize { get { return DataProvider.CachedBytesSize; } } /// /// 读取字典成功事件。 /// public event EventHandler ReadDataSuccess { add { m_DataProvider.ReadDataSuccess += value; } remove { m_DataProvider.ReadDataSuccess -= value; } } /// /// 读取字典失败事件。 /// public event EventHandler ReadDataFailure { add { m_DataProvider.ReadDataFailure += value; } remove { m_DataProvider.ReadDataFailure -= value; } } /// /// 读取字典更新事件。 /// public event EventHandler ReadDataUpdate { add { m_DataProvider.ReadDataUpdate += value; } remove { m_DataProvider.ReadDataUpdate -= value; } } /// /// 读取字典时加载依赖资源事件。 /// public event EventHandler ReadDataDependencyAsset { add { m_DataProvider.ReadDataDependencyAsset += value; } remove { m_DataProvider.ReadDataDependencyAsset -= value; } } /// /// 本地化管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 internal override void Update(float elapseSeconds, float realElapseSeconds) { } /// /// 关闭并清理本地化管理器。 /// internal override void Shutdown() { } /// /// 设置资源管理器。 /// /// 资源管理器。 public void SetResourceManager(IResourceManager resourceManager) { m_DataProvider.SetResourceManager(resourceManager); } /// /// 设置本地化数据提供者辅助器。 /// /// 本地化数据提供者辅助器。 public void SetDataProviderHelper(IDataProviderHelper dataProviderHelper) { m_DataProvider.SetDataProviderHelper(dataProviderHelper); } /// /// 设置本地化辅助器。 /// /// 本地化辅助器。 public void SetLocalizationHelper(ILocalizationHelper localizationHelper) { if (localizationHelper == null) { throw new GameFrameworkException("Localization helper is invalid."); } m_LocalizationHelper = localizationHelper; } /// /// 确保二进制流缓存分配足够大小的内存并缓存。 /// /// 要确保二进制流缓存分配内存的大小。 public void EnsureCachedBytesSize(int ensureSize) { DataProvider.EnsureCachedBytesSize(ensureSize); } /// /// 释放缓存的二进制流。 /// public void FreeCachedBytes() { DataProvider.FreeCachedBytes(); } /// /// 读取字典。 /// /// 字典资源名称。 public void ReadData(string dictionaryAssetName) { m_DataProvider.ReadData(dictionaryAssetName); } /// /// 读取字典。 /// /// 字典资源名称。 /// 加载字典资源的优先级。 public void ReadData(string dictionaryAssetName, int priority) { m_DataProvider.ReadData(dictionaryAssetName, priority); } /// /// 读取字典。 /// /// 字典资源名称。 /// 用户自定义数据。 public void ReadData(string dictionaryAssetName, object userData) { m_DataProvider.ReadData(dictionaryAssetName, userData); } /// /// 读取字典。 /// /// 字典资源名称。 /// 加载字典资源的优先级。 /// 用户自定义数据。 public void ReadData(string dictionaryAssetName, int priority, object userData) { m_DataProvider.ReadData(dictionaryAssetName, priority, userData); } /// /// 解析字典。 /// /// 要解析的字典字符串。 /// 是否解析字典成功。 public bool ParseData(string dictionaryString) { return m_DataProvider.ParseData(dictionaryString); } /// /// 解析字典。 /// /// 要解析的字典字符串。 /// 用户自定义数据。 /// 是否解析字典成功。 public bool ParseData(string dictionaryString, object userData) { return m_DataProvider.ParseData(dictionaryString, userData); } /// /// 解析字典。 /// /// 要解析的字典二进制流。 /// 是否解析字典成功。 public bool ParseData(byte[] dictionaryBytes) { return m_DataProvider.ParseData(dictionaryBytes); } /// /// 解析字典。 /// /// 要解析的字典二进制流。 /// 用户自定义数据。 /// 是否解析字典成功。 public bool ParseData(byte[] dictionaryBytes, object userData) { return m_DataProvider.ParseData(dictionaryBytes, userData); } /// /// 解析字典。 /// /// 要解析的字典二进制流。 /// 字典二进制流的起始位置。 /// 字典二进制流的长度。 /// 是否解析字典成功。 public bool ParseData(byte[] dictionaryBytes, int startIndex, int length) { return m_DataProvider.ParseData(dictionaryBytes, startIndex, length); } /// /// 解析字典。 /// /// 要解析的字典二进制流。 /// 字典二进制流的起始位置。 /// 字典二进制流的长度。 /// 用户自定义数据。 /// 是否解析字典成功。 public bool ParseData(byte[] dictionaryBytes, int startIndex, int length, object userData) { return m_DataProvider.ParseData(dictionaryBytes, startIndex, length, userData); } /// /// 根据字典主键获取字典内容字符串。 /// /// 字典主键。 /// 要获取的字典内容字符串。 public string GetString(string key) { string value = GetRawString(key); if (value == null) { return Utility.Text.Format("{0}", key); } return value; } /// /// 根据字典主键获取字典内容字符串。 /// /// 字典主键。 /// 字典参数 0。 /// 要获取的字典内容字符串。 public string GetString(string key, object arg0) { string value = GetRawString(key); if (value == null) { return Utility.Text.Format("{0}", key); } try { return Utility.Text.Format(value, arg0); } catch (Exception exception) { return Utility.Text.Format("{0},{1},{2},{3}", key, value, arg0, exception.ToString()); } } /// /// 根据字典主键获取字典内容字符串。 /// /// 字典主键。 /// 字典参数 0。 /// 字典参数 1。 /// 要获取的字典内容字符串。 public string GetString(string key, object arg0, object arg1) { string value = GetRawString(key); if (value == null) { return Utility.Text.Format("{0}", key); } try { return Utility.Text.Format(value, arg0, arg1); } catch (Exception exception) { return Utility.Text.Format("{0},{1},{2},{3},{4}", key, value, arg0, arg1, exception.ToString()); } } /// /// 根据字典主键获取字典内容字符串。 /// /// 字典主键。 /// 字典参数 0。 /// 字典参数 1。 /// 字典参数 2。 /// 要获取的字典内容字符串。 public string GetString(string key, object arg0, object arg1, object arg2) { string value = GetRawString(key); if (value == null) { return Utility.Text.Format("{0}", key); } try { return Utility.Text.Format(value, arg0, arg1, arg2); } catch (Exception exception) { return Utility.Text.Format("{0},{1},{2},{3},{4},{5}", key, value, arg0, arg1, arg2, exception.ToString()); } } /// /// 根据字典主键获取字典内容字符串。 /// /// 字典主键。 /// 字典参数。 /// 要获取的字典内容字符串。 public string GetString(string key, params object[] args) { string value = GetRawString(key); if (value == null) { return Utility.Text.Format("{0}", key); } try { return Utility.Text.Format(value, args); } catch (Exception exception) { string errorString = Utility.Text.Format("{0},{1}", key, value); if (args != null) { foreach (object arg in args) { errorString += "," + arg.ToString(); } } errorString += "," + exception.ToString(); return errorString; } } /// /// 是否存在字典。 /// /// 字典主键。 /// 是否存在字典。 public bool HasRawString(string key) { if (string.IsNullOrEmpty(key)) { throw new GameFrameworkException("Key is invalid."); } return m_Dictionary.ContainsKey(key); } /// /// 根据字典主键获取字典值。 /// /// 字典主键。 /// 字典值。 public string GetRawString(string key) { if (string.IsNullOrEmpty(key)) { throw new GameFrameworkException("Key is invalid."); } string value = null; if (!m_Dictionary.TryGetValue(key, out value)) { return null; } return value; } /// /// 增加字典。 /// /// 字典主键。 /// 字典内容。 /// 是否增加字典成功。 public bool AddRawString(string key, string value) { if (string.IsNullOrEmpty(key)) { throw new GameFrameworkException("Key is invalid."); } if (m_Dictionary.ContainsKey(key)) { return false; } m_Dictionary.Add(key, value ?? string.Empty); return true; } /// /// 移除字典。 /// /// 字典主键。 /// 是否移除字典成功。 public bool RemoveRawString(string key) { if (string.IsNullOrEmpty(key)) { throw new GameFrameworkException("Key is invalid."); } return m_Dictionary.Remove(key); } /// /// 清空所有字典。 /// public void RemoveAllRawStrings() { m_Dictionary.Clear(); } } }