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 is { } fb && fb.ContainsKey(key))
{
return fb.GetRawText(key);
}
throw new LocalizationKeyNotFoundException(Name, key);
}
///
/// 检查是否包含指定的键
///
/// 要检查的本地化键
/// 如果存在则返回 true,否则返回 false
public bool ContainsKey(string key)
{
return _overrides.ContainsKey(key)
|| _data.ContainsKey(key)
|| (Fallback is { } fb && fb.ContainsKey(key));
}
///
/// 获取所有可用的本地化键集合
///
/// 包含所有键的可枚举集合
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;
}
}
}