SHA256
113 lines
3.0 KiB
C#
113 lines
3.0 KiB
C#
using System;
|
|
using ADOFAIRenderer.Localization;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
namespace ADOFAIRenderer.UI;
|
|
|
|
/// <summary>
|
|
/// Component that binds a TextMeshProUGUI component to a localization key or dynamic string provider,
|
|
/// automatically updating the displayed text whenever the active language changes.
|
|
/// </summary>
|
|
internal class LocalizedText : MonoBehaviour
|
|
{
|
|
private TextMeshProUGUI? _textComponent;
|
|
private string? _key;
|
|
private Func<string>? _dynamicProvider;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the localization key. Setting this will clear any dynamic provider.
|
|
/// </summary>
|
|
public string? Key
|
|
{
|
|
get => _key;
|
|
set
|
|
{
|
|
_key = value;
|
|
_dynamicProvider = null;
|
|
Refresh();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets a dynamic string provider function.
|
|
/// </summary>
|
|
public void SetDynamic(Func<string> provider)
|
|
{
|
|
_dynamicProvider = provider;
|
|
_key = null;
|
|
Refresh();
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
EnsureComponent();
|
|
LocalizationManager.OnLanguageChanged += HandleLanguageChanged;
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
Refresh();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
LocalizationManager.OnLanguageChanged -= HandleLanguageChanged;
|
|
}
|
|
|
|
private void HandleLanguageChanged(SystemLanguage language)
|
|
{
|
|
Refresh();
|
|
}
|
|
|
|
private void EnsureComponent()
|
|
{
|
|
if (_textComponent == null)
|
|
{
|
|
_textComponent = GetComponent<TextMeshProUGUI>();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Refreshes the text using either the dynamic provider or the static localization key.
|
|
/// </summary>
|
|
public void Refresh()
|
|
{
|
|
EnsureComponent();
|
|
if (_textComponent == null) return;
|
|
|
|
if (_dynamicProvider != null)
|
|
{
|
|
_textComponent.text = _dynamicProvider();
|
|
}
|
|
else if (!string.IsNullOrEmpty(_key))
|
|
{
|
|
_textComponent.text = LocalizationManager.Get(_key);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Binds a TextMeshProUGUI component to a localization key.
|
|
/// </summary>
|
|
public static LocalizedText Bind(TextMeshProUGUI target, string key)
|
|
{
|
|
if (target == null) throw new ArgumentNullException(nameof(target));
|
|
var component = target.GetComponent<LocalizedText>() ?? target.gameObject.AddComponent<LocalizedText>();
|
|
component._textComponent = target;
|
|
component.Key = key;
|
|
return component;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Binds a TextMeshProUGUI component to a dynamic string provider function.
|
|
/// </summary>
|
|
public static LocalizedText Bind(TextMeshProUGUI target, Func<string> provider)
|
|
{
|
|
if (target == null) throw new ArgumentNullException(nameof(target));
|
|
var component = target.GetComponent<LocalizedText>() ?? target.gameObject.AddComponent<LocalizedText>();
|
|
component._textComponent = target;
|
|
component.SetDynamic(provider);
|
|
return component;
|
|
}
|
|
}
|