Integrierte Mehrsprachigkeit (Deutsch und Englisch) mit Cookie-basierter Sprachauswahl
This commit is contained in:
@@ -11,10 +11,10 @@ using DigitalData.Core.API;
|
||||
using EnvelopeGenerator.Application;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using DigitalData.Core.DTO;
|
||||
using EnvelopeGenerator.Application.Resources;
|
||||
using EnvelopeGenerator.Application.DTOs;
|
||||
using Microsoft.AspNetCore.Localization;
|
||||
using System.Text.Encodings.Web;
|
||||
using EnvelopeGenerator.Web.Models;
|
||||
|
||||
namespace EnvelopeGenerator.Web.Controllers
|
||||
{
|
||||
@@ -26,8 +26,9 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
private readonly IStringLocalizer<Resource> _localizer;
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly UrlEncoder _urlEncoder;
|
||||
private readonly Cultures _cultures;
|
||||
|
||||
public HomeController(DatabaseService databaseService, EnvelopeOldService envelopeOldService, ILogger<HomeController> logger, IEnvelopeReceiverService envelopeReceiverService, IEnvelopeHistoryService historyService, IStringLocalizer<Resource> localizer, IConfiguration configuration, UrlEncoder urlEncoder) : base(databaseService, logger)
|
||||
public HomeController(DatabaseService databaseService, EnvelopeOldService envelopeOldService, ILogger<HomeController> logger, IEnvelopeReceiverService envelopeReceiverService, IEnvelopeHistoryService historyService, IStringLocalizer<Resource> localizer, IConfiguration configuration, UrlEncoder urlEncoder, Cultures cultures) : base(databaseService, logger)
|
||||
{
|
||||
this.envelopeOldService = envelopeOldService;
|
||||
_envRcvService = envelopeReceiverService;
|
||||
@@ -35,6 +36,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
_localizer = localizer;
|
||||
_configuration = configuration;
|
||||
_urlEncoder = urlEncoder;
|
||||
_cultures = cultures;
|
||||
}
|
||||
|
||||
[HttpGet("EnvelopeKey/{envelopeReceiverId}")]
|
||||
@@ -68,7 +70,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception:ex, message: _localizer[MessageKey.UnexpectedError]);
|
||||
_logger.LogEnvelopeError(envelopeEeceiverId: envelopeReceiverId, exception:ex, message: _localizer[WebKey.UnexpectedError]);
|
||||
return this.ViewInnerServiceError();
|
||||
}
|
||||
}
|
||||
@@ -79,7 +81,6 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
try
|
||||
{
|
||||
envelopeReceiverId = _urlEncoder.Encode(envelopeReceiverId);
|
||||
ViewData["Languages"] = _configuration.GetSection("Languages").Get<string[]>()!;
|
||||
ViewData["UserLanguage"] = UserLanguage;
|
||||
|
||||
return await _envRcvService.IsExisting(envelopeReceiverId: envelopeReceiverId).ThenAsync(
|
||||
@@ -107,7 +108,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
|
||||
if(uuid is null || signature is null)
|
||||
{
|
||||
_logger.LogEnvelopeError(uuid: uuid, signature: signature, message: _localizer[MessageKey.WrongEnvelopeReceiverId]);
|
||||
_logger.LogEnvelopeError(uuid: uuid, signature: signature, message: _localizer[WebKey.WrongEnvelopeReceiverId]);
|
||||
return Unauthorized();
|
||||
}
|
||||
|
||||
@@ -229,50 +230,75 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
[NonAction]
|
||||
public IActionResult GetLanguage() => Ok(UserLanguage);
|
||||
|
||||
[HttpPost("lang")]
|
||||
public IActionResult SetLanguage([FromForm] string language)
|
||||
[HttpPost("lang/{language}")]
|
||||
public IActionResult SetLanguage([FromRoute] string language)
|
||||
{
|
||||
try
|
||||
{
|
||||
language = _urlEncoder.Encode(language);
|
||||
var cookieOptions = new CookieOptions()
|
||||
if (Languages is null)
|
||||
{
|
||||
Expires = DateTimeOffset.UtcNow.AddYears(1),
|
||||
Secure = false,
|
||||
Path = "/",
|
||||
SameSite = SameSiteMode.Strict,
|
||||
HttpOnly = true
|
||||
};
|
||||
_logger.LogWarning("There is no language assigned under languages key in appesettings.json");
|
||||
return StatusCode(statusCode: StatusCodes.Status500InternalServerError);
|
||||
}
|
||||
else if (!language.Contains(language))
|
||||
return BadRequest();
|
||||
|
||||
Response.Cookies.Append(
|
||||
CookieRequestCultureProvider.DefaultCookieName,
|
||||
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(language)),
|
||||
cookieOptions);
|
||||
language = _urlEncoder.Encode(language);
|
||||
|
||||
UserLanguage = language;
|
||||
|
||||
return Redirect(Request.Headers["Referer"].ToString());
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, ex.Message);
|
||||
return this.ViewEnvelopeNotFound();
|
||||
_logger.LogError(ex, "{Message}", ex.Message);
|
||||
return StatusCode(statusCode: StatusCodes.Status500InternalServerError);
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("lang")]
|
||||
public IActionResult GetLanguages()
|
||||
{
|
||||
if(Languages is null)
|
||||
{
|
||||
_logger.LogWarning("There is no language assigned under languages key in appesettings.json");
|
||||
return StatusCode(statusCode: StatusCodes.Status500InternalServerError);
|
||||
}
|
||||
else
|
||||
return Ok(Languages);
|
||||
}
|
||||
|
||||
private string UserLanguage
|
||||
{
|
||||
get
|
||||
{
|
||||
return Request.Cookies[CookieRequestCultureProvider.DefaultCookieName] ?? _configuration.GetSection("Languages").Get<string[]>()![0];
|
||||
var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName];
|
||||
|
||||
if (string.IsNullOrEmpty(cookieValue))
|
||||
return _cultures.Default.Language;
|
||||
|
||||
var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0];
|
||||
return culture?.Value ?? _cultures.Default.Language;
|
||||
}
|
||||
set
|
||||
{
|
||||
Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)), new CookieOptions()
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
private string[]? Languages => _configuration.GetSection("Languages").Get<string[]>();
|
||||
|
||||
public IActionResult Error404() => this.ViewError404();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user