using System;
using System.Collections.Generic;
using System.Threading;
using AlicizaX;
using Cysharp.Threading.Tasks;
namespace AlicizaX.Localization.Runtime
{
///
/// 本地化服务实现,负责维护当前语言对应的字符串缓存,并管理配置表的装载与刷新。
///
[UnityEngine.Scripting.Preserve]
internal sealed partial class LocalizationService : ServiceBase, ILocalizationService
{
///
/// 存储当前语言下可用的本地化键值映射。
///
private readonly Dictionary Dic = new();
///
/// 记录已被服务跟踪的本地化配置表。
///
private readonly List _trackedTables = new();
///
/// 记录每个配置表当前写入到缓存中的键集合,便于重载时移除旧数据。
///
private readonly Dictionary> _trackedTableKeys = new();
///
/// 保存当前启用的语言标识。
///
private string _language;
///
/// 获取当前正在使用的语言标识。
///
public string Language
{
get => _language;
}
///
/// 请求切换当前语言。
///
/// 要设置或切换到的语言标识。
public void ChangedLanguage(string language)
{
SwitchLanguageAsync(language).Forget();
}
///
/// 异步切换当前语言并刷新已跟踪的本地化数据。
///
/// 要设置或切换到的语言标识。
/// 用于取消异步切换操作的令牌。
/// 表示语言切换流程的异步任务。
public UniTask SwitchLanguageAsync(string language, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
if (string.IsNullOrEmpty(language) || _language == language)
{
return UniTask.CompletedTask;
}
_language = language;
RebuildTrackedTables();
LocalizationComponent.SaveLanguagePreference(language);
LocalizationChangeEvent.Publisher(_language);
return UniTask.CompletedTask;
}
///
/// 初始化本地化服务并设置当前语言。
///
/// 要设置或切换到的语言标识。
public void Initialize(string language)
{
_language = language;
LocalizationComponent.SaveLanguagePreference(language);
Log.Info($"Initializing LocalizationModule :{language}");
}
///
/// 尝试按键获取未格式化的本地化字符串。
///
/// 本地化字符串的键。
/// 输出获取到的原始字符串值。
/// 如果找到对应键则返回 `true`;否则返回 `false`。
public bool TryGetRawString(string key, out string value)
{
return Dic.TryGetValue(key, out value);
}
///
/// 按键获取本地化字符串。
///
/// 本地化字符串的键。
/// 返回本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
return value;
}
///
/// 按键获取本地化字符串。
///
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数列表。
/// 返回本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, params object[] args)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
return Utility.Text.Format(value, args);
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T arg)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3}", key, value, arg, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4}", key, value, arg1, arg2, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5}", key, value, arg1, arg2, arg3, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6}", key, value, arg1, arg2, arg3, arg4, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7}", key, value, arg1, arg2, arg3, arg4, arg5, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 用于格式化本地化字符串的参数 10。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 格式化参数 11 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 用于格式化本地化字符串的参数 10。
/// 用于格式化本地化字符串的参数 11。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 格式化参数 11 的类型。
/// 格式化参数 12 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 用于格式化本地化字符串的参数 10。
/// 用于格式化本地化字符串的参数 11。
/// 用于格式化本地化字符串的参数 12。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 格式化参数 11 的类型。
/// 格式化参数 12 的类型。
/// 格式化参数 13 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 用于格式化本地化字符串的参数 10。
/// 用于格式化本地化字符串的参数 11。
/// 用于格式化本地化字符串的参数 12。
/// 用于格式化本地化字符串的参数 13。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13);
}
catch (Exception exception)
{
return Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15}", key, value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 格式化参数 11 的类型。
/// 格式化参数 12 的类型。
/// 格式化参数 13 的类型。
/// 格式化参数 14 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 用于格式化本地化字符串的参数 10。
/// 用于格式化本地化字符串的参数 11。
/// 用于格式化本地化字符串的参数 12。
/// 用于格式化本地化字符串的参数 13。
/// 用于格式化本地化字符串的参数 14。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14);
}
catch (Exception exception)
{
var args = Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}", arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14);
return Utility.Text.Format("{0},{1},{2},{3}", key, value, args, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 格式化参数 11 的类型。
/// 格式化参数 12 的类型。
/// 格式化参数 13 的类型。
/// 格式化参数 14 的类型。
/// 格式化参数 15 的类型。
/// 本地化字符串的键。
/// 用于格式化本地化字符串的参数 1。
/// 用于格式化本地化字符串的参数 2。
/// 用于格式化本地化字符串的参数 3。
/// 用于格式化本地化字符串的参数 4。
/// 用于格式化本地化字符串的参数 5。
/// 用于格式化本地化字符串的参数 6。
/// 用于格式化本地化字符串的参数 7。
/// 用于格式化本地化字符串的参数 8。
/// 用于格式化本地化字符串的参数 9。
/// 用于格式化本地化字符串的参数 10。
/// 用于格式化本地化字符串的参数 11。
/// 用于格式化本地化字符串的参数 12。
/// 用于格式化本地化字符串的参数 13。
/// 用于格式化本地化字符串的参数 14。
/// 用于格式化本地化字符串的参数 15。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15);
}
catch (Exception exception)
{
var args = Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14}", arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15);
return Utility.Text.Format("{0},{1},{2},{3}", key, value, args, exception);
}
}
///
/// 按键获取并格式化本地化字符串。
///
/// 格式化参数 1 的类型。
/// 格式化参数 2 的类型。
/// 格式化参数 3 的类型。
/// 格式化参数 4 的类型。
/// 格式化参数 5 的类型。
/// 格式化参数 6 的类型。
/// 格式化参数 7 的类型。
/// 格式化参数 8 的类型。
/// 格式化参数 9 的类型。
/// 格式化参数 10 的类型。
/// 格式化参数 11 的类型。
/// 格式化参数 12 的类型。
/// 格式化参数 13 的类型。
/// 格式化参数 14 的类型。
/// 格式化参数 15 的类型。
/// 格式化参数 16 的类型。
/// 返回格式化后的本地化结果;若键不存在则返回缺失标记字符串。
public string GetString(string key, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14,
T15 arg15, T16 arg16)
{
if (!Dic.TryGetValue(key, out string value))
{
return Utility.Text.Format("{0}", key);
}
try
{
return Utility.Text.Format(value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16);
}
catch (Exception exception)
{
var args = Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15}", arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16);
return Utility.Text.Format("{0},{1},{2},{3}", key, value, args, exception);
}
}
///
/// 按键获取未格式化的本地化字符串。
///
/// 本地化字符串的键。
/// 返回原始本地化字符串;若键不存在则返回 `null`。
public string GetRawString(string key)
{
return TryGetRawString(key, out string value) ? value : null;
}
///
/// 以增量方式添加本地化配置表内容。
///
/// 要处理的本地化配置表。
public void IncreAddLocalizationConfig(GameLocaizationTable table)
{
TrackTable(table);
ReapplyTrackedTable(table);
}
///
/// 清空当前数据后,用指定配置表覆盖本地化内容。
///
/// 要处理的本地化配置表。
public void CoverAddLocalizationConfig(GameLocaizationTable table)
{
Dic.Clear();
_trackedTables.Clear();
_trackedTableKeys.Clear();
TrackTable(table);
ReapplyTrackedTable(table);
}
///
/// 重新加载指定配置表在当前语言下的内容。
///
/// 要处理的本地化配置表。
public void ReloadLocalizationConfig(GameLocaizationTable table)
{
TrackTable(table);
ReapplyTrackedTable(table);
}
///
/// 初始化本地化服务并设置当前语言。
///
protected override void OnInitialize() { }
///
/// 销毁服务时清理已缓存的本地化数据。
///
protected override void OnDestroyService()
{
Dic.Clear();
_trackedTables.Clear();
_trackedTableKeys.Clear();
}
///
/// 将配置表加入跟踪列表,便于后续语言切换时重新应用。
///
/// 要处理的本地化配置表。
private void TrackTable(GameLocaizationTable table)
{
if (table == null)
{
return;
}
if (!_trackedTables.Contains(table))
{
_trackedTables.Add(table);
}
}
///
/// 按当前语言重新构建所有已跟踪配置表的缓存内容。
///
private void RebuildTrackedTables()
{
Dic.Clear();
_trackedTableKeys.Clear();
for (int i = 0; i < _trackedTables.Count; i++)
{
ReapplyTrackedTable(_trackedTables[i]);
}
}
///
/// 重新将指定配置表在当前语言下的内容写入缓存。
///
/// 要处理的本地化配置表。
private void ReapplyTrackedTable(GameLocaizationTable table)
{
if (table == null)
{
return;
}
RemoveTrackedTableEntries(table);
LocalizationLanguage localizationLanguage = table.GetLanguage(_language);
if (localizationLanguage == null)
{
Log.Warning($"Can not Find {_language} Strins ");
_trackedTableKeys[table] = new List(0);
return;
}
Dic.EnsureCapacity(Dic.Count + localizationLanguage.Strings.Count);
List keys = new(localizationLanguage.Strings.Count);
foreach (var item in localizationLanguage.Strings)
{
Dic[item.Key] = item.Value;
keys.Add(item.Key);
}
_trackedTableKeys[table] = keys;
}
///
/// 从缓存中移除指定配置表此前写入的所有键值。
///
/// 要处理的本地化配置表。
private void RemoveTrackedTableEntries(GameLocaizationTable table)
{
if (!_trackedTableKeys.TryGetValue(table, out List keys))
{
return;
}
for (int i = 0; i < keys.Count; i++)
{
Dic.Remove(keys[i]);
}
}
}
}