75 lines
2.4 KiB
C#
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);
|
|
|
|
}
|
|
} |