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
- Use native names - "Deutsch" not "German"
- Save preferences - Remember the player's choice
- Respect system setting - Use system locale as default
- Show flags (optional) - Visual recognition helps
- Update immediately - Don't require restart
