using DigitalData.Core.API; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Common; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Localization; namespace EnvelopeGenerator.GeneratorAPI.Controllers; /// /// Controller für die Verwaltung der Lokalisierung und Spracheinstellungen. /// [Route("api/[controller]")] [ApiController] public class LocalizationController : ControllerBase { private static readonly Guid L_KEY = Guid.NewGuid(); private readonly ILogger _logger; private readonly IStringLocalizer _mLocalizer; private readonly IStringLocalizer _localizer; private readonly IMemoryCache _cache; /// /// Konstruktor für den . /// /// Logger für die Protokollierung. /// Lokalisierungsdienst für Ressourcen. /// Speicher-Cache für die Zwischenspeicherung von Daten. /// Lokalisierungsdienst für Modelle. public LocalizationController( ILogger logger, IStringLocalizer localizer, IMemoryCache memoryCache, IStringLocalizer _modelLocalizer) { _logger = logger; _localizer = localizer; _cache = memoryCache; _mLocalizer = _modelLocalizer; } /// /// Ruft alle lokalisierten Daten ab. /// /// Eine Liste aller lokalisierten Daten. [HttpGet] public IActionResult GetAll() => Ok(_cache.GetOrCreate(Language ?? string.Empty + L_KEY, _ => _mLocalizer.ToDictionary())); /// /// Ruft die aktuelle Sprache ab. /// /// Die aktuelle Sprache oder ein NotFound-Ergebnis, wenn keine Sprache gesetzt ist. [HttpGet("lang")] public IActionResult GetLanguage() => Language is null ? NotFound() : Ok(Language); /// /// Setzt die Sprache. /// /// Die zu setzende Sprache. /// Ein Ok-Ergebnis, wenn die Sprache erfolgreich gesetzt wurde, oder ein BadRequest-Ergebnis, wenn die Eingabe ungültig ist. [HttpPost("lang")] public IActionResult SetLanguage([FromQuery] string language) { if (string.IsNullOrEmpty(language)) return BadRequest(); Language = language; return Ok(); } /// /// Löscht die aktuelle Sprache. /// /// Ein Ok-Ergebnis, wenn die Sprache erfolgreich gelöscht wurde. [HttpDelete("lang")] public IActionResult DeleteLanguage() { Language = null; return Ok(); } /// /// Eigenschaft für die Verwaltung der aktuellen Sprache über Cookies. /// private string? Language { get { var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName]; if (string.IsNullOrEmpty(cookieValue)) return null; var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0]; return culture?.Value ?? null; } set { if (value is null) Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName); else { var cookieOptions = new CookieOptions() { Expires = DateTimeOffset.UtcNow.AddYears(1), Secure = false, SameSite = SameSiteMode.Strict, HttpOnly = true }; Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)), cookieOptions); } } } }