ProjectDDD/Assets/_DDD/_Scripts/GameFramework/Localization/LocalizationManager.cs

116 lines
3.9 KiB
C#
Raw Normal View History

using System.Collections.Generic;
2025-07-17 10:11:00 +00:00
using UnityEngine.Localization.Settings;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Localization;
namespace DDD
{
public class LocalizationManager : Singleton<LocalizationManager>, IManager
2025-07-17 10:11:00 +00:00
{
private readonly Dictionary<string, LocalizedString> _localizedCache = new();
private string _currentLocaleCode;
private bool _isInitialized;
2025-07-28 09:50:50 +00:00
private const string Name = "_name";
private const string Description = "_description";
2025-07-28 09:50:50 +00:00
public async void PreInit()
2025-07-17 10:11:00 +00:00
{
_localizedCache.Clear();
_currentLocaleCode = GetCurrentLocaleCode();
2025-07-28 09:50:50 +00:00
var tables = await LocalizationSettings.StringDatabase.GetAllTables().Task;
2025-07-28 09:50:50 +00:00
foreach (var table in tables)
{
var tableName = table.SharedData.TableCollectionName;
2025-07-28 09:50:50 +00:00
if (table == null)
{
Debug.LogWarning($"[Localization] Table not found: {tableName}");
continue;
}
2025-07-28 09:50:50 +00:00
foreach (var entry in table.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;
}
2025-07-17 10:11:00 +00:00
public Task Init()
{
return Task.CompletedTask;
}
2025-07-17 10:11:00 +00:00
public void PostInit()
{
2025-07-17 10:11:00 +00:00
}
/// <summary>
/// 현재 선택된 로케일 기준으로 로컬라이징 텍스트를 가져옵니다.
/// </summary>
public LocalizedString GetLocalizedString(string key)
{
if (!_isInitialized)
{
Debug.LogWarning("[LocalizationManager] 호출 전에 초기화되지 않았습니다.");
return null;
}
2025-07-17 10:11:00 +00:00
if (_localizedCache.TryGetValue(key, out var value)) return value;
2025-07-27 19:50:34 +00:00
Debug.LogError($"[LocalizationManager] {key}값이 존재하지 않습니다.");
return null;
2025-07-17 10:11:00 +00:00
}
2025-07-28 09:50:50 +00:00
public LocalizedString GetLocalizedName(string key) => GetLocalizedString(key + Name);
public LocalizedString GetLocalizedDescription(string key) => GetLocalizedString(key + Description);
2025-07-17 10:11:00 +00:00
2025-07-28 09:50:50 +00:00
/// <summary>
/// Key값 자체를 탐색
/// </summary>
public string GetString(string key)
{
var localizedString = GetLocalizedString(key);
return LocalizationSettings.StringDatabase.GetLocalizedString(localizedString.TableReference, key, LocalizationSettings.SelectedLocale);
}
2025-07-28 09:50:50 +00:00
public string GetName(string key) => GetString(key + Name);
public string GetDescription(string key) => GetString(key + Description);
2025-07-17 10:11:00 +00:00
/// <summary>
/// 현재 사용 중인 로케일 코드 반환 (예: "ko", "en", "ja")
/// </summary>
public static string GetCurrentLocaleCode()
{
return LocalizationSettings.SelectedLocale.Identifier.Code;
}
/// <summary>
/// 로케일 코드로 현재 언어를 설정합니다. (예: "ko", "en", "ja")
/// </summary>
public void SetLocale(string code)
2025-07-17 10:11:00 +00:00
{
var locale = LocalizationSettings.AvailableLocales.Locales.FirstOrDefault(l => l.Identifier.Code == code);
2025-07-17 10:11:00 +00:00
if (locale != null)
{
2025-07-17 10:11:00 +00:00
LocalizationSettings.SelectedLocale = locale;
}
2025-07-17 10:11:00 +00:00
}
}
}