Add multilingual support with language selector

Introduced a `LanguageControls` component for switching between
languages (`de-DE`, `en-US`, `fr-FR`) and integrated a new
`LocalizationService` to manage language preferences. Updated
`LocalizationController` to handle language persistence via
cookies and support multiple cultures. Enhanced the footer
layout to include the language selector alongside theme
controls.

Added `flag-icons` library for displaying country flags and
configured request localization in `Program.cs`. Styled the
language selector dropdown and improved sender page visuals
with updated CSS. Defaulted language handling to `de-DE` for
fallback scenarios. Cleaned up redundant code in
`LocalizationController`.
This commit is contained in:
2026-09-28 09:19:46 +02:00
parent 5aaa37b8ec
commit 0d2e43b2d6
10 changed files with 218 additions and 10 deletions

View File

@@ -0,0 +1,30 @@
using System.Net;
namespace EnvelopeGenerator.Server.Client.Services;
public class LocalizationService(IHttpClientFactory httpClientFactory)
{
private HttpClient CreateDefaultClient() => httpClientFactory.CreateClient("EnvelopeGenerator.Server");
public async Task<string> GetLanguageAsync(CancellationToken cancel = default)
{
using var http = CreateDefaultClient();
var response = await http.GetAsync("/api/Localization/lang", cancel);
if (response.StatusCode == HttpStatusCode.NotFound)
return "de-DE";
if (!response.IsSuccessStatusCode)
return "de-DE";
var language = await response.Content.ReadAsStringAsync(cancel);
return string.IsNullOrWhiteSpace(language) ? "de-DE" : language.Trim('"');
}
public async Task SetLanguageAsync(string language, CancellationToken cancel = default)
{
using var http = CreateDefaultClient();
var response = await http.PostAsync($"/api/Localization/lang?language={Uri.EscapeDataString(language)}", null, cancel);
response.EnsureSuccessStatusCode();
}
}