//------------------------------------------------------------
// 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();
}
}
}