using System;
namespace BaseGames.Localization
{
///
/// 本地化服务接口。通过 ServiceLocator 注册,供 UI 和游戏系统获取本地化文本。
///
public interface ILocalizationService
{
/// 当前激活的语言。
Language CurrentLanguage { get; }
///
/// 获取本地化字符串。查找顺序:当前语言 → 回退语言(English)→ 直接返回 key。
/// 表名建议使用 中的常量。
///
string Get(string key, string table = LocalizationTable.UI);
///
/// 尝试获取本地化字符串。返回 false 表示 key 在所有语言(含回退)中均不存在。
/// 与 不同:key 不存在时不会将 key 本身作为值返回。
/// 适用于需要区分"key 存在但值为空"和"key 完全不存在"的场景。
///
bool TryGet(string key, out string value, string table = LocalizationTable.UI);
///
/// 获取带格式化参数的本地化字符串(string.Format 风格)。
/// 例:GetFormat("REWARD_GOLD", LocalizationTable.UI, amount) → "获得 100 灵珠"。
/// 格式化失败时静默返回原始模板字符串,不抛出异常。
///
string GetFormat(string key, string table, params object[] args);
/// 切换游戏语言并通知所有订阅者刷新文本。
void SetLanguage(Language language);
///
/// 同步预热指定语言的所有已知本地化表,避免首次访问时产生帧卡顿。
/// 在主线程阻塞执行,建议改用 分帧加载。
///
void PreloadTables(Language language);
///
/// 异步分帧预热指定语言的所有本地化表(每帧加载一个表,不阻塞主线程)。
/// 建议在 Loading Screen 的协程中调用。
///
/// 要预热的语言。
/// 全部表加载完成后的回调(可为 null)。
void PreloadTablesAsync(Language language, Action onComplete = null);
///
/// 获取带数量的复数形式本地化字符串。
/// 规则:先查找 "{key}_one"(count==1)或 "{key}_other"(count≠1),找不到则回退到基础 key。
/// 查找到的模板以 string.Format(template, count) 展开,{0} 代入 count。
/// 示例:key="ITEM_COUNT",表中配置 "ITEM_COUNT_other"="获得 {0} 个物品" → "获得 5 个物品"。
///
string GetPlural(string key, int count, string table = LocalizationTable.UI);
/// 语言切换时触发。
event Action OnLanguageChanged;
}
}