From 5bb7c63d44d042952502dc81378f118f57e80c7c Mon Sep 17 00:00:00 2001 From: hishamco Date: Mon, 19 Oct 2020 11:16:46 +0300 Subject: [PATCH 1/4] Introduce LocalizableComponent --- .../Modules/Controls/LocalizableComponent.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Oqtane.Client/Modules/Controls/LocalizableComponent.cs diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs new file mode 100644 index 00000000..e442c152 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -0,0 +1,34 @@ +using System; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; +using Oqtane.Shared; + +namespace Oqtane.Modules.Controls +{ + public class LocalizableComponent : ModuleControlBase + { + [Parameter] + public string ResourceKey { get; set; } + + protected IStringLocalizer Localizer { get; private set; } + + protected override void OnParametersSet() + { + if (!String.IsNullOrEmpty(ResourceKey)) + { + if (ModuleState?.ModuleType != null) + { + var moduleType = Type.GetType(ModuleState.ModuleType); + var localizerTypeName = $"Microsoft.Extensions.Localization.IStringLocalizer`1[[{moduleType.AssemblyQualifiedName}]], Microsoft.Extensions.Localization.Abstractions"; + var localizerType = Type.GetType(localizerTypeName); + + // HACK: Use ServiceActivator instead of injecting IHttpContextAccessor, because HttpContext throws NRE in WebAssembly runtime + using (var scope = ServiceActivator.GetScope()) + { + Localizer = (IStringLocalizer)scope.ServiceProvider.GetService(localizerType); + } + } + } + } + } +} From fd5d777d3ad833f1de8255d8d36d77563f26a4ff Mon Sep 17 00:00:00 2001 From: hishamco Date: Mon, 19 Oct 2020 11:17:34 +0300 Subject: [PATCH 2/4] Label should use LocalizableComponent --- Oqtane.Client/Modules/Controls/Label.razor | 27 +++++----------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/Label.razor b/Oqtane.Client/Modules/Controls/Label.razor index 0d32a14b..8bde0ce7 100644 --- a/Oqtane.Client/Modules/Controls/Label.razor +++ b/Oqtane.Client/Modules/Controls/Label.razor @@ -1,6 +1,5 @@ -@namespace Oqtane.Modules.Controls -@inherits ModuleControlBase -@using Microsoft.Extensions.Localization +@namespace Oqtane.Modules.Controls +@inherits LocalizableComponent @if (!string.IsNullOrEmpty(HelpText)) { @@ -27,11 +26,10 @@ else [Parameter] public string HelpText { get; set; } // optional - tooltip for this label - [Parameter] - public string ResourceKey { get; set; } - protected override void OnParametersSet() { + base.OnParametersSet(); + _openLabel = "@localizer[$"{ResourceKey}.Text"]; - HelpText = localizer[$"{ResourceKey}.{nameof(HelpText)}"]; - } - } + ChildContent =@@Localizer[$"{ResourceKey}.Text"]; + HelpText = Localizer[$"{ResourceKey}.{nameof(HelpText)}"]; } } } From fed56098a01ae983579b48211987c3c2f85ec758 Mon Sep 17 00:00:00 2001 From: hishamco Date: Mon, 19 Oct 2020 11:36:05 +0300 Subject: [PATCH 3/4] Avoid resource check in child components --- Oqtane.Client/Modules/Controls/Label.razor | 7 ++----- .../Modules/Controls/LocalizableComponent.cs | 11 +++++++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/Label.razor b/Oqtane.Client/Modules/Controls/Label.razor index 8bde0ce7..c54ccc41 100644 --- a/Oqtane.Client/Modules/Controls/Label.razor +++ b/Oqtane.Client/Modules/Controls/Label.razor @@ -43,10 +43,7 @@ else _openLabel += ">"; - if (!string.IsNullOrEmpty(ResourceKey)) - { - ChildContent =@@Localizer[$"{ResourceKey}.Text"]; - HelpText = Localizer[$"{ResourceKey}.{nameof(HelpText)}"]; - } + ChildContent =@@Localize("Text"); + HelpText = Localize(nameof(HelpText)); } } diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs index e442c152..328ba8d5 100644 --- a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -7,10 +7,17 @@ namespace Oqtane.Modules.Controls { public class LocalizableComponent : ModuleControlBase { + private IStringLocalizer _localizer; + [Parameter] public string ResourceKey { get; set; } - protected IStringLocalizer Localizer { get; private set; } + protected string Localize(string name) + { + var key = $"{ResourceKey}.{name}"; + + return _localizer?[key] ?? key; + } protected override void OnParametersSet() { @@ -25,7 +32,7 @@ namespace Oqtane.Modules.Controls // HACK: Use ServiceActivator instead of injecting IHttpContextAccessor, because HttpContext throws NRE in WebAssembly runtime using (var scope = ServiceActivator.GetScope()) { - Localizer = (IStringLocalizer)scope.ServiceProvider.GetService(localizerType); + _localizer = (IStringLocalizer)scope.ServiceProvider.GetService(localizerType); } } } From 79b584f268ca155c85af929e52bad7e72179afc5 Mon Sep 17 00:00:00 2001 From: hishamco Date: Mon, 19 Oct 2020 21:47:59 +0300 Subject: [PATCH 4/4] Check needed if the component is localizable --- Oqtane.Client/Modules/Controls/Label.razor | 7 +++++-- .../Modules/Controls/LocalizableComponent.cs | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/Label.razor b/Oqtane.Client/Modules/Controls/Label.razor index c54ccc41..3869d8b4 100644 --- a/Oqtane.Client/Modules/Controls/Label.razor +++ b/Oqtane.Client/Modules/Controls/Label.razor @@ -43,7 +43,10 @@ else _openLabel += ">"; - ChildContent =@@Localize("Text"); - HelpText = Localize(nameof(HelpText)); + if (IsLocalizable) + { + ChildContent =@@Localize("Text"); + HelpText = Localize(nameof(HelpText)); + } } } diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs index 328ba8d5..19e1aa46 100644 --- a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -12,10 +12,17 @@ namespace Oqtane.Modules.Controls [Parameter] public string ResourceKey { get; set; } + protected bool IsLocalizable { get; private set; } + protected string Localize(string name) { - var key = $"{ResourceKey}.{name}"; + if (!IsLocalizable) + { + return null; + } + var key = $"{ResourceKey}.{name}"; + return _localizer?[key] ?? key; } @@ -35,6 +42,12 @@ namespace Oqtane.Modules.Controls _localizer = (IStringLocalizer)scope.ServiceProvider.GetService(localizerType); } } + + IsLocalizable = true; + } + else + { + IsLocalizable = false; } } }