using GFramework.Core.Abstractions.Localization; namespace GFramework.Core.Localization; /// /// 本地化表实现 /// public class LocalizationTable : ILocalizationTable { /// /// 存储原始本地化数据的字典 /// private readonly Dictionary _data; /// /// 存储覆盖数据的字典,优先级高于原始数据 /// private readonly Dictionary _overrides; /// /// 初始化本地化表 /// /// 表名 /// 语言代码 /// 数据字典 /// 回退表 public LocalizationTable( string name, string language, IReadOnlyDictionary data, ILocalizationTable? fallback = null) { Name = name ?? throw new ArgumentNullException(nameof(name)); Language = language ?? throw new ArgumentNullException(nameof(language)); _data = new Dictionary(data); _overrides = new Dictionary(); Fallback = fallback; } /// /// 获取本地化表的名称 /// public string Name { get; } /// /// 获取语言代码 /// public string Language { get; } /// /// 获取回退表,当当前表找不到键时用于查找 /// public ILocalizationTable? Fallback { get; } /// /// 获取指定键的原始文本内容 /// /// 要查找的本地化键 /// 找到的本地化文本值 /// 当 key 为 null 时抛出 /// 当键在表中不存在且无回退表时抛出 public string GetRawText(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } // 优先使用覆盖数据 if (_overrides.TryGetValue(key, out var overrideValue)) { return overrideValue; } // 然后使用原始数据 if (_data.TryGetValue(key, out var value)) { return value; } // 最后尝试回退表 if (Fallback != null && Fallback.ContainsKey(key)) { return Fallback.GetRawText(key); } throw new LocalizationKeyNotFoundException(Name, key); } /// /// 检查是否包含指定的键 /// /// 要检查的本地化键 /// 如果存在则返回 true,否则返回 false public bool ContainsKey(string key) { return _overrides.ContainsKey(key) || _data.ContainsKey(key) || (Fallback?.ContainsKey(key) ?? false); } /// /// 获取所有可用的本地化键集合 /// /// 包含所有键的可枚举集合 public IEnumerable GetKeys() { var keys = new HashSet(_data.Keys); keys.UnionWith(_overrides.Keys); if (Fallback != null) { keys.UnionWith(Fallback.GetKeys()); } return keys; } /// /// 合并覆盖数据到当前表 /// /// 要合并的覆盖数据字典 /// 当 overrides 为 null 时抛出 public void Merge(IReadOnlyDictionary overrides) { if (overrides == null) { throw new ArgumentNullException(nameof(overrides)); } foreach (var (key, value) in overrides) { _overrides[key] = value; } } }