using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; using System.IO; using System.Text; namespace zero.Backoffice.Services; public class ResourceService : IResourceService { protected IOptions Options { get; set; } protected IBackofficeAssetFileSystem FileSystem { get; set; } protected ILogger Logger { get; set; } protected IEnumerable Plugins { get; set; } public ResourceService(IOptions options, IBackofficeAssetFileSystem fileSystem, ILogger logger, IEnumerable plugins) { Options = options; FileSystem = fileSystem; Logger = logger; Plugins = plugins; } /// public Task> GetTranslations(string cultureIsoCode) { var zeroTranslations = CreateTranslationsForFile("O:/zero/zero.Backoffice/Resources/Localization/zero.en-us.json", cultureIsoCode); // TODO foreach (IZeroPlugin plugin in Plugins) { if (plugin.Options.LocalizationPaths.Count > 0) { foreach (string path in plugin.Options.LocalizationPaths) { Dictionary translations = CreateTranslationsForFile(path, cultureIsoCode); foreach (var translation in translations) { zeroTranslations.Add(translation.Key, translation.Value); } } } } return Task.FromResult(zeroTranslations); } Dictionary CreateTranslationsForFile(string path, string culture) { Dictionary items = new(); culture = culture?.ToLower(); if (!culture.IsNullOrEmpty() && culture != "en-us") { items = CreateTranslationsForFile(path, "en-us"); path = path.Replace("en-us", culture); } if (!File.Exists(path)) { return items; } string text = File.ReadAllText(path, Encoding.GetEncoding("ISO-8859-1")); JObject json = JObject.Parse(text); IEnumerable tokens = json.Descendants().Where(p => !p.Any()); Dictionary translationItems = tokens.Aggregate(new Dictionary(), (properties, token) => { properties.Add(token.Path.ToLowerInvariant(), token.ToString()); return properties; }); foreach (var translation in translationItems) { items[translation.Key] = translation.Value; } return items; } } public interface IResourceService { /// /// Get all backoffice translations from all registered plugins /// Task> GetTranslations(string cultureIsoCode); }