using System.Collections.Generic;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
namespace UnityEngine.Localization.Samples
{
///
/// This example shows how a language selection menu can be implemented using UGUI.
///
[RequireComponent(typeof(Dropdown))]
public class LanguageSelectionMenuUGUIDropdown : MonoBehaviour
{
Dropdown m_Dropdown;
AsyncOperationHandle m_InitializeOperation;
void Start()
{
// First we setup the dropdown component.
m_Dropdown = GetComponent();
m_Dropdown.onValueChanged.AddListener(OnSelectionChanged);
// Clear the options an add a loading message while we wait for the localization system to initialize.
m_Dropdown.ClearOptions();
m_Dropdown.options.Add(new Dropdown.OptionData("Loading..."));
m_Dropdown.interactable = false;
// SelectedLocaleAsync will ensure that the locales have been initialized and a locale has been selected.
m_InitializeOperation = LocalizationSettings.SelectedLocaleAsync;
if (m_InitializeOperation.IsDone)
{
InitializeCompleted(m_InitializeOperation);
}
else
{
m_InitializeOperation.Completed += InitializeCompleted;
}
}
void InitializeCompleted(AsyncOperationHandle obj)
{
// Create an option in the dropdown for each Locale
var options = new List();
int selectedOption = 0;
var locales = LocalizationSettings.AvailableLocales.Locales;
for (int i = 0; i < locales.Count; ++i)
{
var locale = locales[i];
if (LocalizationSettings.SelectedLocale == locale)
selectedOption = i;
var displayName = locales[i].Identifier.CultureInfo != null ? locales[i].Identifier.CultureInfo.NativeName : locales[i].ToString();
options.Add(displayName);
}
// If we have no Locales then something may have gone wrong.
if (options.Count == 0)
{
options.Add("No Locales Available");
m_Dropdown.interactable = false;
}
else
{
m_Dropdown.interactable = true;
}
m_Dropdown.ClearOptions();
m_Dropdown.AddOptions(options);
m_Dropdown.SetValueWithoutNotify(selectedOption);
LocalizationSettings.SelectedLocaleChanged += LocalizationSettings_SelectedLocaleChanged;
}
void OnSelectionChanged(int index)
{
// Unsubscribe from SelectedLocaleChanged so we don't get an unnecessary callback from the change we are about to make.
LocalizationSettings.SelectedLocaleChanged -= LocalizationSettings_SelectedLocaleChanged;
var locale = LocalizationSettings.AvailableLocales.Locales[index];
LocalizationSettings.SelectedLocale = locale;
// Resubscribe to SelectedLocaleChanged so that we can stay in sync with changes that may be made by other scripts.
LocalizationSettings.SelectedLocaleChanged += LocalizationSettings_SelectedLocaleChanged;
}
void LocalizationSettings_SelectedLocaleChanged(Locale locale)
{
// We need to update the dropdown selection to match.
var selectedIndex = LocalizationSettings.AvailableLocales.Locales.IndexOf(locale);
m_Dropdown.SetValueWithoutNotify(selectedIndex);
}
}
}