using System.Globalization; using Connected; using Connected.Data; using Connected.Globalization; using Connected.Globalization.Languages; using Connected.Security.Identity; using Connected.ServiceModel; namespace Common.Globalization; internal class GlobalizationService : IGlobalizationService { private ILanguage _language; private CultureInfo _culture; public GlobalizationService(IIdentityService identityService, ILanguageService languageService) { IdentityService = identityService; LanguageService = languageService; } private IIdentityService IdentityService { get; } private ILanguageService LanguageService { get; } public TimeZoneInfo TimeZone { get { if (!IdentityService.IsAuthenticated || IdentityService.CurrentUser is null) return TimeZoneInfo.Utc; else { try { if (TimeZoneInfo.FindSystemTimeZoneById(IdentityService.CurrentUser.TimeZone) is not TimeZoneInfo timezone) return TimeZoneInfo.Utc; else return timezone; } catch { return TimeZoneInfo.Utc; } } } } public DateTimeOffset Now => FromUtc(DateTimeOffset.UtcNow); public async Task GetCurrentLanguage() { if (_language is null) { if (IdentityService.CurrentUser is not null && IdentityService.CurrentUser.Language > 0) _language = await LanguageService.Select(new PrimaryKeyArgs() { Id = IdentityService.CurrentUser.Language }); if (_language is not null && _language.Status == Status.Disabled) _language = null; } return _language; } public async Task GetCurrentCulture() { if (_culture is null) { if (await GetCurrentLanguage() is not ILanguage language) _culture = Thread.CurrentThread.CurrentUICulture; else { try { if (CultureInfo.GetCultureInfo(language.Lcid) is not CultureInfo culture) _culture = Thread.CurrentThread.CurrentUICulture; } catch { _culture = Thread.CurrentThread.CurrentUICulture; } } } return _culture; } public DateTime FromUtc(DateTime value) { return DateExtensions.FromUtc(value, TimeZone); } public DateTimeOffset FromUtc(DateTimeOffset value) { return DateExtensions.FromUtc(value, TimeZone); } public DateTime ToUtc(DateTime value) { return DateExtensions.ToUtc(value, TimeZone); } public DateTimeOffset ToUtc(DateTimeOffset value) { return DateExtensions.ToUtc(value, TimeZone); } }