Neg_Utils/NEG/Localization/LocalizationManager.cs
2023-02-06 16:13:58 +01:00

75 lines
2.4 KiB
C#

using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace NEG.Localization
{
[PublicAPI]
public class LocalizationManager
{
private class AvailableLanguages
{
public List<string> Languages { get; set; }
}
public const string LanguageResourcePath = "Localization";
public const string ResourcesFolderPath = "Data/Resources";
public const string AvailableLanguagesFile = "Languages";
public static LocalizationManager Instance => instance ??= new LocalizationManager();
public IEnumerable<string> Languages => languages;
private static LocalizationManager instance;
private List<string> languages;
private HashSet<Action<LocalizationProvider>> actions = new();
private LocalizationProvider provider;
public LocalizationManager()
{
var file = Resources.Load<TextAsset>($"{LanguageResourcePath}/{AvailableLanguagesFile}");
var available = JsonConvert.DeserializeObject<AvailableLanguages>(file.text);
languages = available.Languages;
}
public void SelectLanguage(string languageCode)
{
if (!languages.Contains(languageCode))
{
Debug.LogError($"Localization {languageCode} not found in files");
return;
}
provider = new LocalizationProvider($"{LanguageResourcePath}/{languageCode}");
foreach (var item in actions)
{
item?.Invoke(provider);
}
}
/// <summary>
/// Register action for localization. Always fire provided action
/// </summary>
/// <param name="action">action to call on localization change</param>
public static void Register(Action<LocalizationProvider> action)
{
if (!Instance.actions.Contains(action))
{
Instance.actions.Add(action);
}
action.Invoke(Instance.provider);
}
/// <summary>
/// Unregister action from localization.
/// </summary>
/// <param name="action">action to unregister</param>
public static void Unregister(Action<LocalizationProvider> action) => Instance.actions.Remove(action);
}
}