using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.Settings; using UnityEngine.Localization.Tables; #if UNITY_EDITOR using UnityEditor; #endif namespace AibisDream.Framework { public static class LocalizationKit { private const string LocalizationPrefix = "l10n."; private const string ActorTableName = "ActorName"; private const string ParamTableName = "Params"; private static LocalizationTable _paramTable; public static LocalizationTable ActorTable { get; private set; } public static Locale CurrentLocale => LocalizationSettings.SelectedLocale; static LocalizationKit() { #if UNITY_EDITOR EditorApplication.playModeStateChanged += OnPlayModeChanged; #else _paramTable = new LocalizationTable(ParamTableName); ActorTable = new LocalizationTable(ActorTableName); LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged; #endif } private static void OnLocaleChanged(Locale locale) { EnumEventSystem.Global.Send(SettingChangeEvent.LocaleChanged, locale); } #if UNITY_EDITOR private static void OnPlayModeChanged(PlayModeStateChange playMode) { if (playMode == PlayModeStateChange.EnteredPlayMode) { // 进入游戏模式的时候 _paramTable?.Dispose(); ActorTable?.Dispose(); _paramTable = new LocalizationTable(ParamTableName); ActorTable = new LocalizationTable(ActorTableName); LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged; } else if (playMode == PlayModeStateChange.ExitingPlayMode) { _paramTable?.Dispose(); ActorTable?.Dispose(); _paramTable = null; ActorTable = null; LocalizationSettings.SelectedLocaleChanged -= OnLocaleChanged; } } #endif public static async void SwitchLanguage(string localeCode) { // 等待本地化系统初始化完成 await LocalizationSettings.InitializationOperation.Task; var selectedLocale = LocalizationSettings.AvailableLocales.Locales.Find(locale => locale.Identifier.Code == localeCode); if (selectedLocale) { LocalizationSettings.SelectedLocale = selectedLocale; } else { Debug.LogWarning($"Locale with code {localeCode} not found."); } } /// /// 本地化参数 /// /// 参数名 /// 本地化表 /// public static string LocalizeParam(string param, LocalizationTable table) { // 非本地化参数直接返回 if (!param.StartsWith(LocalizationPrefix)) return param; var localizationKey = param[LocalizationPrefix.Length..]; // 获取本地化值 if (table.TryGetValue(localizationKey, out var value)) { return value.LocalizedValue; } // 如果找不到,则使用原始值 Debug.LogWarning($"Variable Key '{localizationKey}' not found in localization table."); return localizationKey; } /// /// 本地化参数 /// /// /// public static string LocalizeParam(string param) { return LocalizeParam(param, _paramTable); } public static string GetL10NParamKey(string key) { // 本地化参数则去除前缀,非本地化参数直接返回 return key.StartsWith(LocalizationPrefix) ? key[LocalizationPrefix.Length..] : key; } /// /// 确保本地化系统已初始化 /// /// 初始化操作 public static async void EnsureInitialized() { await LocalizationSettings.InitializationOperation.Task; } } public class LocalizationTable { public string TableName { get; } private StringTable _stringTable; private bool _isInitialized; public LocalizationTable(string tableName) { TableName = tableName; Debug.Log($"开始初始化表格{tableName}"); InitializeAsync(); } private async void InitializeAsync() { // 等待本地化系统初始化完成 await LocalizationSettings.InitializationOperation.Task; _stringTable = LocalizationSettings.StringDatabase.GetTable(TableName); LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged; _isInitialized = true; Debug.Log($"表格{TableName}已成功加载"); } public void Dispose() { if (_isInitialized) { LocalizationSettings.SelectedLocaleChanged -= OnLocaleChanged; } _stringTable = null; _isInitialized = false; } private void OnLocaleChanged(Locale locale) { if (_isInitialized) { _stringTable = LocalizationSettings.StringDatabase.GetTable(TableName); } } public StringTableEntry this[string key] => _isInitialized ? _stringTable?[key] : null; public bool TryGetValue(string key, out StringTableEntry value) { if (_isInitialized && _stringTable != null) { value = _stringTable.GetEntry(key); return value != null; } value = null; return false; } public LocaleIdentifier? LocaleIdentifier => _isInitialized ? _stringTable?.LocaleIdentifier : null; } }