Files
dingyuntian ca5b714124 feat: 火山玩法本地化
仍有硬编码残留,待处理
2026-07-28 19:13:53 +08:00

107 lines
3.2 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Localization.Components;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using TMPro;
using AibisDream.Framework;
/// <summary>
/// 收藏夹 / 生成窗口中的打孔带 UI 项。
/// </summary>
namespace AibisDream.FixSystem
{
public class PunchTapeItem : MonoBehaviour
{
public Image clueImageUI;
public LocalizeStringEvent nameText;
public LocalizeStringEvent memoryIndexLabelText;
public TMP_Text visibilityText;
public TMP_Text contentIdText;
public TMP_Text timecodeText;
[HideInInspector]
public bool used = false;
private PunchTape punchTapeData;
private PunchTapeDefinition punchTapeDefinition;
private int localizationRefreshVersion;
private void OnEnable()
{
LocalizationSettings.SelectedLocaleChanged += HandleSelectedLocaleChanged;
}
private void OnDisable()
{
LocalizationSettings.SelectedLocaleChanged -= HandleSelectedLocaleChanged;
localizationRefreshVersion++;
}
public void Setup(PunchTape punchTape, PunchTapeDefinition definition)
{
punchTapeData = punchTape;
punchTapeDefinition = definition;
used = punchTape != null && punchTape.used;
ApplyDisplay(punchTapeData, definition);
}
private void ApplyDisplay(PunchTape pt, PunchTapeDefinition definition)
{
if (pt == null || definition == null)
{
Debug.LogWarning("PunchTape 或其定义为空,显示已中止。", this);
return;
}
if (clueImageUI != null)
clueImageUI.color = pt.used ? Color.grey : Color.white;
if (nameText != null)
{
RefreshLocalizedName(LocalizationSettings.SelectedLocale);
}
memoryIndexLabelText?.RefreshString();
if (visibilityText != null)
visibilityText.text = $"@{definition.VisibilityCode}";
if (contentIdText != null)
contentIdText.text = $"CID: {definition.ContentId}";
if (timecodeText != null)
timecodeText.text = $"T+: {definition.Timecode}";
}
private void HandleSelectedLocaleChanged(Locale locale)
{
RefreshLocalizedName(locale);
}
private async void RefreshLocalizedName(Locale locale)
{
if (nameText == null || punchTapeDefinition == null)
return;
int version = ++localizationRefreshVersion;
string localizedName = await LocalizationKit.LocalizeParamAsync(
punchTapeDefinition.DisplayNameParam,
locale);
if (version != localizationRefreshVersion ||
nameText == null ||
punchTapeDefinition == null)
return;
nameText.StringReference.Arguments = new object[]
{
localizedName
};
nameText.RefreshString();
}
public PunchTape GetPunchTapeData()
{
return punchTapeData;
}
}
}