Files
2025-05-29 22:31:40 +03:00

147 lines
6.4 KiB
C#

using System.Collections.Generic;
using UnityEngine.Localization.Settings;
namespace UnityEngine.Localization.Samples
{
/// <summary>
/// This example shows how a simple language selection menu can be implemented using IMGUI.
/// This class shows how to provide custom Locales for the SimpleLocalesProvider, waiting for the SelectedLocaleAsync to be ready,
/// creating custom labels for the Locales and responding to Locale changed events.
/// </summary>
public class LanguageSelectionMenuIMGUI : MonoBehaviour
{
public Rect windowRect = new Rect(0, 0, 300, 300);
public Color selectColor = Color.yellow;
public Color defaultColor = Color.gray;
Vector2 m_ScrollPos;
Dictionary<Locale, string> m_Labels = new Dictionary<Locale, string>();
[Tooltip("Use the current active settings if possible or create a new one for the example")]
public bool useActiveLocalizationSettings = false;
void Start()
{
var localizationSettings = LocalizationSettings.GetInstanceDontCreateDefault();
// Use included settings if one is available.
if (useActiveLocalizationSettings && localizationSettings != null)
{
Debug.Log("Using included localization data");
return;
}
Debug.Log("Creating default localization data");
// Create our localization settings. If a LocalizationSettings asset has been created and configured in the editor then we can leave this step out.
localizationSettings = ScriptableObject.CreateInstance<LocalizationSettings>();
// Replace the default Locales Provider with something we can manage locally for the example
var simpleLocalesProvider = new SimpleLocalesProvider();
localizationSettings.SetAvailableLocales(simpleLocalesProvider);
// Add the locales we support
simpleLocalesProvider.AddLocale(Locale.CreateLocale(new LocaleIdentifier(SystemLanguage.Arabic)));
simpleLocalesProvider.AddLocale(Locale.CreateLocale(new LocaleIdentifier(SystemLanguage.English)));
simpleLocalesProvider.AddLocale(Locale.CreateLocale(new LocaleIdentifier(SystemLanguage.French)));
simpleLocalesProvider.AddLocale(Locale.CreateLocale(new LocaleIdentifier(SystemLanguage.German)));
simpleLocalesProvider.AddLocale(Locale.CreateLocale(new LocaleIdentifier(SystemLanguage.Japanese)));
// Set English to be our default
var startupSelectors = localizationSettings.GetStartupLocaleSelectors();
startupSelectors.Clear(); // Remove the defaults
startupSelectors.Add(new SpecificLocaleSelector { LocaleId = SystemLanguage.English });
// Listen to any Locale changed events
localizationSettings.OnSelectedLocaleChanged += OnSelectedLocaleChanged;
// Make this our new LocalizationSettings
LocalizationSettings.Instance = localizationSettings;
}
static void OnSelectedLocaleChanged(Locale newLocale)
{
Debug.Log("OnSelectedLocaleChanged: The locale just changed to " + newLocale);
}
void OnGUI()
{
windowRect = GUI.Window(GetHashCode(), windowRect, DrawWindowContents, "Select Language");
}
string GetLocaleLabel(Locale locale)
{
// Cache our generated labels.
if (m_Labels.TryGetValue(locale, out var label))
return label;
// Create a label which shows the English name and the native name.
var cultureInfo = locale.Identifier.CultureInfo;
// If the Locale is custom then it may not have a CultureInfo
if (cultureInfo != null)
{
// We will show a label in the form "<EnglishName>(<NativeName>)" when the Native name is not the same as the English name.
if (cultureInfo.EnglishName != cultureInfo.NativeName)
label = $"{cultureInfo.EnglishName}({cultureInfo.NativeName})";
else
label = cultureInfo.EnglishName;
}
else
{
label = locale.ToString();
}
m_Labels[locale] = label;
return label;
}
void DrawWindowContents(int id)
{
// We need to wait for the Locales to be ready. If we are using the default LocalesProvider then they may still be loading.
// SelectedLocaleAsync will wait for the Locales to be ready before selecting the SelectedLocale.
if (!LocalizationSettings.SelectedLocaleAsync.IsDone)
{
GUILayout.Label("Initializing Locales: " + LocalizationSettings.SelectedLocaleAsync.PercentComplete);
GUI.DragWindow();
return;
}
// If we wanted to wait for everything to be initialized including preloading tables then we could check LocalizationSettings.InitializationOperation instead.
//if (!LocalizationSettings.InitializationOperation.IsDone)
//{
// GUILayout.Label("Initializing Localization: " + LocalizationSettings.InitializationOperation.PercentComplete);
// GUI.DragWindow();
// return;
//}
var availableLocales = LocalizationSettings.AvailableLocales;
if (availableLocales.Locales.Count == 0)
{
GUILayout.Label("No Locales included in the active Localization Settings.");
}
else
{
// We will use a color to indicate the SelectedLocale
var originalColor = GUI.contentColor;
m_ScrollPos = GUILayout.BeginScrollView(m_ScrollPos);
for (int i = 0; i < availableLocales.Locales.Count; ++i)
{
var locale = availableLocales.Locales[i];
GUI.contentColor = LocalizationSettings.SelectedLocale == locale ? selectColor : defaultColor;
if (GUILayout.Button(GetLocaleLabel(locale)))
{
LocalizationSettings.SelectedLocale = locale;
}
}
GUILayout.EndScrollView();
GUI.contentColor = originalColor;
}
GUI.DragWindow();
}
}
}