Files
mixtape/zero.Core/Localization/CultureResolver.cs
T

110 lines
3.1 KiB
C#
Raw Normal View History

2021-11-20 13:52:28 +01:00
using FluentValidation;
using Microsoft.Extensions.Logging;
using Raven.Client.Documents;
2022-01-24 01:59:26 +01:00
using Raven.Client.Documents.Session;
2021-11-20 13:52:28 +01:00
using System.Globalization;
2022-01-24 01:59:26 +01:00
using System.Security.Claims;
2021-11-20 13:52:28 +01:00
namespace zero.Localization;
public class CultureResolver : ICultureResolver
{
protected ILogger<CultureResolver> Logger { get; private set; }
public CultureResolver(ILogger<CultureResolver> logger)
{
Logger = logger;
}
/// <inheritdoc />
2022-01-24 01:59:26 +01:00
public async Task<CultureInfo> Resolve(IZeroContext context)
2021-11-20 13:52:28 +01:00
{
// TODO this is just fake, we need to correctly resolve culture here
if (context.IsBackofficeRequest)
{
2022-01-24 01:59:26 +01:00
if (context.IsLoggedIntoBackoffice)
{
ZeroUser user = await GetBackofficeUser(context.Store, context.BackofficeUser);
string cultureCode = user?.LanguageId.Or("en-US");
2021-11-20 13:52:28 +01:00
2022-01-24 01:59:26 +01:00
try
{
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureCode);
if (culture.ThreeLetterISOLanguageName.IsNullOrEmpty())
{
throw new Exception("ThreeLetterISOLanguageName is empty");
}
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
ValidatorOptions.Global.LanguageManager.Culture = culture;
}
catch (Exception ex)
{
Logger.LogError(ex, "Could not create culture from Language code {code}", cultureCode);
return CultureInfo.CurrentCulture;
}
}
2021-11-20 13:52:28 +01:00
}
else
{
//var session = context.Store.Session();
//Language language = await session.Query<Language>().FirstOrDefaultAsync();
Language language = new() { Code = "de-DE" };
2021-11-20 13:52:28 +01:00
if (language == null)
{
Logger.LogWarning("Could not set request culture as there is no available Language stored");
2022-01-24 01:59:26 +01:00
return CultureInfo.CurrentCulture;
2021-11-20 13:52:28 +01:00
}
try
{
CultureInfo culture = CultureInfo.CreateSpecificCulture(language.Code);
if (culture.ThreeLetterISOLanguageName.IsNullOrEmpty())
{
throw new Exception("ThreeLetterISOLanguageName is empty");
}
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
ValidatorOptions.Global.LanguageManager.Culture = culture;
}
catch (Exception ex)
{
Logger.LogError(ex, "Could not create culture from Language code {code}", language.Code);
2022-01-24 01:59:26 +01:00
return CultureInfo.CurrentCulture;
2021-11-20 13:52:28 +01:00
}
}
2022-01-24 01:59:26 +01:00
return CultureInfo.CurrentCulture;
}
/// <summary>
/// Get backoffice user from claims principal
/// </summary>
async Task<ZeroUser> GetBackofficeUser(IZeroStore store, ClaimsPrincipal user)
{
string userId = user.FindFirstValue(Constants.Auth.Claims.UserId);
IAsyncDocumentSession session = store.Session(global: true);
return await session.LoadAsync<ZeroUser>(userId);
2021-11-20 13:52:28 +01:00
}
}
public interface ICultureResolver
{
/// <summary>
/// Resolves the current application from either the backoffice user (in case it is backoffice request)
/// or the domain (in case it is frontend request).
/// </summary>
Task<CultureInfo> Resolve(IZeroContext context);
}