160 lines
5.3 KiB
C#
160 lines
5.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
namespace OctoCore.Localization
|
|
{
|
|
/// <summary>
|
|
/// Localization module for managing text and audio languages.
|
|
/// Handles language switching and provides localized text retrieval.
|
|
/// </summary>
|
|
[System.Serializable]
|
|
public class OctoLocalization : IOctoModule
|
|
{
|
|
public OctoLanguages WrittenLanguage;
|
|
public OctoLanguages AudioLanguage;
|
|
|
|
private Action OnLanguageWrittenChange;
|
|
private Action OnLanguageAudioChange;
|
|
|
|
private static Dictionary<OctoLanguages, string> _languagesKey = new Dictionary<OctoLanguages, string>();
|
|
|
|
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;
|
|
}
|
|
}
|
|
} |