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