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; } }