using System.Collections.Generic; using UnityEngine.Localization.Settings; using System.Linq; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Localization; namespace DDD { public enum TableName { None = 0, Item_Name, Item_Description, Global_Message, } public class LocalizationManager : Singleton, IManager { private readonly Dictionary _localizedCache = new(); private string _currentLocaleCode; private bool _isInitialized; public void PreInit() { _localizedCache.Clear(); _currentLocaleCode = GetCurrentLocaleCode(); foreach (TableName table in System.Enum.GetValues(typeof(TableName))) { if (table == TableName.None) continue; var tableName = table.ToString(); var stringTable = LocalizationSettings.StringDatabase.GetTable(tableName); if (stringTable == null) { Debug.LogWarning($"[Localization] Table not found: {tableName}"); continue; } foreach (var entry in stringTable.Values) { if (entry == null || string.IsNullOrEmpty(entry.Key)) continue; if (!_localizedCache.ContainsKey(entry.Key)) { var localizedString = new LocalizedString { TableReference = tableName, TableEntryReference = entry.Key }; _localizedCache.Add(entry.Key, localizedString); } } } _isInitialized = true; } public Task Init() { return Task.CompletedTask; } public void PostInit() { } /// /// 현재 선택된 로케일 기준으로 로컬라이징 텍스트를 가져옵니다. /// public LocalizedString GetLocalizedString(string key) { if (!_isInitialized) { Debug.LogWarning("[LocalizationManager] 호출 전에 초기화되지 않았습니다."); return null; } if (_localizedCache.TryGetValue(key, out var value)) return value; Debug.LogError($"[LocalizationManager] {key}값이 존재하지 않습니다."); return null; } public string GetString(string key) { var localizedString = GetLocalizedString(key); return LocalizationSettings.StringDatabase.GetLocalizedString(localizedString.TableReference, key, LocalizationSettings.SelectedLocale); } /// /// 현재 사용 중인 로케일 코드 반환 (예: "ko", "en", "ja") /// public static string GetCurrentLocaleCode() { return LocalizationSettings.SelectedLocale.Identifier.Code; } /// /// 로케일 코드로 현재 언어를 설정합니다. (예: "ko", "en", "ja") /// public void SetLocale(string code) { var locale = LocalizationSettings.AvailableLocales.Locales.FirstOrDefault(l => l.Identifier.Code == code); if (locale != null) { LocalizationSettings.SelectedLocale = locale; } } } }