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;
}
}
}