From f42ad59012646d0ec11fef1491ccf5a0a43324a9 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 2 Sep 2022 15:36:40 +0800 Subject: [PATCH] Implement UI modules. --- .../LocalizableStringSerializer.cs | 15 +++-- .../FeatureManagementModal.razor.cs | 55 ++++++++++++++++- .../FeatureManagementModal.cshtml.cs | 60 ++++++++++++++++++- 3 files changed, 122 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs index 4cfd6e2f32..f721baf870 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs @@ -15,6 +15,11 @@ public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransi public virtual string Serialize(ILocalizableString localizableString) { + if (localizableString == null) + { + return null; + } + if (localizableString is LocalizableString realLocalizableString) { return $"L:{LocalizationResourceNameAttribute.GetName(realLocalizableString.ResourceType)},{realLocalizableString.Name}"; @@ -36,7 +41,7 @@ public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransi { return new FixedLocalizableString(value); } - + var type = value[0]; switch (type) { @@ -48,16 +53,16 @@ public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransi { throw new AbpException("Invalid LocalizableString value: " + value); } - + var resourceName = value.Substring(2, commaPosition - 2); var name = value.Substring(commaPosition + 1); if (name.IsNullOrWhiteSpace()) { throw new AbpException("Invalid LocalizableString value: " + value); } - + var resourceType = LocalizationOptions.Resources.GetOrNull(resourceName)?.ResourceType; - + return new LocalizableString( resourceType, name @@ -66,4 +71,4 @@ public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransi return new FixedLocalizableString(value); } } -} \ No newline at end of file +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs index e2cb9c160c..3626c52a7d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs @@ -50,9 +50,11 @@ public partial class FeatureManagementModal ToggleValues = new Dictionary(); SelectionStringValues = new Dictionary(); - Groups = (await FeatureAppService.GetAsync(ProviderName, ProviderKey))?.Groups; + var result = await FeatureAppService.GetAsync(ProviderName, ProviderKey); - Groups ??= new List(); + UpdateLocalizations(result); + + Groups = result?.Groups ?? new List(); if (Groups.Any()) { @@ -204,4 +206,53 @@ public partial class FeatureManagementModal return Task.CompletedTask; } + + private void UpdateLocalizations(GetFeatureListResultDto result) + { + foreach (var group in result.Groups) + { + group.DisplayName = Localize( + group.DisplayNameKey, + group.DisplayNameResource, + group.DisplayName + ); + + foreach (var feature in group.Features) + { + feature.DisplayName = Localize( + feature.DisplayNameKey, + feature.DisplayNameResource, + feature.DisplayName + ); + + feature.Description = Localize( + feature.DescriptionKey, + feature.DescriptionResource, + feature.Description + ); + } + } + } + + private string Localize(string key, string resourceName, string fallbackValue) + { + if (key.IsNullOrEmpty() || resourceName.IsNullOrEmpty()) + { + return fallbackValue; + } + + var resource = LocalizationOptions.Value.Resources.GetOrNull(resourceName); + if (resource == null) + { + return fallbackValue; + } + + var result = new LocalizableString(resource.ResourceType, key).Localize(StringLocalizerFactory); + if (result.ResourceNotFound) + { + return fallbackValue; + } + + return result.Value; + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index c31f25afbc..bbcbb1fb2b 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -1,12 +1,15 @@ +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.EventBus.Local; using Volo.Abp.Features; +using Volo.Abp.Localization; using Volo.Abp.Validation.StringValues; namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement; @@ -31,14 +34,18 @@ public class FeatureManagementModal : AbpPageModel protected ILocalEventBus LocalEventBus { get; } + public AbpLocalizationOptions LocalizationOptions { get; } + public FeatureManagementModal( IFeatureAppService featureAppService, - ILocalEventBus localEventBus) + ILocalEventBus localEventBus, + IOptions localizationOptions) { ObjectMapperContext = typeof(AbpFeatureManagementWebModule); FeatureAppService = featureAppService; LocalEventBus = localEventBus; + LocalizationOptions = localizationOptions.Value; } public virtual async Task OnGetAsync() @@ -47,9 +54,60 @@ public class FeatureManagementModal : AbpPageModel FeatureListResultDto = await FeatureAppService.GetAsync(ProviderName, ProviderKey); + UpdateLocalizations(FeatureListResultDto); + return Page(); } + private void UpdateLocalizations(GetFeatureListResultDto result) + { + foreach (var group in result.Groups) + { + group.DisplayName = Localize( + group.DisplayNameKey, + group.DisplayNameResource, + group.DisplayName + ); + + foreach (var feature in group.Features) + { + feature.DisplayName = Localize( + feature.DisplayNameKey, + feature.DisplayNameResource, + feature.DisplayName + ); + + feature.Description = Localize( + feature.DescriptionKey, + feature.DescriptionResource, + feature.Description + ); + } + } + } + + private string Localize(string key, string resourceName, string fallbackValue) + { + if (key.IsNullOrEmpty() || resourceName.IsNullOrEmpty()) + { + return fallbackValue; + } + + var resource = LocalizationOptions.Resources.GetOrNull(resourceName); + if (resource == null) + { + return fallbackValue; + } + + var result = new LocalizableString(resource.ResourceType, key).Localize(StringLocalizerFactory); + if (result.ResourceNotFound) + { + return fallbackValue; + } + + return result.Value; + } + public virtual async Task OnPostAsync() { var features = new UpdateFeaturesDto