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 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 Languages => languages; private static LocalizationManager instance; private List languages; private HashSet> actions = new(); private LocalizationProvider provider; public LocalizationManager() { var file = Resources.Load($"{LanguageResourcePath}/{AvailableLanguagesFile}"); var available = JsonConvert.DeserializeObject(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); } } /// /// Register action for localization. Always fire provided action /// /// action to call on localization change public static void Register(Action action) { if (!Instance.actions.Contains(action)) { Instance.actions.Add(action); } action.Invoke(Instance.provider); } /// /// Unregister action from localization. /// /// action to unregister public static void Unregister(Action action) => Instance.actions.Remove(action); } }