From 962488fd349d1bd1e53c755d124b54787303155b Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 23 Jul 2025 14:52:18 -0400 Subject: [PATCH] localize time zone names --- .../OqtaneServiceCollectionExtensions.cs | 1 + .../Modules/Admin/UserProfile/Index.razor | 5 +- .../Resources/TimeZoneResources.resx | 129 ++++++++++++++++++ .../Services/Interfaces/ITimeZoneService.cs | 17 +++ Oqtane.Client/Services/TimeZoneService.cs | 34 +++++ Oqtane.Client/TimeZoneResources.cs | 14 ++ .../OqtaneServiceCollectionExtensions.cs | 1 + Oqtane.Shared/Shared/Utilities.cs | 10 +- 8 files changed, 204 insertions(+), 7 deletions(-) create mode 100644 Oqtane.Client/Resources/TimeZoneResources.resx create mode 100644 Oqtane.Client/Services/Interfaces/ITimeZoneService.cs create mode 100644 Oqtane.Client/Services/TimeZoneService.cs create mode 100644 Oqtane.Client/TimeZoneResources.cs diff --git a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs index c5590d51..eae6ba0f 100644 --- a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs @@ -53,6 +53,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); // providers diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index f993a7c1..95ecbd52 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -9,6 +9,7 @@ @inject INotificationService NotificationService @inject IFileService FileService @inject IFolderService FolderService +@inject ITimeZoneService TimeZoneService @inject IJSRuntime jsRuntime @inject IServiceProvider ServiceProvider @inject IStringLocalizer Localizer @@ -366,7 +367,6 @@ } @code { - private List _timezones; private bool _initialized = false; private string _passwordrequirements; private string _username = string.Empty; @@ -380,6 +380,7 @@ private string _displayname = string.Empty; private FileManager _filemanager; private int _folderid = -1; + private List _timezones; private string _timezoneid = string.Empty; private int _photofileid = -1; private File _photo = null; @@ -403,7 +404,7 @@ _togglepassword = SharedLocalizer["ShowPassword"]; _allowtwofactor = (SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:TwoFactor", "false") == "true"); _profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId); - _timezones = Utilities.GetTimeZones(); + _timezones = TimeZoneService.GetTimeZones(); if (PageState.User != null) { diff --git a/Oqtane.Client/Resources/TimeZoneResources.resx b/Oqtane.Client/Resources/TimeZoneResources.resx new file mode 100644 index 00000000..d736dcea --- /dev/null +++ b/Oqtane.Client/Resources/TimeZoneResources.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + (UTC) Coordinated Universal Time + + + (UTC-05:00) Eastern Time (US & Canada) + + + (UTC-08:00) Pacific Time (US & Canada) + + \ No newline at end of file diff --git a/Oqtane.Client/Services/Interfaces/ITimeZoneService.cs b/Oqtane.Client/Services/Interfaces/ITimeZoneService.cs new file mode 100644 index 00000000..de134838 --- /dev/null +++ b/Oqtane.Client/Services/Interfaces/ITimeZoneService.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using Oqtane.Models; + +namespace Oqtane.Services +{ + /// + /// Service to retrieve entries + /// + public interface ITimeZoneService + { + /// + /// Get the list of time zones + /// + /// + List GetTimeZones(); + } +} diff --git a/Oqtane.Client/Services/TimeZoneService.cs b/Oqtane.Client/Services/TimeZoneService.cs new file mode 100644 index 00000000..f6cab35b --- /dev/null +++ b/Oqtane.Client/Services/TimeZoneService.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.Localization; +using Oqtane.Documentation; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Services +{ + [PrivateApi("Don't show in the documentation, as everything should use the Interface")] + public class TimeZoneService : ITimeZoneService + { + private readonly IStringLocalizer _TimeZoneLocalizer; + + public TimeZoneService(IStringLocalizer TimeZoneLocalizer) + { + _TimeZoneLocalizer = TimeZoneLocalizer; + } + + public List GetTimeZones() + { + var _timezones = new List(); + foreach (var timezone in Utilities.GetTimeZones()) + { + _timezones.Add(new TimeZone + { + Id = timezone.Id, + DisplayName = _TimeZoneLocalizer[timezone.Id] + }); + } + return _timezones.OrderBy(item => item.DisplayName).ToList(); + } + } +} diff --git a/Oqtane.Client/TimeZoneResources.cs b/Oqtane.Client/TimeZoneResources.cs new file mode 100644 index 00000000..cd0125fd --- /dev/null +++ b/Oqtane.Client/TimeZoneResources.cs @@ -0,0 +1,14 @@ +namespace Oqtane +{ + /// + /// Dummy class used to collect shared resource strings for this application + /// + /// + /// This class is mostly used with IStringLocalizer and IHtmlLocalizer interfaces. + /// The class must reside at the project root. + /// + public class TimeZoneResources + { + + } +} diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index 9b4b09e9..98a392cc 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -104,6 +104,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); // providers services.AddScoped(); diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index bf2efe3e..f5faff87 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -695,11 +695,11 @@ namespace Oqtane.Shared public static List GetTimeZones() { return [.. DateTimeZoneProviders.Tzdb.GetAllZones() - .Select(tz => new TimeZone() - { - Id = tz.Id, - DisplayName = tz.ToString() - })]; + .Select(tz => new TimeZone() + { + Id = tz.Id, + DisplayName = tz.Id + })]; } public static bool IsEffectiveAndNotExpired(DateTime? effectiveDate, DateTime? expiryDate)