Files
zeling_v2/Assets/_Game/Scripts/Localization/ILocalizationService.cs
2026-05-25 11:54:37 +08:00

62 lines
3.0 KiB
C#
Raw Blame History

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