feat: 火山玩法本地化
仍有硬编码残留,待处理
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user