using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
namespace LanguageManager
{
///
/// Component that creates a dropdown of available languages and changes the language when selected.
/// Supports both Unity UI Dropdown and TextMeshPro TMP_Dropdown.
///
public class LanguageDropdown : MonoBehaviour
{
private Dropdown dropdown;
private TMP_Dropdown tmpDropdown;
private bool isTMPDropdown = false;
private void Awake()
{
// Try to get the Unity UI Dropdown
dropdown = GetComponent();
if (dropdown != null)
{
isTMPDropdown = false;
// Start the coroutine to wait for the LanguageManager
StartCoroutine(PopulateDropdownRoutine());
dropdown.onValueChanged.AddListener(OnDropdownValueChanged);
}
else
{
// Try to get the TMP_Dropdown from TextMeshPro
tmpDropdown = GetComponent();
if (tmpDropdown != null)
{
isTMPDropdown = true;
StartCoroutine(PopulateDropdownRoutine());
tmpDropdown.onValueChanged.AddListener(OnTMPDropdownValueChanged);
}
else
{
Debug.LogError("No Dropdown or TMP_Dropdown component found on this GameObject.");
}
}
}
///
/// Coroutine that waits until the LanguageManager instance is available, then populates the dropdown.
///
private IEnumerator PopulateDropdownRoutine()
{
// Wait until LanguageManager instance is available
yield return new WaitUntil(() => LanguageManager.Instance != null);
PopulateDropdown();
}
///
/// Populates the dropdown with available languages from the LanguageManager.
///
private void PopulateDropdown()
{
if (LanguageManager.Instance != null)
{
List options = new List();
foreach (Language language in LanguageManager.Instance.Languages)
{
options.Add(language.LanguageTitle);
}
int currentIndex = LanguageManager.Instance.Languages.FindIndex(
lang => lang.LanguageID == LanguageManager.Instance.currentLanguageID);
if (isTMPDropdown && tmpDropdown != null)
{
tmpDropdown.ClearOptions();
tmpDropdown.AddOptions(options);
// Set the dropdown value to the current language
if (currentIndex >= 0)
{
tmpDropdown.value = currentIndex;
}
}
else if (dropdown != null)
{
dropdown.ClearOptions();
dropdown.AddOptions(options);
// Set the dropdown value to the current language
if (currentIndex >= 0)
{
dropdown.value = currentIndex;
}
}
}
else
{
Debug.LogError("LanguageManager instance not found.");
}
}
///
/// Called when the Unity UI Dropdown value changes.
///
/// The index of the selected option.
private void OnDropdownValueChanged(int index)
{
if (LanguageManager.Instance != null && index >= 0 && index < LanguageManager.Instance.Languages.Count)
{
string selectedLanguageID = LanguageManager.Instance.Languages[index].LanguageID;
LanguageManager.Instance.SetLanguage(selectedLanguageID);
}
else
{
Debug.LogError("Invalid language index selected.");
}
}
///
/// Called when the TextMeshPro TMP_Dropdown value changes.
///
/// The index of the selected option.
private void OnTMPDropdownValueChanged(int index)
{
if (LanguageManager.Instance != null && index >= 0 && index < LanguageManager.Instance.Languages.Count)
{
string selectedLanguageID = LanguageManager.Instance.Languages[index].LanguageID;
LanguageManager.Instance.SetLanguage(selectedLanguageID);
}
else
{
Debug.LogError("Invalid language index selected.");
}
}
}
}