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}"); } 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 的类型。 /// 字典主键。 /// 字典参数 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); } } 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]); } } } }