From 418c9888c46547b2d4a65c0e9bec39650463fce2 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 01:38:00 +0300 Subject: [PATCH 01/44] Add LocalizationController --- .../Controllers/LocalizationController.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Oqtane.Server/Controllers/LocalizationController.cs diff --git a/Oqtane.Server/Controllers/LocalizationController.cs b/Oqtane.Server/Controllers/LocalizationController.cs new file mode 100644 index 00000000..f8b7433a --- /dev/null +++ b/Oqtane.Server/Controllers/LocalizationController.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using Oqtane.Infrastructure; +using Oqtane.Shared; + +namespace Oqtane.Controllers +{ + [Route(ControllerRoutes.Default)] + public class LocalizationController : Controller + { + private readonly ILocalizationManager _localizationManager; + + public LocalizationController(ILocalizationManager localizationManager) + { + _localizationManager = localizationManager; + } + + // GET: api/localization/getSupportedCultures + [HttpGet("getSupportedCultures")] + public IEnumerable GetSupportedCultures() => _localizationManager.GetSupportedCultures(); + + // GET api/localization/getDefaultCulture + [HttpGet("getDefaultCulture")] + public string GetDefaultCulture() => _localizationManager.GetDefaultCulture(); + } +} From c67e893b6ea8cb5da6917cfed99988737d6d1412 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 01:38:32 +0300 Subject: [PATCH 02/44] Add LocalizationService APIs --- .../Interfaces/ILocalizationService.cs | 11 ++++++++++ Oqtane.Client/Services/LocalizationService.cs | 22 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 Oqtane.Client/Services/Interfaces/ILocalizationService.cs create mode 100644 Oqtane.Client/Services/LocalizationService.cs diff --git a/Oqtane.Client/Services/Interfaces/ILocalizationService.cs b/Oqtane.Client/Services/Interfaces/ILocalizationService.cs new file mode 100644 index 00000000..c025ee45 --- /dev/null +++ b/Oqtane.Client/Services/Interfaces/ILocalizationService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace Oqtane.Services +{ + public interface ILocalizationService + { + Task GetDefaultCulture(); + + Task GetSupportedCultures(); + } +} diff --git a/Oqtane.Client/Services/LocalizationService.cs b/Oqtane.Client/Services/LocalizationService.cs new file mode 100644 index 00000000..4c658c50 --- /dev/null +++ b/Oqtane.Client/Services/LocalizationService.cs @@ -0,0 +1,22 @@ +using System.Net.Http; +using System.Threading.Tasks; +using Oqtane.Shared; + +namespace Oqtane.Services +{ + public class LocalizationService : ServiceBase, ILocalizationService + { + private readonly SiteState _siteState; + + public LocalizationService(HttpClient http, SiteState siteState) : base(http) + { + _siteState = siteState; + } + + private string Apiurl => CreateApiUrl(_siteState.Alias, "Localization"); + + public async Task GetDefaultCulture() => await GetJsonAsync($"{Apiurl}/getDefaultCulture"); + + public async Task GetSupportedCultures() => await GetJsonAsync($"{Apiurl}/getSupportedCultures"); + } +} From c4d1b16abb16f713a950d37325e4d14bcc68edd1 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 01:52:46 +0300 Subject: [PATCH 03/44] Add LanguageSwitcher component --- Oqtane.Client/Program.cs | 5 ++-- .../Themes/Controls/ControlPanel.razor | 2 ++ .../Themes/Controls/LanguageSwitcher.razor | 30 +++++++++++++++++++ Oqtane.Server/Pages/_Host.cshtml | 6 ++++ Oqtane.Server/Startup.cs | 1 + 5 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 Oqtane.Client/Themes/Controls/LanguageSwitcher.razor diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index af283cec..7fdfa6bd 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -5,15 +5,15 @@ using System.IO.Compression; using System.Linq; using System.Net.Http; using System.Reflection; -using System.Threading.Tasks; using System.Runtime.Loader; +using System.Threading.Tasks; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.DependencyInjection; using Oqtane.Modules; using Oqtane.Providers; -using Oqtane.Shared; using Oqtane.Services; +using Oqtane.Shared; namespace Oqtane.Client { @@ -62,6 +62,7 @@ namespace Oqtane.Client builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); await LoadClientAssemblies(httpClient); diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index 02ae862c..0ea20a8a 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -198,6 +198,8 @@ } + + @if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions) || (PageState.Page.IsPersonalizable && PageState.User != null)) { if (PageState.EditMode) diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor new file mode 100644 index 00000000..3b630a7a --- /dev/null +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -0,0 +1,30 @@ +@namespace Oqtane.Themes.Controls +@inherits ThemeControlBase +@using System.Globalization +@inject ILocalizationService LocalizationService + +@if (_supportedCultures != null) +{ +
+ + +
+} + +@code{ + private string _selectedCulture; + private string[] _supportedCultures; + + protected override async Task OnParametersSetAsync() + { + _selectedCulture = await JSRuntime.InvokeAsync("oqtaneCulture.get"); + _supportedCultures = await LocalizationService.GetSupportedCultures(); + } +} diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index 2aa0dd9d..92dea6bc 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -48,6 +48,12 @@ @if (Configuration.GetSection("Runtime").Value == "WebAssembly") { + } else { diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index b008ee30..b134a19e 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -127,6 +127,7 @@ namespace Oqtane services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddSingleton(); From 75556070d6138e65e3982de1a5a36f8ef0954a96 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 02:04:34 +0300 Subject: [PATCH 04/44] Ability to change culture --- Oqtane.Client/Oqtane.Client.csproj | 1 + Oqtane.Client/Program.cs | 10 ++++++++++ Oqtane.Client/Themes/Controls/LanguageSwitcher.razor | 12 ++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index 3ce83439..da11a472 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -17,6 +17,7 @@ https://github.com/oqtane/oqtane.framework/releases/tag/v2.0.0 Oqtane true + true diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index 7fdfa6bd..6689db41 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; @@ -10,6 +11,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.DependencyInjection; +using Microsoft.JSInterop; using Oqtane.Modules; using Oqtane.Providers; using Oqtane.Services; @@ -89,6 +91,14 @@ namespace Oqtane.Client } var host = builder.Build(); + var jsRuntime = host.Services.GetRequiredService(); + var culture = await jsRuntime.InvokeAsync("oqtaneCulture.get"); + if (culture != null) + { + var cultureInfo = CultureInfo.GetCultureInfo(culture); + CultureInfo.DefaultThreadCurrentCulture = cultureInfo; + CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; + } ServiceActivator.Configure(host.Services); diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index 3b630a7a..8ce1c52d 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -2,6 +2,7 @@ @inherits ThemeControlBase @using System.Globalization @inject ILocalizationService LocalizationService +@inject NavigationManager NavigationManager @if (_supportedCultures != null) { @@ -12,7 +13,7 @@ @@ -24,7 +25,14 @@ protected override async Task OnParametersSetAsync() { - _selectedCulture = await JSRuntime.InvokeAsync("oqtaneCulture.get"); + _selectedCulture = _selectedCulture = await JSRuntime.InvokeAsync("oqtaneCulture.get"); _supportedCultures = await LocalizationService.GetSupportedCultures(); } + + private async Task SetCultureAsync(string culture) + { + await JSRuntime.InvokeVoidAsync("oqtaneCulture.set", culture); + + NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); + } } From 330499dda5c86c219783fc68a8778d605d238370 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 02:10:01 +0300 Subject: [PATCH 05/44] Use Interop --- Oqtane.Client/Program.cs | 4 ++- .../Themes/Controls/LanguageSwitcher.razor | 6 ++-- Oqtane.Client/UI/Interop.cs | 29 ++++++++++++++++++- Oqtane.Server/Pages/_Host.cshtml | 8 +---- Oqtane.Server/wwwroot/js/interop.js | 6 ++++ 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index 6689db41..43dc617a 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -16,6 +16,7 @@ using Oqtane.Modules; using Oqtane.Providers; using Oqtane.Services; using Oqtane.Shared; +using Oqtane.UI; namespace Oqtane.Client { @@ -92,7 +93,8 @@ namespace Oqtane.Client var host = builder.Build(); var jsRuntime = host.Services.GetRequiredService(); - var culture = await jsRuntime.InvokeAsync("oqtaneCulture.get"); + var interop = new Interop(jsRuntime); + var culture = await interop.getCulture(); if (culture != null) { var cultureInfo = CultureInfo.GetCultureInfo(culture); diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index 8ce1c52d..ddde387b 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -25,13 +25,15 @@ protected override async Task OnParametersSetAsync() { - _selectedCulture = _selectedCulture = await JSRuntime.InvokeAsync("oqtaneCulture.get"); + var interop = new Interop(JSRuntime); + _selectedCulture = await interop.getCulture(); _supportedCultures = await LocalizationService.GetSupportedCultures(); } private async Task SetCultureAsync(string culture) { - await JSRuntime.InvokeVoidAsync("oqtaneCulture.set", culture); + var interop = new Interop(JSRuntime); + await interop.setCulture(culture); NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); } diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 53b8df4f..83a88ad5 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -1,4 +1,4 @@ -using Microsoft.JSInterop; +using Microsoft.JSInterop; using Oqtane.Models; using System.Threading.Tasks; @@ -234,5 +234,32 @@ namespace Oqtane.UI } } + public async Task getCulture() + { + try + { + var culture = await _jsRuntime.InvokeAsync("Oqtane.Interop.getCulture"); + + return culture; + } + catch + { + return null; + } + } + + public Task setCulture(string culture) + { + try + { + _jsRuntime.InvokeVoidAsync("Oqtane.Interop.setCulture", culture); + + return Task.CompletedTask; + } + catch + { + return Task.CompletedTask; + } + } } } diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index 92dea6bc..ecf906e4 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -1,4 +1,4 @@ -@page "/" +@page "/" @namespace Oqtane.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @using System.Globalization @@ -48,12 +48,6 @@ @if (Configuration.GetSection("Runtime").Value == "WebAssembly") { - } else { diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index 2e4092e4..dc3f0394 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -362,5 +362,11 @@ Oqtane.Interop = { setInterval(function () { window.location.href = url; }, wait * 1000); + }, + getCulture: function () { + return window.localStorage['OqtaneCulture']; + }, + setCulture: function (culture) { + window.localStorage['OqtaneCulture'] = culture; } }; From d4dd80ff3252fc432036b7b2098353ddf27bd79d Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 02:15:52 +0300 Subject: [PATCH 06/44] Add missing event args --- Oqtane.Client/Themes/Controls/LanguageSwitcher.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index ddde387b..9c67f24c 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -13,7 +13,7 @@ From fa3cc48fd0a5fc782102a6978acc0934a04610e8 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 2 Dec 2020 02:19:47 +0300 Subject: [PATCH 07/44] Avoid to select the current selected culture --- Oqtane.Client/Themes/Controls/LanguageSwitcher.razor | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index 9c67f24c..e14e8a8e 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -32,9 +32,12 @@ private async Task SetCultureAsync(string culture) { - var interop = new Interop(JSRuntime); - await interop.setCulture(culture); + if (culture != CultureInfo.CurrentUICulture.Name) + { + var interop = new Interop(JSRuntime); + await interop.setCulture(culture); - NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); + NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); + } } } From 1b3cc2c44e04414d75158d007841f806e0d0760e Mon Sep 17 00:00:00 2001 From: hishamco Date: Thu, 3 Dec 2020 13:37:18 +0300 Subject: [PATCH 08/44] Interop local storage APIs should be generic --- Oqtane.Client/Program.cs | 2 +- Oqtane.Client/Themes/Controls/LanguageSwitcher.razor | 4 ++-- Oqtane.Client/UI/Interop.cs | 10 +++++----- Oqtane.Server/wwwroot/js/interop.js | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index 43dc617a..fcc03099 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -94,7 +94,7 @@ namespace Oqtane.Client var host = builder.Build(); var jsRuntime = host.Services.GetRequiredService(); var interop = new Interop(jsRuntime); - var culture = await interop.getCulture(); + var culture = await interop.GetLocalStorage("OqtaneCulture"); if (culture != null) { var cultureInfo = CultureInfo.GetCultureInfo(culture); diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index e14e8a8e..4b0a3acd 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -26,7 +26,7 @@ protected override async Task OnParametersSetAsync() { var interop = new Interop(JSRuntime); - _selectedCulture = await interop.getCulture(); + _selectedCulture = await interop.GetLocalStorage("OqtaneCulture"); _supportedCultures = await LocalizationService.GetSupportedCultures(); } @@ -35,7 +35,7 @@ if (culture != CultureInfo.CurrentUICulture.Name) { var interop = new Interop(JSRuntime); - await interop.setCulture(culture); + await interop.SetLocalStorage("OqtaneCulture", culture); NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); } diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 83a88ad5..10c37d44 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -234,13 +234,13 @@ namespace Oqtane.UI } } - public async Task getCulture() + public async Task GetLocalStorage(string name) { try { - var culture = await _jsRuntime.InvokeAsync("Oqtane.Interop.getCulture"); + var value = await _jsRuntime.InvokeAsync("Oqtane.Interop.getLocalStorage", name); - return culture; + return value; } catch { @@ -248,11 +248,11 @@ namespace Oqtane.UI } } - public Task setCulture(string culture) + public Task SetLocalStorage(string name, string value) { try { - _jsRuntime.InvokeVoidAsync("Oqtane.Interop.setCulture", culture); + _jsRuntime.InvokeVoidAsync("Oqtane.Interop.setLocalStorage", name, value); return Task.CompletedTask; } diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index dc3f0394..e71f4b81 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -363,10 +363,10 @@ Oqtane.Interop = { window.location.href = url; }, wait * 1000); }, - getCulture: function () { - return window.localStorage['OqtaneCulture']; + getLocalStorage: function (name) { + return window.localStorage[name]; }, - setCulture: function (culture) { - window.localStorage['OqtaneCulture'] = culture; + setLocalStorage: function (name, value) { + window.localStorage[name] = value; } }; From a37eb8a44a68147b7f77e77c0cf3f1c755238c61 Mon Sep 17 00:00:00 2001 From: hishamco Date: Thu, 3 Dec 2020 14:05:49 +0300 Subject: [PATCH 09/44] Introduce Culture model to avoid CultureInfo.DisplayName issue --- .../Interfaces/ILocalizationService.cs | 6 ++++-- Oqtane.Client/Services/LocalizationService.cs | 7 +++++-- .../Themes/Controls/LanguageSwitcher.razor | 7 ++++--- .../Controllers/LocalizationController.cs | 20 +++++++++++++++++-- Oqtane.Shared/Models/Culture.cs | 9 +++++++++ 5 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 Oqtane.Shared/Models/Culture.cs diff --git a/Oqtane.Client/Services/Interfaces/ILocalizationService.cs b/Oqtane.Client/Services/Interfaces/ILocalizationService.cs index c025ee45..8a580cc6 100644 --- a/Oqtane.Client/Services/Interfaces/ILocalizationService.cs +++ b/Oqtane.Client/Services/Interfaces/ILocalizationService.cs @@ -1,11 +1,13 @@ +using System.Collections.Generic; using System.Threading.Tasks; +using Oqtane.Models; namespace Oqtane.Services { public interface ILocalizationService { - Task GetDefaultCulture(); + Task GetDefaultCulture(); - Task GetSupportedCultures(); + Task> GetSupportedCultures(); } } diff --git a/Oqtane.Client/Services/LocalizationService.cs b/Oqtane.Client/Services/LocalizationService.cs index 4c658c50..ea6e5fd8 100644 --- a/Oqtane.Client/Services/LocalizationService.cs +++ b/Oqtane.Client/Services/LocalizationService.cs @@ -1,5 +1,7 @@ +using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; +using Oqtane.Models; using Oqtane.Shared; namespace Oqtane.Services @@ -15,8 +17,9 @@ namespace Oqtane.Services private string Apiurl => CreateApiUrl(_siteState.Alias, "Localization"); - public async Task GetDefaultCulture() => await GetJsonAsync($"{Apiurl}/getDefaultCulture"); + public async Task GetDefaultCulture() => await GetJsonAsync($"{Apiurl}/getDefaultCulture"); - public async Task GetSupportedCultures() => await GetJsonAsync($"{Apiurl}/getSupportedCultures"); + public async Task> GetSupportedCultures() + => await GetJsonAsync>($"{Apiurl}/getSupportedCultures"); } } diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index 4b0a3acd..7c3ca1d2 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -1,6 +1,7 @@ @namespace Oqtane.Themes.Controls @inherits ThemeControlBase -@using System.Globalization +@using System.Globalization +@using Oqtane.Models @inject ILocalizationService LocalizationService @inject NavigationManager NavigationManager @@ -13,7 +14,7 @@ @@ -21,7 +22,7 @@ @code{ private string _selectedCulture; - private string[] _supportedCultures; + private IEnumerable _supportedCultures; protected override async Task OnParametersSetAsync() { diff --git a/Oqtane.Server/Controllers/LocalizationController.cs b/Oqtane.Server/Controllers/LocalizationController.cs index f8b7433a..46e475ef 100644 --- a/Oqtane.Server/Controllers/LocalizationController.cs +++ b/Oqtane.Server/Controllers/LocalizationController.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; +using System.Globalization; +using System.Linq; using Microsoft.AspNetCore.Mvc; using Oqtane.Infrastructure; +using Oqtane.Models; using Oqtane.Shared; namespace Oqtane.Controllers @@ -17,10 +20,23 @@ namespace Oqtane.Controllers // GET: api/localization/getSupportedCultures [HttpGet("getSupportedCultures")] - public IEnumerable GetSupportedCultures() => _localizationManager.GetSupportedCultures(); + public IEnumerable GetSupportedCultures() + => _localizationManager.GetSupportedCultures().Select(c => new Culture { + Name = CultureInfo.GetCultureInfo(c).Name, + DisplayName = CultureInfo.GetCultureInfo(c).DisplayName + }); // GET api/localization/getDefaultCulture [HttpGet("getDefaultCulture")] - public string GetDefaultCulture() => _localizationManager.GetDefaultCulture(); + public Culture GetDefaultCulture() + { + var culture = _localizationManager.GetDefaultCulture(); + + return new Culture + { + Name = CultureInfo.GetCultureInfo(culture).Name, + DisplayName = CultureInfo.GetCultureInfo(culture).DisplayName + }; + } } } diff --git a/Oqtane.Shared/Models/Culture.cs b/Oqtane.Shared/Models/Culture.cs new file mode 100644 index 00000000..78d249d6 --- /dev/null +++ b/Oqtane.Shared/Models/Culture.cs @@ -0,0 +1,9 @@ +namespace Oqtane.Models +{ + public class Culture + { + public string Name { get; set; } + + public string DisplayName { get; set; } + } +} From 5ee38e4ae753f10f8c146f7aded7174014e315d7 Mon Sep 17 00:00:00 2001 From: hishamco Date: Thu, 3 Dec 2020 14:13:01 +0300 Subject: [PATCH 10/44] Add Visible property to control the visibility --- Oqtane.Client/Themes/Controls/LanguageSwitcher.razor | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index 7c3ca1d2..c8e7bfb9 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -5,7 +5,7 @@ @inject ILocalizationService LocalizationService @inject NavigationManager NavigationManager -@if (_supportedCultures != null) +@if (_supportedCultures != null && Visible) {
} @code{ - private string _selectedCulture; private IEnumerable _supportedCultures; [Parameter] @@ -29,8 +28,6 @@ protected override async Task OnParametersSetAsync() { - var interop = new Interop(JSRuntime); - _selectedCulture = await interop.GetLocalStorage("OqtaneCulture"); _supportedCultures = await LocalizationService.GetCulturesAsync(); } From 20f1a6175fae476760d71df709020e73345411d5 Mon Sep 17 00:00:00 2001 From: hishamco Date: Thu, 3 Dec 2020 17:15:08 +0300 Subject: [PATCH 13/44] Use cookie everywhere --- Oqtane.Client/Oqtane.Client.csproj | 1 + Oqtane.Client/Program.cs | 4 ++- .../Themes/Controls/LanguageSwitcher.razor | 6 ++-- Oqtane.Client/UI/Interop.cs | 29 ------------------- .../ApplicationBuilderExtensions.cs | 5 +--- Oqtane.Server/Pages/_Host.cshtml | 8 ----- Oqtane.Server/wwwroot/js/interop.js | 6 ---- 7 files changed, 9 insertions(+), 50 deletions(-) diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index da11a472..72024f75 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -31,6 +31,7 @@ +
diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index cc85b9b9..4c2d1201 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -10,6 +10,7 @@ using System.Runtime.Loader; using System.Threading.Tasks; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; using Microsoft.JSInterop; using Oqtane.Modules; @@ -94,7 +95,8 @@ namespace Oqtane.Client var host = builder.Build(); var jsRuntime = host.Services.GetRequiredService(); var interop = new Interop(jsRuntime); - var culture = await interop.GetLocalStorage("OqtaneCulture"); + var localizationCookie = await interop.GetCookie(CookieRequestCultureProvider.DefaultCookieName); + var culture = CookieRequestCultureProvider.ParseCookieValue(localizationCookie).UICultures[0].Value; var localizationService = host.Services.GetRequiredService(); var cultures = await localizationService.GetCulturesAsync(); diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index e1d16002..6f748e88 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -1,6 +1,7 @@ @namespace Oqtane.Themes.Controls @inherits ThemeControlBase -@using System.Globalization +@using System.Globalization +@using Microsoft.AspNetCore.Localization; @using Oqtane.Models @inject ILocalizationService LocalizationService @inject NavigationManager NavigationManager @@ -36,7 +37,8 @@ if (culture != CultureInfo.CurrentUICulture.Name) { var interop = new Interop(JSRuntime); - await interop.SetLocalStorage("OqtaneCulture", culture); + var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)); + await interop.SetCookie(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue, 360); NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); } diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 10c37d44..3964b070 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -1,5 +1,4 @@ using Microsoft.JSInterop; -using Oqtane.Models; using System.Threading.Tasks; namespace Oqtane.UI @@ -233,33 +232,5 @@ namespace Oqtane.UI return Task.CompletedTask; } } - - public async Task GetLocalStorage(string name) - { - try - { - var value = await _jsRuntime.InvokeAsync("Oqtane.Interop.getLocalStorage", name); - - return value; - } - catch - { - return null; - } - } - - public Task SetLocalStorage(string name, string value) - { - try - { - _jsRuntime.InvokeVoidAsync("Oqtane.Interop.setLocalStorage", name, value); - - return Task.CompletedTask; - } - catch - { - return Task.CompletedTask; - } - } } } diff --git a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs index 67676d16..81ca19ac 100644 --- a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System; using System.Linq; using System.Reflection; using Microsoft.AspNetCore.Builder; @@ -31,8 +30,6 @@ namespace Oqtane.Extensions var defaultCulture = localizationManager.GetDefaultCulture(); var supportedCultures = localizationManager.GetSupportedCultures(); - CultureInfo.CurrentUICulture = new CultureInfo(defaultCulture); - app.UseRequestLocalization(options => { options.SetDefaultCulture(defaultCulture) .AddSupportedUICultures(supportedCultures) diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index ecf906e4..cf2d69f0 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -1,17 +1,9 @@ @page "/" @namespace Oqtane.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@using System.Globalization -@using Microsoft.AspNetCore.Localization @using Microsoft.Extensions.Configuration @inject IConfiguration Configuration @model Oqtane.Pages.HostModel - -@{ - // Set localization cookie - var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture)); - HttpContext.Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue); -} diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index e71f4b81..2e4092e4 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -362,11 +362,5 @@ Oqtane.Interop = { setInterval(function () { window.location.href = url; }, wait * 1000); - }, - getLocalStorage: function (name) { - return window.localStorage[name]; - }, - setLocalStorage: function (name, value) { - window.localStorage[name] = value; } }; From 5e293ee2988fd70cb9d87585cda0f6ce657b62c5 Mon Sep 17 00:00:00 2001 From: hishamco Date: Thu, 3 Dec 2020 17:25:01 +0300 Subject: [PATCH 14/44] Fix SupportedCultures bug --- Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs index 81ca19ac..4f43068e 100644 --- a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs @@ -32,7 +32,7 @@ namespace Oqtane.Extensions app.UseRequestLocalization(options => { options.SetDefaultCulture(defaultCulture) - .AddSupportedUICultures(supportedCultures) + .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); }); From 2fe474268ed6b25fea948cbb9c614a28d22cb858 Mon Sep 17 00:00:00 2001 From: Jim Spillane Date: Fri, 4 Dec 2020 10:28:27 -0500 Subject: [PATCH 15/44] Revert "Fix Azure Deploy" This reverts commit d688a7c10da81d42fe92b8e1ca7ee266199b3705. From 1b017a96515a45266d1890923b65dbc62e53e7ff Mon Sep 17 00:00:00 2001 From: Jim Spillane Date: Fri, 4 Dec 2020 10:43:29 -0500 Subject: [PATCH 16/44] Fix Azure Deploy Add 5.0 to framework App Service siteConfig --- azuredeploy.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azuredeploy.json b/azuredeploy.json index 4dd651bc..180ad5fb 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -158,7 +158,8 @@ "name": "[parameters('BlazorWebsiteName')]", "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", "siteConfig": { - "webSocketsEnabled": true + "webSocketsEnabled": true, + "netFrameworkVersion": "v5.0" } }, "resources": [ From 14f8155df63ad2b0616bd556414350081ead6b5f Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Sun, 6 Dec 2020 16:09:46 +0100 Subject: [PATCH 17/44] FileController fix - using PhysicalFile framework method (current implementation causes file locks and 500 error at heavy load) - Add correct mimetype to header based on file extension --- Oqtane.Server/Controllers/FileController.cs | 33 +++++++------------- Oqtane.Server/Extensions/StringExtensions.cs | 14 +++++++++ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index fb43a7cb..5389b423 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -17,6 +17,7 @@ using Oqtane.Enums; using Oqtane.Infrastructure; using Oqtane.Repository; using Microsoft.AspNetCore.Routing.Constraints; +using Oqtane.Extensions; // ReSharper disable StringIndexOfIsCultureSpecific.1 @@ -314,9 +315,9 @@ namespace Oqtane.Controllers { string merged = ""; - // parse the filename which is in the format of filename.ext.part_x_y + // parse the filename which is in the format of filename.ext.part_x_y string token = ".part_"; - string parts = Path.GetExtension(filename)?.Replace(token, ""); // returns "x_y" + string parts = Path.GetExtension(filename)?.Replace(token, ""); // returns "x_y" int totalparts = int.Parse(parts?.Substring(parts.IndexOf("_") + 1)); filename = Path.GetFileNameWithoutExtension(filename); // base filename @@ -435,45 +436,33 @@ namespace Oqtane.Controllers [HttpGet("download/{id}")] public IActionResult Download(int id) { - string errorpath = Path.Combine(GetFolderPath("images"), "error.png"); - Models.File file = _files.GetFile(id); + var file = _files.GetFile(id); if (file != null) { if (_userPermissions.IsAuthorized(User, PermissionNames.View, file.Folder.Permissions)) { - string filepath = Path.Combine(GetFolderPath(file.Folder), file.Name); + var filepath = Path.Combine(GetFolderPath(file.Folder), file.Name); if (System.IO.File.Exists(filepath)) { - var stream = new FileStream(filepath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); - } - else - { - _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath); - HttpContext.Response.StatusCode = 404; - if (System.IO.File.Exists(errorpath)) - { - var stream = new FileStream(errorpath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); - } + return PhysicalFile(filepath, file.Name.GetMimeType(), file.Name); } + + _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath); + HttpContext.Response.StatusCode = 404; } else { _logger.Log(LogLevel.Error, this, LogFunction.Read, "User Not Authorized To Access File {FileId}", id); HttpContext.Response.StatusCode = 401; - var stream = new FileStream(errorpath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); } } else { _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Not Found {FileId}", id); HttpContext.Response.StatusCode = 404; - var stream = new FileStream(errorpath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); } - return null; + string errorPath = Path.Combine(GetFolderPath("images"), "error.png"); + return System.IO.File.Exists(errorPath) ? PhysicalFile(errorPath, errorPath.GetMimeType()) : null; } private string GetFolderPath(Folder folder) diff --git a/Oqtane.Server/Extensions/StringExtensions.cs b/Oqtane.Server/Extensions/StringExtensions.cs index 49b3b2cd..a2c7c88b 100644 --- a/Oqtane.Server/Extensions/StringExtensions.cs +++ b/Oqtane.Server/Extensions/StringExtensions.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.AspNetCore.StaticFiles; namespace Oqtane.Extensions { @@ -11,7 +12,20 @@ namespace Oqtane.Extensions { return false; } + return list.Any(f => s.StartsWith(f)); } + + public static string GetMimeType(this string fileName) + { + var provider = new FileExtensionContentTypeProvider(); + + if (!provider.TryGetContentType(fileName, out var contentType)) + { + contentType = "application/octet-stream"; + } + + return contentType; + } } } From b878b3ee2f462607952e5fe4e1d3b272e0d0c940 Mon Sep 17 00:00:00 2001 From: hishamco Date: Sun, 6 Dec 2020 19:51:25 +0300 Subject: [PATCH 18/44] Localize ActionDialog.Text --- Oqtane.Client/Modules/Controls/ActionDialog.razor | 1 + 1 file changed, 1 insertion(+) diff --git a/Oqtane.Client/Modules/Controls/ActionDialog.razor b/Oqtane.Client/Modules/Controls/ActionDialog.razor index ac7e4690..4770729b 100644 --- a/Oqtane.Client/Modules/Controls/ActionDialog.razor +++ b/Oqtane.Client/Modules/Controls/ActionDialog.razor @@ -99,6 +99,7 @@ if (IsLocalizable) { + Text = Localize(nameof(Text), Text); Header = Localize(nameof(Header), Header); Message = Localize(nameof(Message), Message); } From 5678a1796a38bd88bb74bb306667eb6f70ff3240 Mon Sep 17 00:00:00 2001 From: hishamco Date: Sun, 6 Dec 2020 21:45:33 +0300 Subject: [PATCH 19/44] Add missing Files localization strings --- Oqtane.Client/Modules/Admin/Files/Add.razor | 4 ++-- Oqtane.Client/Modules/Admin/Files/Edit.razor | 6 +++--- Oqtane.Client/Modules/Admin/Files/Index.razor | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Files/Add.razor b/Oqtane.Client/Modules/Admin/Files/Add.razor index df16cac8..33633fe0 100644 --- a/Oqtane.Client/Modules/Admin/Files/Add.razor +++ b/Oqtane.Client/Modules/Admin/Files/Add.razor @@ -7,7 +7,7 @@ @inject IStringLocalizer Localizer - + - + @@ -47,7 +47,7 @@ @if (_files.Count == 0) { -
@Localizer["No Files Exist In Selected Folder"]
+
@Localizer["No Files Exist In Selected Folder"]
} } From 5e49206828d17fdb76a54b1106a30ffa4d9582a6 Mon Sep 17 00:00:00 2001 From: hishamco Date: Sun, 6 Dec 2020 21:46:03 +0300 Subject: [PATCH 20/44] Add FileManager localization strings --- Oqtane.Client/Modules/Controls/FileManager.razor | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index 291b2acb..e1c4b3f9 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -1,7 +1,8 @@ -@namespace Oqtane.Modules.Controls +@namespace Oqtane.Modules.Controls @inherits ModuleControlBase @inject IFolderService FolderService @inject IFileService FileService +@inject IStringLocalizer Localizer @if (_folders != null) { @@ -14,7 +15,7 @@ - + @foreach (File file in _files) { if (file.FileId == FileId) @@ -62,10 +63,10 @@ } - + @if (ShowFiles && GetFileId() != -1) { - + } From f0f30558699f387a1224f60a6d05069cd24755d5 Mon Sep 17 00:00:00 2001 From: hishamco Date: Sun, 6 Dec 2020 21:46:19 +0300 Subject: [PATCH 21/44] Add PermissionGrid localization strings --- Oqtane.Client/Modules/Controls/PermissionGrid.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/PermissionGrid.razor b/Oqtane.Client/Modules/Controls/PermissionGrid.razor index 000f54be..d11b0795 100644 --- a/Oqtane.Client/Modules/Controls/PermissionGrid.razor +++ b/Oqtane.Client/Modules/Controls/PermissionGrid.razor @@ -13,7 +13,7 @@ @foreach (PermissionString permission in _permissions) { - + } @foreach (Role role in _roles) @@ -39,7 +39,7 @@ @foreach (PermissionString permission in _permissions) { - + } @@ -65,7 +65,7 @@ From 35e776b15020f1158fe694f999fbef19db7d015d Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Mon, 7 Dec 2020 21:27:00 +0100 Subject: [PATCH 22/44] Fix - return to url during login fail when returnurl contains "/" --- Oqtane.Client/Themes/Controls/LoginBase.cs | 2 +- Oqtane.Client/UI/SiteRouter.razor | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/LoginBase.cs b/Oqtane.Client/Themes/Controls/LoginBase.cs index ed9eb289..27f43497 100644 --- a/Oqtane.Client/Themes/Controls/LoginBase.cs +++ b/Oqtane.Client/Themes/Controls/LoginBase.cs @@ -22,7 +22,7 @@ namespace Oqtane.Themes.Controls { returnurl += "/" + PageState.Page.Path; } - NavigationManager.NavigateTo(NavigateUrl("login", "returnurl=" + returnurl)); + NavigationManager.NavigateTo(NavigateUrl("login", "?returnurl=" + returnurl)); } protected async Task LogoutUser() diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 667816ab..469a0a7b 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -300,7 +300,7 @@ if (user == null) { // redirect to login page - NavigationManager.NavigateTo(Utilities.NavigateUrl(alias.Path, "login", "returnurl=" + path)); + NavigationManager.NavigateTo(Utilities.NavigateUrl(alias.Path, "login", "?returnurl=" + path)); } else { @@ -565,4 +565,4 @@ => RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER")) ? Oqtane.Shared.Runtime.WebAssembly : Oqtane.Shared.Runtime.Server; -} \ No newline at end of file +} From 87ba77fdba3fa8ab3edafd537708de21c30fc1ea Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 13:43:05 +0300 Subject: [PATCH 23/44] Localize AuditInfo --- .../Modules/Controls/AuditInfo.razor | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/AuditInfo.razor b/Oqtane.Client/Modules/Controls/AuditInfo.razor index 026a2986..aa2cf790 100644 --- a/Oqtane.Client/Modules/Controls/AuditInfo.razor +++ b/Oqtane.Client/Modules/Controls/AuditInfo.razor @@ -1,5 +1,6 @@ @namespace Oqtane.Modules.Controls @inherits ModuleControlBase +@inject IStringLocalizer Localizer @if (_text != string.Empty) { @@ -39,16 +40,16 @@ _text = string.Empty; if (!String.IsNullOrEmpty(CreatedBy) || CreatedOn.HasValue) { - _text += "

Created "; + _text += $"

{Localizer["Created"]} "; if (!String.IsNullOrEmpty(CreatedBy)) { - _text += " by " + CreatedBy + ""; + _text += $" {Localizer["by"]} {CreatedBy}"; } if (CreatedOn != null) { - _text += " on " + CreatedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + ""; + _text += $" {Localizer["on"]} {CreatedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; } _text += "

"; @@ -56,16 +57,16 @@ if (!String.IsNullOrEmpty(ModifiedBy) || ModifiedOn.HasValue) { - _text += "

Last modified "; + _text += $"

{Localizer["Last modified"]} "; if (!String.IsNullOrEmpty(ModifiedBy)) { - _text += " by " + ModifiedBy + ""; + _text += $" {Localizer["by"]} {ModifiedBy}"; } if (ModifiedOn != null) { - _text += " on " + ModifiedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + ""; + _text += $" {Localizer["on"]} {ModifiedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; } _text += "

"; @@ -73,16 +74,16 @@ if (!String.IsNullOrEmpty(DeletedBy) || DeletedOn.HasValue) { - _text += "

Deleted "; + _text += $"

{Localizer["Deleted"]} "; if (!String.IsNullOrEmpty(DeletedBy)) { - _text += " by " + DeletedBy + ""; + _text += $" {Localizer["by"]} {DeletedBy}"; } if (DeletedOn != null) { - _text += " on " + DeletedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + ""; + _text += $" {Localizer["on"]} {DeletedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; } _text += "

"; From e0087c1dbba79c3729e5d85d4f1fb111ac59b7d5 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 14:37:54 +0300 Subject: [PATCH 24/44] Add missing Jobs localization strings --- Oqtane.Client/Modules/Admin/Jobs/Index.razor | 20 ++++++++++---------- Oqtane.Client/Modules/Admin/Jobs/Log.razor | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Jobs/Index.razor b/Oqtane.Client/Modules/Admin/Jobs/Index.razor index ffd32c17..f2a02c75 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Index.razor @@ -28,7 +28,7 @@ else
- + @@ -63,17 +63,17 @@ else var status = string.Empty; if (!isEnabled) { - status = "Disabled"; + status = Localizer["Disabled"]; } else { if (isExecuting) { - status = "Executing"; + status = Localizer["Executing"]; } else { - status = "Idle"; + status = Localizer["Idle"]; } } @@ -83,26 +83,26 @@ else private string DisplayFrequency(int interval, string frequency) { - var result = "Every " + interval.ToString() + " "; + var result = $"{Localizer["Every"]} {interval.ToString()} "; switch (frequency) { case "m": - result += "Minute"; + result += Localizer["Minute"]; break; case "H": - result += "Hour"; + result += Localizer["Hour"]; break; case "d": - result += "Day"; + result += Localizer["Day"]; break; case "M": - result += "Month"; + result += Localizer["Month"]; break; } if (interval > 1) { - result += "s"; + result += Localizer["s"]; } return result; diff --git a/Oqtane.Client/Modules/Admin/Jobs/Log.razor b/Oqtane.Client/Modules/Admin/Jobs/Log.razor index f5d8a391..b0049db7 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Log.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Log.razor @@ -50,17 +50,17 @@ else var status = string.Empty; if (isExecuting) { - status = "Executing"; + status = Localizer["Executing"]; } else { if (succeeded != null && succeeded.Value) { - status = "Succeeded"; + status = Localizer["Succeeded"]; } else { - status = "Failed"; + status = Localizer["Failed"]; } } From 055ae26bc16e27bfd4a9a54f2a973a519c422034 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 14:41:03 +0300 Subject: [PATCH 25/44] Add missing Logs localization strings --- Oqtane.Client/Modules/Admin/Logs/Index.razor | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor index 59830a0d..a0ea8b04 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor @@ -14,13 +14,13 @@ else - + - + @@ -52,7 +52,7 @@ - + From df1d64608368d350f4748e31321246eebb4fea41 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 16:37:55 +0300 Subject: [PATCH 27/44] Refactor LocalizableComponent --- .../Modules/Controls/ActionDialog.razor | 9 ++-- .../Modules/Controls/ActionLink.razor | 6 +-- Oqtane.Client/Modules/Controls/Label.razor | 4 +- .../Modules/Controls/LocalizableComponent.cs | 46 ++++++++----------- Oqtane.Client/Modules/Controls/Section.razor | 9 ++-- Oqtane.Client/Modules/Controls/TabPanel.razor | 15 +++--- 6 files changed, 33 insertions(+), 56 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/ActionDialog.razor b/Oqtane.Client/Modules/Controls/ActionDialog.razor index 4770729b..73723fa5 100644 --- a/Oqtane.Client/Modules/Controls/ActionDialog.razor +++ b/Oqtane.Client/Modules/Controls/ActionDialog.razor @@ -97,12 +97,9 @@ _iconSpan = $" "; } - if (IsLocalizable) - { - Text = Localize(nameof(Text), Text); - Header = Localize(nameof(Header), Header); - Message = Localize(nameof(Message), Message); - } + Text = Localize(nameof(Text), Text); + Header = Localize(nameof(Header), Header); + Message = Localize(nameof(Message), Message); _authorized = IsAuthorized(); } diff --git a/Oqtane.Client/Modules/Controls/ActionLink.razor b/Oqtane.Client/Modules/Controls/ActionLink.razor index eacc9813..1ba9ef12 100644 --- a/Oqtane.Client/Modules/Controls/ActionLink.razor +++ b/Oqtane.Client/Modules/Controls/ActionLink.razor @@ -95,11 +95,7 @@ } - if (IsLocalizable) - { - _text = Localize(nameof(Text), _text); - } - + _text = Localize(nameof(Text), _text); _url = EditUrl(Action, _parameters); _authorized = IsAuthorized(); } diff --git a/Oqtane.Client/Modules/Controls/Label.razor b/Oqtane.Client/Modules/Controls/Label.razor index 85e65d14..05f2b790 100644 --- a/Oqtane.Client/Modules/Controls/Label.razor +++ b/Oqtane.Client/Modules/Controls/Label.razor @@ -45,11 +45,11 @@ else if (IsLocalizable) { - var value = Localize("Text"); var key = $"{ResourceKey}.Text"; + var value = Localize(key); if (!value.Equals(key)) { - ChildContent =@@Localize("Text"); + ChildContent =@@value; } HelpText = Localize(nameof(HelpText), HelpText); diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs index 657494d7..40f2eda5 100644 --- a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -15,27 +15,22 @@ namespace Oqtane.Modules.Controls protected bool IsLocalizable { get; private set; } - protected string Localize(string name) - { - var key = $"{ResourceKey}.{name}"; + protected string Localize(string name) => _localizer?[name] ?? name; - // TODO: we should have a ShowMissingResourceKeys option which developers/translators can enable to find missing translations which would display the key rather than the name + protected string Localize(string propertyName, string propertyValue) + { if (!IsLocalizable) { - return name; + return propertyValue; } - return _localizer?[key] ?? name; - } - - protected string Localize(string name, string defaultValue) - { - var key = $"{ResourceKey}.{name}"; - var value = Localize(name); + var key = $"{ResourceKey}.{propertyName}"; + var value = Localize(key); if (value == key) { - return defaultValue; + // Returns default property value (English version) instead of ResourceKey.PropertyName + return propertyValue; } else { @@ -45,26 +40,21 @@ namespace Oqtane.Modules.Controls protected override void OnParametersSet() { - if (!String.IsNullOrEmpty(ResourceKey)) + IsLocalizable = false; + + if (!String.IsNullOrEmpty(ResourceKey) && ModuleState?.ModuleType != null) { - if (ModuleState?.ModuleType != null) + var moduleType = Type.GetType(ModuleState.ModuleType); + if (moduleType != null) { - var moduleType = Type.GetType(ModuleState.ModuleType); - if (moduleType != null) + using (var scope = ServiceActivator.GetScope()) { - using (var scope = ServiceActivator.GetScope()) - { - var localizerFactory = scope.ServiceProvider.GetService(); - _localizer = localizerFactory.Create(moduleType); - } + var localizerFactory = scope.ServiceProvider.GetService(); + _localizer = localizerFactory.Create(moduleType); + + IsLocalizable = true; } } - - IsLocalizable = true; - } - else - { - IsLocalizable = false; } } } diff --git a/Oqtane.Client/Modules/Controls/Section.razor b/Oqtane.Client/Modules/Controls/Section.razor index fd8b9a52..027b0e85 100644 --- a/Oqtane.Client/Modules/Controls/Section.razor +++ b/Oqtane.Client/Modules/Controls/Section.razor @@ -46,11 +46,8 @@ { base.OnParametersSet(); - if (IsLocalizable) - { - _heading = !string.IsNullOrEmpty(Heading) - ? Localize(nameof(Heading), Heading) - : Localize(nameof(Name), Name); - } + _heading = !string.IsNullOrEmpty(Heading) + ? Localize(nameof(Heading), Heading) + : Localize(nameof(Name), Name); } } diff --git a/Oqtane.Client/Modules/Controls/TabPanel.razor b/Oqtane.Client/Modules/Controls/TabPanel.razor index 7c2eaa24..e618c896 100644 --- a/Oqtane.Client/Modules/Controls/TabPanel.razor +++ b/Oqtane.Client/Modules/Controls/TabPanel.razor @@ -40,16 +40,13 @@ else { base.OnParametersSet(); - if (IsLocalizable) + if (string.IsNullOrEmpty(Heading)) { - if (string.IsNullOrEmpty(Heading)) - { - Name = Localize(nameof(Name), Name); - } - else - { - Heading = Localize(nameof(Heading), Heading); - } + Name = Localize(nameof(Name), Name); + } + else + { + Heading = Localize(nameof(Heading), Heading); } } From 5ce7284a6b1c06d6806af98f669c6562e8dd7bf8 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 16:45:53 +0300 Subject: [PATCH 28/44] Returns English version if the value is empty --- Oqtane.Client/Modules/Controls/LocalizableComponent.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs index 40f2eda5..773df857 100644 --- a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -34,7 +34,15 @@ namespace Oqtane.Modules.Controls } else { - return value; + if (value == String.Empty) + { + // Returns default property value (English version) + return propertyValue; + } + else + { + return value; + } } } From 299e28abc46b7e6f19ff919b1bb687188a352fdc Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 20:40:54 +0300 Subject: [PATCH 29/44] Avoid Label.Text to be empty --- Oqtane.Client/Modules/Controls/Label.razor | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/Label.razor b/Oqtane.Client/Modules/Controls/Label.razor index 05f2b790..b67143cb 100644 --- a/Oqtane.Client/Modules/Controls/Label.razor +++ b/Oqtane.Client/Modules/Controls/Label.razor @@ -43,16 +43,12 @@ else _openLabel += ">"; - if (IsLocalizable) + var text = Localize("Text", String.Empty); + if (text != String.Empty) { - var key = $"{ResourceKey}.Text"; - var value = Localize(key); - if (!value.Equals(key)) - { - ChildContent =@@value; - } - - HelpText = Localize(nameof(HelpText), HelpText); + ChildContent =@@text; } + + HelpText = Localize(nameof(HelpText), HelpText); } } From 29c37575f1d3e5467bb83c1138ffafcadbecfede Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 20:45:54 +0300 Subject: [PATCH 30/44] Add missing Roles localization strings --- Oqtane.Client/Modules/Admin/Roles/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Roles/Users.razor | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Roles/Index.razor b/Oqtane.Client/Modules/Admin/Roles/Index.razor index 6344925d..b221904d 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Index.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Index.razor @@ -20,7 +20,7 @@ else - + diff --git a/Oqtane.Client/Modules/Admin/Roles/Users.razor b/Oqtane.Client/Modules/Admin/Roles/Users.razor index ecd7cb91..a4b40921 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Users.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Users.razor @@ -25,7 +25,7 @@ else - + From 0e95e94cab868a3855df9a618dd7e37d47a1a2a8 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 20:50:14 +0300 Subject: [PATCH 32/44] Add missing Sql localization strings --- Oqtane.Client/Modules/Admin/Sql/Index.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/Admin/Sql/Index.razor b/Oqtane.Client/Modules/Admin/Sql/Index.razor index 69191bab..c003d1b4 100644 --- a/Oqtane.Client/Modules/Admin/Sql/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sql/Index.razor @@ -105,7 +105,7 @@ else } else { - table = "No Results Returned"; + table = Localizer["No Results Returned"]; } return table; From 836ba5eeb951aa044941c609a4213f707b394267 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 20:55:28 +0300 Subject: [PATCH 33/44] Add missing Tenanat localization strings --- Oqtane.Client/Modules/Admin/Tenants/Index.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/Admin/Tenants/Index.razor b/Oqtane.Client/Modules/Admin/Tenants/Index.razor index fda4c3a4..bf27d99f 100644 --- a/Oqtane.Client/Modules/Admin/Tenants/Index.razor +++ b/Oqtane.Client/Modules/Admin/Tenants/Index.razor @@ -18,7 +18,7 @@ else - + From 2d15f5d185a8cab2f122dd8364e28d63869ea6dc Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 20:55:38 +0300 Subject: [PATCH 34/44] Add missing Themes localization strings --- Oqtane.Client/Modules/Admin/Themes/Index.razor | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index 8b64bff8..8d27b057 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -26,17 +26,17 @@ else From c27e8b55dfd088f3c97fc9bec86e98e64d883bde Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 21:16:37 +0300 Subject: [PATCH 35/44] Add missing Users localization strings --- Oqtane.Client/Modules/Admin/Users/Add.razor | 2 +- Oqtane.Client/Modules/Admin/Users/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Users/Roles.razor | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index d669f678..15c14bce 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -14,7 +14,7 @@ + diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 8087f2bf..8ac788ee 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -31,7 +31,7 @@ else
@@ -38,7 +38,7 @@ @if (PageState.QueryString.ContainsKey("id")) { - + } @foreach (Folder folder in _folders) { @@ -44,10 +44,10 @@ { } - Cancel + @Localizer["Cancel"] @if (!_isSystem && PageState.QueryString.ContainsKey("id")) { - + }

diff --git a/Oqtane.Client/Modules/Admin/Files/Index.razor b/Oqtane.Client/Modules/Admin/Files/Index.razor index bff90388..82da2bb7 100644 --- a/Oqtane.Client/Modules/Admin/Files/Index.razor +++ b/Oqtane.Client/Modules/Admin/Files/Index.razor @@ -38,7 +38,7 @@
@context.Name @context.ModifiedOn @context.Extension.ToUpper() @Localizer["File"]@Localizer["Role"]@permission.PermissionName@Localizer[permission.PermissionName]
@Localizer["User"]@permission.PermissionName@Localizer[permission.PermissionName]
- +
@context.Name @DisplayStatus(context.IsEnabled, context.IsExecuting) From f123ac89ef68c352f03e15c7a716d4a686252a82 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 15:08:21 +0300 Subject: [PATCH 26/44] Add missing RecylceBin localization strings --- Oqtane.Client/Modules/Admin/RecycleBin/Index.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index beaa74c1..15725daa 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -19,13 +19,13 @@
   Name@Localizer["Name"] @Localizer["Deleted By"] @Localizer["Deleted On"] @context.Name @context.DeletedBy @context.DeletedOn @PageState.Pages.Find(item => item.PageId == context.PageId).Name @context.Title @context.DeletedBy @context.Name @context.Name @context.Name @if (context.AssemblyName != "Oqtane.Client") - { - - } + { + + } @context.Name @context.Version @if (UpgradeAvailable(context.ThemeName, context.Version)) - { - - } + { + + }
- - + diff --git a/Oqtane.Client/Modules/Admin/Users/Roles.razor b/Oqtane.Client/Modules/Admin/Users/Roles.razor index 92229829..b5988315 100644 --- a/Oqtane.Client/Modules/Admin/Users/Roles.razor +++ b/Oqtane.Client/Modules/Admin/Users/Roles.razor @@ -14,7 +14,7 @@ else - + @@ -181,7 +181,7 @@ else - + diff --git a/Oqtane.Client/Modules/Admin/UserProfile/View.razor b/Oqtane.Client/Modules/Admin/UserProfile/View.razor index 316b17ea..c9ec1c61 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/View.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/View.razor @@ -10,7 +10,7 @@
- + @@ -26,7 +26,7 @@ else
- + From 62f60825255c8d130cad638f220b8c6ba5730094 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 21:23:03 +0300 Subject: [PATCH 36/44] Localize TriStateCheckBox control --- Oqtane.Client/Modules/Controls/TriStateCheckBox.razor | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor b/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor index 845db70b..26991f37 100644 --- a/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor +++ b/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor @@ -1,5 +1,6 @@ -@namespace Oqtane.Modules.Controls +@namespace Oqtane.Modules.Controls @inherits ModuleControlBase +@inject IStringLocalizer Localizer @@ -51,11 +52,11 @@ { case true: _src = "images/checked.png"; - _title = "Permission Granted"; + _title = Localizer["Permission Granted"]; break; case false: _src = "images/unchecked.png"; - _title = "Permission Denied"; + _title = Localizer["Permission Denied"]; break; case null: _src = "images/null.png"; From 169a4b00a449fabfb8c23295f4255b36d60f5208 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 22:45:20 +0300 Subject: [PATCH 37/44] Add missing FileManager localization strings --- Oqtane.Client/Modules/Controls/FileManager.razor | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index e1c4b3f9..f4650202 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -220,7 +220,7 @@ { await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); - _message = "Error Loading Files"; + _message = Localizer["Error Loading Files"]; _messagetype = MessageType.Error; } } @@ -279,7 +279,7 @@ { await logger.LogInformation("File Upload Succeeded {Files}", upload); - _message = "File Upload Succeeded"; + _message = Localizer["File Upload Succeeded"]; _messagetype = MessageType.Success; await GetFiles(); @@ -299,7 +299,7 @@ { await logger.LogError("File Upload Failed For {Files}", result.Replace(",", ", ")); - _message = "File Upload Failed"; + _message = Localizer["File Upload Failed"]; _messagetype = MessageType.Error; } } @@ -307,13 +307,13 @@ { await logger.LogError(ex, "File Upload Failed {Error}", ex.Message); - _message = "File Upload Failed"; + _message = Localizer["File Upload Failed"]; _messagetype = MessageType.Error; } } else { - _message = "You Have Not Selected A File To Upload"; + _message = Localizer["You Have Not Selected A File To Upload"]; _messagetype = MessageType.Warning; } } @@ -326,7 +326,7 @@ await FileService.DeleteFileAsync(FileId); await logger.LogInformation("File Deleted {File}", FileId); - _message = "File Deleted"; + _message = Localizer["File Deleted"]; _messagetype = MessageType.Success; await GetFiles(); @@ -338,7 +338,7 @@ { await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message); - _message = "Error Deleting File"; + _message = Localizer["Error Deleting File"]; _messagetype = MessageType.Error; } } From c35b5d861adb192ff6d342e4b64a17f4b4420b51 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 22:46:28 +0300 Subject: [PATCH 38/44] Add missing User Profile localization strings --- Oqtane.Client/Modules/Admin/UserProfile/Index.razor | 4 ++-- Oqtane.Client/Modules/Admin/UserProfile/View.razor | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 0435b2b1..a5ca7327 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -149,7 +149,7 @@ else @context.FromDisplayName @context.Subject @context.CreatedOn @context.ToDisplayName @context.Subject @context.CreatedOn
@if (title == "From") { From 3caf06d8ffe38247c8ff0703dfe1300793e2bccf Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 22:50:36 +0300 Subject: [PATCH 39/44] Add Content folder to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8f8f91ba..d47b8dcf 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ Oqtane.Server/Data/*.mdf Oqtane.Server/Data/*.ldf /Oqtane.Server/Properties/PublishProfiles/FolderProfile.pubxml +Oqtane.Server/Content From 941d08f0a2b3d872689c2ae59bc9a56d0fa9e663 Mon Sep 17 00:00:00 2001 From: hishamco Date: Tue, 8 Dec 2020 22:57:58 +0300 Subject: [PATCH 40/44] Add missing Control Panel localization strings --- Oqtane.Client/Themes/Controls/ControlPanel.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index 0ea20a8a..c1ba3e54 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -398,17 +398,17 @@ await PageModuleService.AddPageModuleAsync(pageModule); await PageModuleService.UpdatePageModuleOrderAsync(pageModule.PageId, pageModule.Pane); - Message = "
Module Added To Page
"; + Message = $"
{Localizer["Module Added To Page"]}
"; NavigationManager.NavigateTo(NavigateUrl()); } else { - Message = "
You Must Select A Module
"; + Message = $"
{Localizer["You Must Select A Module"]}
"; } } else { - Message = "
Not Authorized
"; + Message = $"
{Localizer["Not Authorized"]}
"; } } From dd89296713396b0a2c7ea2284cc593a77e93b5b1 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 9 Dec 2020 17:47:49 +0300 Subject: [PATCH 41/44] Replace Visible with ShowLanguageSwitcher property --- Oqtane.Client/Themes/Controls/ControlPanel.razor | 16 +++++++++++----- .../Themes/Controls/LanguageSwitcher.razor | 5 +---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index 0ea20a8a..d38db7de 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -9,7 +9,7 @@ @inject IPageModuleService PageModuleService @inject ILogService logger @inject ISettingService SettingService -@inject IStringLocalizer Localizer +@inject IStringLocalizer Localizer @if (_moduleDefinitions != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) { @@ -198,7 +198,10 @@ } - +@if (ShowLanguageSwitcher) +{ + +} @if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions) || (PageState.Page.IsPersonalizable && PageState.User != null)) { @@ -289,6 +292,9 @@ [Parameter] public string BodyClass { get; set; } = "card-body"; + [Parameter] + public bool ShowLanguageSwitcher { get; set; } = true; + protected override async Task OnInitializedAsync() { @@ -316,12 +322,12 @@ private void CategoryChanged(ChangeEventArgs e) { - Category = (string) e.Value; + Category = (string)e.Value; } private void ModuleChanged(ChangeEventArgs e) { - ModuleDefinitionName = (string) e.Value; + ModuleDefinitionName = (string)e.Value; if (ModuleDefinitionName != "-") { var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == ModuleDefinitionName); @@ -337,7 +343,7 @@ private void PageChanged(ChangeEventArgs e) { - PageId = (string) e.Value; + PageId = (string)e.Value; if (PageId != "-") { _modules = PageState.Modules diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor index 6f748e88..4dca37bc 100644 --- a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -6,7 +6,7 @@ @inject ILocalizationService LocalizationService @inject NavigationManager NavigationManager -@if (_supportedCultures != null && Visible) +@if (_supportedCultures != null) {
- +
@Localizer["Access Framework API"]  - + @code { public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; diff --git a/Oqtane.Client/Modules/Admin/Tenants/Edit.razor b/Oqtane.Client/Modules/Admin/Tenants/Edit.razor index 34f58934..247b338a 100644 --- a/Oqtane.Client/Modules/Admin/Tenants/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Tenants/Edit.razor @@ -56,7 +56,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Tenant {TenantId} {Error}", tenantid, ex.Message); - AddModuleMessage("Error Loading Tenant", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Tenant"], MessageType.Error); } } @@ -80,7 +80,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Tenant {TenantId} {Error}", tenantid, ex.Message); - AddModuleMessage("Error Saving Tenant", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Tenant"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Tenants/Index.razor b/Oqtane.Client/Modules/Admin/Tenants/Index.razor index bf27d99f..2aa70ecb 100644 --- a/Oqtane.Client/Modules/Admin/Tenants/Index.razor +++ b/Oqtane.Client/Modules/Admin/Tenants/Index.razor @@ -56,13 +56,13 @@ else } else { - AddModuleMessage("Tenant Cannot Be Deleted Until The Following Sites Are Deleted: " + message.Substring(2), MessageType.Warning); + AddModuleMessage(Localizer["Tenant Cannot Be Deleted Until The Following Sites Are Deleted: {0}", message.Substring(2)], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Tenant {Tenant} {Error}", Tenant, ex.Message); - AddModuleMessage("Error Deleting Tenant", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Tenant"], MessageType.Error); } } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index fa896dd4..ab042ed5 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -70,7 +70,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message); - AddModuleMessage("Error Loading Packages", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Packages"], MessageType.Error); } } @@ -79,7 +79,7 @@ try { await ThemeService.InstallThemesAsync(); - AddModuleMessage("Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { @@ -93,13 +93,13 @@ { await PackageService.DownloadPackageAsync(packageid, version, "Themes"); await logger.LogInformation("Theme {ThemeName} {Version} Downloaded Successfully", packageid, version); - AddModuleMessage("Themes Downloaded Successfully. Click Install To Complete Installation.", MessageType.Success); + AddModuleMessage(Localizer["Themes Downloaded Successfully. Click Install To Complete Installation."], MessageType.Success); StateHasChanged(); } catch (Exception ex) { await logger.LogError(ex, "Error Downloading Module {ThemeName} {Version}", packageid, version); - AddModuleMessage("Error Downloading Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Theme"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index 8d27b057..816bd06f 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -61,7 +61,7 @@ else if (_themes == null) { await logger.LogError(ex, "Error Loading Themes {Error}", ex.Message); - AddModuleMessage("Error Loading Themes", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Themes"], MessageType.Error); } } } @@ -87,12 +87,12 @@ else await PackageService.DownloadPackageAsync(themename, version, "Themes"); await logger.LogInformation("Theme Downloaded {ThemeName} {Version}", themename, version); await ThemeService.InstallThemesAsync(); - AddModuleMessage("Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Downloading Theme {ThemeName} {Version} {Error}", themename, version, ex.Message); - AddModuleMessage("Error Downloading Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Theme"], MessageType.Error); } } @@ -101,12 +101,12 @@ else try { await ThemeService.DeleteThemeAsync(Theme.ThemeName); - AddModuleMessage("Theme Deleted Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Theme Deleted Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Theme {Theme} {Error}", Theme, ex.Message); - AddModuleMessage("Error Deleting Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Theme"], MessageType.Error); } } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Admin/Themes/View.razor b/Oqtane.Client/Modules/Admin/Themes/View.razor index eb9871c9..2510759d 100644 --- a/Oqtane.Client/Modules/Admin/Themes/View.razor +++ b/Oqtane.Client/Modules/Admin/Themes/View.razor @@ -96,7 +96,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Theme {ThemeName} {Error}", _themeName, ex.Message); - AddModuleMessage("Error Loading Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Theme"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor index 9642a090..c0475d59 100644 --- a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor +++ b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor @@ -78,7 +78,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Executing Upgrade {Error}", ex.Message); - AddModuleMessage("Error Executing Upgrade", MessageType.Error); + AddModuleMessage(Localizer["Error Executing Upgrade"], MessageType.Error); } } @@ -95,7 +95,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Downloading Framework {Error}", ex.Message); - AddModuleMessage("Error Downloading Framework", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Framework"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor index 7803a769..d3212726 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor @@ -74,13 +74,13 @@ } else { - AddModuleMessage("User Does Not Exist. Please Verify That The Username Provided Is Correct.", MessageType.Warning); + AddModuleMessage(Localizer["User Does Not Exist. Please Verify That The Username Provided Is Correct."], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding Notification {Notification} {Error}", notification, ex.Message); - AddModuleMessage("Error Adding Notification", MessageType.Error); + AddModuleMessage(Localizer["Error Adding Notification"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index a5ca7327..4b2874b6 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -248,13 +248,13 @@ else } else { - AddModuleMessage("Current User Is Not Logged In", MessageType.Warning); + AddModuleMessage(Localizer["Current User Is Not Logged In"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message); - AddModuleMessage("Error Loading User Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User Profile"], MessageType.Error); } } @@ -291,22 +291,22 @@ else await UserService.UpdateUserAsync(user); await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); await logger.LogInformation("User Profile Saved"); - AddModuleMessage("User Profile Updated Successfully", MessageType.Success); + AddModuleMessage(Localizer["User Profile Updated Successfully"], MessageType.Success); } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username and Email Address As Well As All Required Profile Information", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username and Email Address As Well As All Required Profile Information"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving User Profile {Error}", ex.Message); - AddModuleMessage("Error Saving User Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Saving User Profile"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/UserProfile/View.razor b/Oqtane.Client/Modules/Admin/UserProfile/View.razor index c9ec1c61..fcd7340c 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/View.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/View.razor @@ -158,7 +158,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Users {Error}", ex.Message); - AddModuleMessage("Error Loading Users", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Users"], MessageType.Error); } } @@ -202,13 +202,13 @@ } else { - AddModuleMessage("User Does Not Exist. Please Verify That The Username Provided Is Correct.", MessageType.Warning); + AddModuleMessage(Localizer["User Does Not Exist. Please Verify That The Username Provided Is Correct."], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding Notification {Notification} {Error}", notification, ex.Message); - AddModuleMessage("Error Adding Notification", MessageType.Error); + AddModuleMessage(Localizer["Error Adding Notification"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index 15c14bce..89b1e775 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -116,7 +116,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message); - AddModuleMessage("Error Loading User Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User Profile"], MessageType.Error); } } @@ -150,23 +150,23 @@ else { await logger.LogError("Error Adding User {Username} {Email}", username, email); - AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error); + AddModuleMessage(Localizer["Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use."], MessageType.Error); } } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username, Password, Email Address And All Required Profile Information", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username, Password, Email Address And All Required Profile Information"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", username, email, ex.Message); - AddModuleMessage("Error Adding User", MessageType.Error); + AddModuleMessage(Localizer["Error Adding User"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index edabc73d..be68ff7d 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -178,7 +178,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading User {UserId} {Error}", userid, ex.Message); - AddModuleMessage("Error Loading User", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User"], MessageType.Error); } } @@ -217,18 +217,18 @@ else } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username, Password, Email Address, And All Required Profile Information", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username, Password, Email Address, And All Required Profile Information"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving User {Username} {Email} {Error}", username, email, ex.Message); - AddModuleMessage("Error Saving User", MessageType.Error); + AddModuleMessage(Localizer["Error Saving User"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Users/Roles.razor b/Oqtane.Client/Modules/Admin/Users/Roles.razor index b5988315..037daabb 100644 --- a/Oqtane.Client/Modules/Admin/Users/Roles.razor +++ b/Oqtane.Client/Modules/Admin/Users/Roles.razor @@ -98,7 +98,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading Roles {Error}", ex.Message); - AddModuleMessage("Error Loading Roles", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Roles"], MessageType.Error); } } @@ -112,7 +112,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading User Roles {UserId} {Error}", userid, ex.Message); - AddModuleMessage("Error Loading User Roles", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User Roles"], MessageType.Error); } } @@ -173,17 +173,17 @@ else await GetUserRoles(); await logger.LogInformation("User Assigned To Role {UserRole}", userrole); - AddModuleMessage("User Assigned To Role", MessageType.Success); + AddModuleMessage(Localizer["User Assigned To Role"], MessageType.Success); } else { - AddModuleMessage("You Must Select A Role", MessageType.Warning); + AddModuleMessage(Localizer["You Must Select A Role"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving User Roles {UserId} {Error}", userid, ex.Message); - AddModuleMessage("Error Saving User Roles", MessageType.Error); + AddModuleMessage(Localizer["Error Saving User Roles"], MessageType.Error); } } @@ -194,12 +194,12 @@ else await UserRoleService.DeleteUserRoleAsync(UserRoleId); await GetUserRoles(); await logger.LogInformation("User Removed From Role {UserRoleId}", UserRoleId); - AddModuleMessage("User Removed From Role", MessageType.Success); + AddModuleMessage(Localizer["User Removed From Role"], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message); - AddModuleMessage("Error Removing User From Role", MessageType.Error); + AddModuleMessage(Localizer["Error Removing User From Role"], MessageType.Error); } } } From cf68d7320f3391f89641f0d89498fde37a3faad1 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 9 Dec 2020 21:15:35 +0300 Subject: [PATCH 43/44] Localize alert messages in controls --- Oqtane.Client/Modules/Controls/PermissionGrid.razor | 2 +- Oqtane.Client/Modules/Controls/RichTextEditor.razor | 2 +- Oqtane.Client/Modules/HtmlText/Edit.razor | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/PermissionGrid.razor b/Oqtane.Client/Modules/Controls/PermissionGrid.razor index d11b0795..a35a5209 100644 --- a/Oqtane.Client/Modules/Controls/PermissionGrid.razor +++ b/Oqtane.Client/Modules/Controls/PermissionGrid.razor @@ -180,7 +180,7 @@ } catch { - _message = "Username Does Not Exist"; + _message = Localizer["Username Does Not Exist"]; } } diff --git a/Oqtane.Client/Modules/Controls/RichTextEditor.razor b/Oqtane.Client/Modules/Controls/RichTextEditor.razor index 40af9497..3a33cc33 100644 --- a/Oqtane.Client/Modules/Controls/RichTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/RichTextEditor.razor @@ -194,7 +194,7 @@ } else { - _message = "You Must Select An Image To Insert"; + _message = Localizer["You Must Select An Image To Insert"]; } } else diff --git a/Oqtane.Client/Modules/HtmlText/Edit.razor b/Oqtane.Client/Modules/HtmlText/Edit.razor index 25ef9b63..311c4cd7 100644 --- a/Oqtane.Client/Modules/HtmlText/Edit.razor +++ b/Oqtane.Client/Modules/HtmlText/Edit.razor @@ -92,7 +92,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Content {Error}", ex.Message); - AddModuleMessage("Error Saving Content", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Content"], MessageType.Error); } } } From e94069e8a5e9c2f74d329528f4d98283779482f4 Mon Sep 17 00:00:00 2001 From: hishamco Date: Wed, 9 Dec 2020 21:17:33 +0300 Subject: [PATCH 44/44] Localize alert messages in UI --- Oqtane.Client/UI/Installer.razor | 2 +- Oqtane.Client/UI/ModuleInstance.razor | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/UI/Installer.razor b/Oqtane.Client/UI/Installer.razor index 8c1fc95a..9231e092 100644 --- a/Oqtane.Client/UI/Installer.razor +++ b/Oqtane.Client/UI/Installer.razor @@ -208,7 +208,7 @@ } else { - _message = "Please Enter All Fields And Ensure Passwords Match And Are Greater Than 5 Characters In Length"; + _message = Localizer["Please Enter All Fields And Ensure Passwords Match And Are Greater Than 5 Characters In Length"]; } } diff --git a/Oqtane.Client/UI/ModuleInstance.razor b/Oqtane.Client/UI/ModuleInstance.razor index c619f268..273404e9 100644 --- a/Oqtane.Client/UI/ModuleInstance.razor +++ b/Oqtane.Client/UI/ModuleInstance.razor @@ -1,4 +1,5 @@ @namespace Oqtane.UI +@inject IStringLocalizer Localizer @@ -41,13 +42,13 @@ else { // module does not exist with typename specified - _message = "Module Does Not Have A Component Named " + Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0) + ".razor"; + _message = Localizer["Module Does Not Have A Component Named {0}.razor", Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0)]; _messagetype = MessageType.Error; } } else { - _message = "Module Type Is Invalid For " + ModuleState.ModuleDefinitionName; + _message = Localizer["Module Type Is Invalid For {0}", ModuleState.ModuleDefinitionName]; _messagetype = MessageType.Error; }