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; } }