using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Localization.Settings; namespace BlueWater { public enum LocaleType { Korean = 0, English = 1, ChineseSimplified = 2, ChineseTradition = 3, Japanese = 4, Spanish = 5, Russian = 6, French = 7 } public class LocalizationManager : Singleton { public bool IsInitialized; [SerializeField] private List _usedFontMaterials = new(); [SerializeField] private float _defaultOutlineSize = 0.2f; [SerializeField] private float _chineseOutlineSize = 0.05f; private bool _isChanging; private static readonly int OutlineWidthHash = Shader.PropertyToID("_OutlineWidth"); private void Start() { var index = ES3.Load(SaveData.Locale, GetCurrentLocaleIndex()); ChangeLocale((LocaleType)index, () => IsInitialized = true); } /// /// 0 - 한국어 /// 1 - 영어 /// /// [Button("언어 변경")] public void ChangeLocale(LocaleType localeType, Action completeEvent = null) { if (_isChanging) return; StartCoroutine(ChangeLocaleCoroutine(localeType, completeEvent)); } private IEnumerator ChangeLocaleCoroutine(LocaleType localeType, Action completeEvent) { _isChanging = true; yield return LocalizationSettings.InitializationOperation; LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[(int)localeType]; if (localeType is LocaleType.ChineseSimplified or LocaleType.ChineseTradition or LocaleType.Japanese) { SetMaterialOutline(_chineseOutlineSize); } else { SetMaterialOutline(_defaultOutlineSize); } ES3.Save(SaveData.Locale, (int)localeType); _isChanging = false; completeEvent?.Invoke(); } public int GetCurrentLocaleIndex() { var selectedLocale = LocalizationSettings.SelectedLocale; var locales = LocalizationSettings.AvailableLocales.Locales; for (var i = 0; i < locales.Count; i++) { if (locales[i] == selectedLocale) { return i; } } return -1; } public string GetLocaleDisplayName(LocaleType localeType) { return localeType switch { LocaleType.Korean => "한국어", LocaleType.English => "English", LocaleType.ChineseSimplified => "中文(简体)", LocaleType.ChineseTradition => "中文(繁體)", LocaleType.Japanese => "日本語", LocaleType.Spanish => "Español", LocaleType.Russian => "Русский", LocaleType.French => "Français", _ => "Unknown" }; } public void SetMaterialOutline(float value) { foreach (var element in _usedFontMaterials) { element.SetFloat(OutlineWidthHash, value); } } } }