Introduces a caching mechanism for localization JSON documents to improve performance Prevents repeated file reads by storing parsed JSON documents in memory Adds GetDocument method to manage document retrieval and caching Reduces file system I/O overhead for localization translations
61 lines
1.7 KiB
C#
61 lines
1.7 KiB
C#
using System.Text.Json;
|
|
using PlanTempus.Application.Features.Localization.Models;
|
|
|
|
namespace PlanTempus.Application.Features.Localization.Services;
|
|
|
|
public class JsonLocalizationService : ILocalizationService
|
|
{
|
|
private readonly string _translationsPath;
|
|
private readonly Dictionary<string, JsonDocument> _cache = new();
|
|
|
|
public JsonLocalizationService(IWebHostEnvironment env)
|
|
{
|
|
_translationsPath = Path.Combine(env.ContentRootPath, "Features", "Localization", "Translations");
|
|
}
|
|
|
|
public string CurrentCulture => "da";
|
|
|
|
public string Get(string key, string? culture = null)
|
|
{
|
|
culture ??= CurrentCulture;
|
|
var doc = GetDocument(culture);
|
|
|
|
if (doc == null)
|
|
return key;
|
|
|
|
var parts = key.Split('.');
|
|
JsonElement current = doc.RootElement;
|
|
|
|
foreach (var part in parts)
|
|
if (!current.TryGetProperty(part, out current))
|
|
return key;
|
|
|
|
return current.GetString() ?? key;
|
|
}
|
|
|
|
private JsonDocument? GetDocument(string culture)
|
|
{
|
|
if (_cache.TryGetValue(culture, out var cached))
|
|
return cached;
|
|
|
|
var filePath = Path.Combine(_translationsPath, $"{culture}.json");
|
|
|
|
if (!File.Exists(filePath))
|
|
return null;
|
|
|
|
var json = File.ReadAllText(filePath);
|
|
var doc = JsonDocument.Parse(json);
|
|
_cache[culture] = doc;
|
|
|
|
return doc;
|
|
}
|
|
|
|
public IEnumerable<SupportedCulture> GetSupportedCultures()
|
|
{
|
|
return new List<SupportedCulture>
|
|
{
|
|
new() { Code = "da", Name = "Danish", NativeName = "Dansk" },
|
|
new() { Code = "en", Name = "English", NativeName = "English" }
|
|
};
|
|
}
|
|
}
|