Skip to content

Language Selector

This example shows how to create a language selection dropdown.

Unity UI Dropdown

csharp
using Lexis;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;

public class LanguageSelector : MonoBehaviour
{
    [SerializeField] private Dropdown languageDropdown;

    void Start()
    {
        Localization.Initialize();
        PopulateDropdown();
        languageDropdown.onValueChanged.AddListener(OnLanguageSelected);
    }

    void PopulateDropdown()
    {
        languageDropdown.ClearOptions();

        // Use native names (e.g., "Deutsch" instead of "German")
        var options = Localization.AvailableLocales
            .Select(l => new Dropdown.OptionData(l.NativeName))
            .ToList();

        languageDropdown.AddOptions(options);

        // Set current selection
        int currentIndex = Localization.AvailableLocales
            .ToList()
            .FindIndex(l => l.Code == Localization.CurrentLocale.Code);

        languageDropdown.value = currentIndex;
    }

    void OnLanguageSelected(int index)
    {
        var locale = Localization.AvailableLocales[index];
        Localization.SetLocale(locale);

        // Save preference
        PlayerPrefs.SetString("Language", locale.Code);
        PlayerPrefs.Save();
    }
}

TextMeshPro Dropdown

csharp
using Lexis;
using TMPro;
using UnityEngine;
using System.Linq;

public class LanguageSelectorTMP : MonoBehaviour
{
    [SerializeField] private TMP_Dropdown languageDropdown;

    void Start()
    {
        Localization.Initialize();
        PopulateDropdown();
        languageDropdown.onValueChanged.AddListener(OnLanguageSelected);
    }

    void PopulateDropdown()
    {
        languageDropdown.ClearOptions();

        var options = Localization.AvailableLocales
            .Select(l => new TMP_Dropdown.OptionData(l.NativeName))
            .ToList();

        languageDropdown.AddOptions(options);

        int currentIndex = Localization.AvailableLocales
            .ToList()
            .FindIndex(l => l.Code == Localization.CurrentLocale.Code);

        languageDropdown.value = currentIndex;
    }

    void OnLanguageSelected(int index)
    {
        var locale = Localization.AvailableLocales[index];
        Localization.SetLocale(locale);
        PlayerPrefs.SetString("Language", locale.Code);
    }
}

Load Saved Language

csharp
using Lexis;
using UnityEngine;

public class GameInitializer : MonoBehaviour
{
    void Start()
    {
        Localization.Initialize();
        LoadSavedLanguage();
    }

    void LoadSavedLanguage()
    {
        // Check for saved preference
        if (PlayerPrefs.HasKey("Language"))
        {
            string savedCode = PlayerPrefs.GetString("Language");
            Localization.SetLocale(savedCode);
        }
        else if (Localization.Settings.DetectSystemLocale)
        {
            // Use system language if no preference saved
            var detected = Localization.DetectSystemLocale();
            if (detected != null)
            {
                Localization.SetLocale(detected);
            }
        }
    }
}

UI Toolkit Version

csharp
using Lexis;
using UnityEngine;
using UnityEngine.UIElements;
using System.Linq;

public class LanguageSelectorUIToolkit : MonoBehaviour
{
    [SerializeField] private UIDocument document;

    void OnEnable()
    {
        var root = document.rootVisualElement;
        var dropdown = root.Q<DropdownField>("language-dropdown");

        Localization.Initialize();

        // Populate choices
        dropdown.choices = Localization.AvailableLocales
            .Select(l => l.NativeName)
            .ToList();

        // Set current value
        dropdown.value = Localization.CurrentLocale.NativeName;

        // Handle changes
        dropdown.RegisterValueChangedCallback(evt =>
        {
            var locale = Localization.AvailableLocales
                .First(l => l.NativeName == evt.newValue);
            Localization.SetLocale(locale);
            PlayerPrefs.SetString("Language", locale.Code);
        });
    }
}

With Flags

csharp
public class LanguageSelectorWithFlags : MonoBehaviour
{
    [System.Serializable]
    public class LocaleFlag
    {
        public string localeCode;
        public Sprite flag;
    }

    [SerializeField] private List<LocaleFlag> flags;
    [SerializeField] private Dropdown languageDropdown;

    void PopulateDropdown()
    {
        var options = Localization.AvailableLocales
            .Select(locale =>
            {
                var flagData = flags.Find(f => f.localeCode == locale.Code);
                return new Dropdown.OptionData(locale.NativeName, flagData?.flag);
            })
            .ToList();

        languageDropdown.AddOptions(options);
    }
}

Best Practices

  1. Use native names - "Deutsch" not "German"
  2. Save preferences - Remember the player's choice
  3. Respect system setting - Use system locale as default
  4. Show flags (optional) - Visual recognition helps
  5. Update immediately - Don't require restart

Professional Unity Development Tools