feat: 火山玩法本地化

仍有硬编码残留,待处理
This commit is contained in:
2026-07-28 19:13:53 +08:00
parent 3de3f1a2e2
commit ca5b714124
72 changed files with 2634 additions and 626 deletions
@@ -1,5 +1,7 @@
using System.Collections;
using AibisDream.Kit;
using System;
using System.Threading.Tasks;
using AibisDream.Utility;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
@@ -127,39 +129,85 @@ namespace AibisDream.Framework
}
/// <summary>
/// 本地化参数
/// 判断字符串是否为 l10n 参数引用。
/// </summary>
/// <param name="param">参数名</param>
/// <returns></returns>
public static string LocalizeParam(string param)
public static bool IsLocalizedParam(string value)
{
return LocalizeParam(param, CurrentLocaleKind);
return !string.IsNullOrEmpty(value) &&
value.StartsWith(LocalizationPrefix, StringComparison.Ordinal);
}
/// <summary>
/// 按指定语言列解析本地化参数,供需要响应 Locale 切换的非 Yarn UI 使用
/// 从 Params String Table 异步解析 l10n 参数。非 l10n 参数原样返回
/// 当前 Locale 条目为空时保留空值,不使用任何 Locale 回退。
/// </summary>
public static string LocalizeParam(string param, LocaleKind localeKind)
public static async Task<string> LocalizeParamAsync(string param, Locale locale = null)
{
// 非本地化参数直接返回
if (string.IsNullOrEmpty(param)) return param;
if (!param.StartsWith(LocalizationPrefix)) return param;
if (!IsLocalizedParam(param))
return param;
var localizationKey = param[LocalizationPrefix.Length..];
if (ConfigUtil.Instance.TryGetParam(localizationKey, out var value))
string localizationKey = GetL10NParamKey(param);
if (string.IsNullOrEmpty(localizationKey))
{
return value.LocalizeByKind(localeKind);
Debug.LogError("[LocalizationKit] l10n 参数缺少 Entry Key。");
return "⟦empty⟧";
}
// 如果找不到,则使用原始值
Debug.LogWarning($"Variable Key '{localizationKey}' not found in params csv.");
return localizationKey;
try
{
await LocalizationSettings.InitializationOperation.Task;
Locale resolvedLocale = locale != null ? locale : LocalizationSettings.SelectedLocale;
var operation = LocalizationSettings.StringDatabase.GetTableEntryAsync(
ConstRef.ParamsTable,
localizationKey,
resolvedLocale,
FallbackBehavior.DontUseFallback);
var result = await operation.Task;
if (result.Entry != null)
return result.Entry.LocalizedValue ?? string.Empty;
string localeCode = resolvedLocale != null
? resolvedLocale.Identifier.Code
: "<null>";
Debug.LogError(
$"[LocalizationKit] Params 缺少条目:Table={ConstRef.ParamsTable}, " +
$"Key={localizationKey}, Locale={localeCode}。");
return $"⟦{localizationKey}⟧";
}
catch (Exception exception)
{
string localeCode = locale != null
? locale.Identifier.Code
: LocalizationSettings.SelectedLocale?.Identifier.Code ?? "<null>";
Debug.LogError(
$"[LocalizationKit] Params 查询失败:Table={ConstRef.ParamsTable}, " +
$"Key={localizationKey}, Locale={localeCode}。\n{exception}");
return $"⟦{localizationKey}⟧";
}
}
/// <summary>
/// 协程版 l10n 参数解析,供 Yarn Command 和 MonoBehaviour 使用。
/// </summary>
public static IEnumerator LocalizeParam(
string param,
Locale locale,
Action<string> completed)
{
Task<string> task = LocalizeParamAsync(param, locale);
while (!task.IsCompleted)
yield return null;
string result = task.Status == TaskStatus.RanToCompletion
? task.Result
: $"⟦{GetL10NParamKey(param)}⟧";
completed?.Invoke(result);
}
public static string GetL10NParamKey(string key)
{
// 本地化参数则去除前缀,非本地化参数直接返回
return key.StartsWith(LocalizationPrefix) ? key[LocalizationPrefix.Length..] : key;
return IsLocalizedParam(key) ? key[LocalizationPrefix.Length..] : key;
}
/// <summary>