using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace OctoCore.Localization { /// /// Localization module for managing text and audio languages. /// Handles language switching and provides localized text retrieval. /// [System.Serializable] public class OctoLocalization : IOctoModule { public OctoLanguages WrittenLanguage; public OctoLanguages AudioLanguage; private Action OnLanguageWrittenChange; private Action OnLanguageAudioChange; private static Dictionary _languagesKey = new Dictionary(); public void Init(OctoSettings settings) { InitLanguagesKey(); // Load written language if (settings.Languages.SaveWritten) { object language; Enum.TryParse(typeof(OctoLanguages), OctoCore.Instance.Save.Get(settings.Languages.SaveWritten), true, out language); if (language == null) { language = settings.Languages.Default; Debug.Log($"[OctoLocalization] Default language settled: {language.ToString()}"); } OctoCore.Instance.Localization.SetLanguageWritten((OctoLanguages)language); } // Load audio language if (settings.Languages.SaveAudio) { object language; Enum.TryParse(typeof(OctoLanguages), OctoCore.Instance.Save.Get(settings.Languages.SaveAudio), true, out language); if (language == null) language = settings.Languages.Default; OctoCore.Instance.Localization.SetLanguageAudio((OctoLanguages)language); } // Callback OctoEvents if (OctoEvents.Instance) OctoEvents.Instance.SetLocalizationInitialized(); } public void Tick() { } public void OnSceneChanged(Scene current, Scene next) { } public void OnQuit() { } public void SetLanguageWritten(OctoLanguages language) { SetLanguage(language, false); } public void SetLanguageAudio(OctoLanguages language) { SetLanguage(language, true); } private void SetLanguage(OctoLanguages language, bool audio = false) { if (audio) { OctoCore.Instance.Localization.AudioLanguage = language; OctoCore.Instance.Save.Set(OctoCore.Instance.Settings.Languages.SaveAudio, language.ToString()); OnLanguageAudioChange?.Invoke(); } else { OctoCore.Instance.Localization.WrittenLanguage = language; OctoCore.Instance.Save.Set(OctoCore.Instance.Settings.Languages.SaveWritten, language.ToString()); OnLanguageWrittenChange?.Invoke(); } } public void UnsubscribeOnLanguageWrittenChange(Action handler) { SubscribeOnLanguageWrittenChange(handler, false); } public void SubscribeOnLanguageWrittenChange(Action handler, bool subscribe = true) { if (subscribe) OnLanguageWrittenChange += handler; else OnLanguageWrittenChange -= handler; } private static void InitLanguagesKey() { foreach (OctoLanguages lang in Enum.GetValues(typeof(OctoLanguages))) _languagesKey[lang] = lang.ToString(); } public static string GetLocalizedText(OctoLocalizedTextData data, bool audio = false) { OctoLanguages language = 0; if (OctoCore.Instance) language = audio ? OctoCore.Instance.Localization.AudioLanguage : OctoCore.Instance.Localization.WrittenLanguage; return GetLocalizedText(data, language); } public static string GetLocalizedText(OctoLocalizedTextData data, OctoLanguages language) { if (data == null || data.Languages == null) { if (OctoCore.Instance.Development.Log) Debug.Log($"[OctoLocalization] Data is null"); return string.Empty; } var dict = data.Languages.Dictionary; if (_languagesKey.Count == 0 || !_languagesKey.ContainsKey(language)) InitLanguagesKey(); if (dict != null) { if (dict.TryGetValue(_languagesKey[language], out string localizedText) && !string.IsNullOrEmpty(localizedText)) { return localizedText; } // Use default if language not found or empty if (dict.TryGetValue(_languagesKey[OctoCore.Instance.Settings.Languages.Default], out string fallbackText) && !string.IsNullOrEmpty(fallbackText)) { if (OctoCore.Instance.Development.Log) Debug.Log($"[OctoLocalization] Use default language for: {data.name}"); return fallbackText; } } if (OctoCore.Instance.Development.Log) Debug.Log($"[OctoLocalization] Empty text for: {data.name}"); return string.Empty; } } }