188 lines
6.0 KiB
C#
188 lines
6.0 KiB
C#
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.");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 本地化参数
|
|
/// </summary>
|
|
/// <param name="param">参数名</param>
|
|
/// <param name="table">本地化表</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 本地化参数
|
|
/// </summary>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static string LocalizeParam(string param)
|
|
{
|
|
return LocalizeParam(param, _paramTable);
|
|
}
|
|
|
|
public static string GetL10NParamKey(string key)
|
|
{
|
|
// 本地化参数则去除前缀,非本地化参数直接返回
|
|
return key.StartsWith(LocalizationPrefix) ? key[LocalizationPrefix.Length..] : key;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 确保本地化系统已初始化
|
|
/// </summary>
|
|
/// <returns>初始化操作</returns>
|
|
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;
|
|
}
|
|
} |