From 2f0aa53cad75ce4c6e5237ffdf7bfe89708d4a4e Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 19 Mar 2019 11:40:55 +0300 Subject: [PATCH] Support to get all strings without inheritance --- .../AbpDictionaryBasedStringLocalizer.cs | 36 +++++++++---- .../Abp/Localization/AbpLocalizationModule.cs | 3 +- .../AbpStringLocalizerExtensions.cs | 46 ++++++++++++++++ .../IStringLocalizerSupportsInheritance.cs | 10 ++++ .../Abp/Localization/AbpLocalization_Tests.cs | 52 +++++++++++++++++++ 5 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs create mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IStringLocalizerSupportsInheritance.cs diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs index 18fa853ecf..56625f5ac4 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization; namespace Volo.Abp.Localization { - public class AbpDictionaryBasedStringLocalizer : IStringLocalizer + public class AbpDictionaryBasedStringLocalizer : IStringLocalizer, IStringLocalizerSupportsInheritance { public LocalizationResource Resource { get; } @@ -32,6 +32,16 @@ namespace Volo.Abp.Localization ); } + + public IEnumerable GetAllStrings(bool includeParentCultures, bool includeBaseLocalizers) + { + return GetAllStrings( + CultureInfo.CurrentUICulture.Name, + includeParentCultures, + includeBaseLocalizers + ); + } + public IStringLocalizer WithCulture(CultureInfo culture) { return new CultureWrapperStringLocalizer(culture.Name, this); @@ -114,26 +124,30 @@ namespace Volo.Abp.Localization protected virtual IReadOnlyList GetAllStrings( string cultureName, - bool includeParentCultures = true) + bool includeParentCultures = true, + bool includeBaseLocalizers = true) { //TODO: Can be optimized (example: if it's already default dictionary, skip overriding) var allStrings = new Dictionary(); - foreach (var baseLocalizer in BaseLocalizers.Select(l => l.WithCulture(CultureInfo.GetCultureInfo(cultureName)))) + if (includeBaseLocalizers) { - //TODO: Try/catch is a workaround here! - try + foreach (var baseLocalizer in BaseLocalizers.Select(l => l.WithCulture(CultureInfo.GetCultureInfo(cultureName)))) { - var baseLocalizedString = baseLocalizer.GetAllStrings(includeParentCultures); - foreach (var localizedString in baseLocalizedString) + //TODO: Try/catch is a workaround here! + try { - allStrings[localizedString.Name] = localizedString; + var baseLocalizedString = baseLocalizer.GetAllStrings(includeParentCultures); + foreach (var localizedString in baseLocalizedString) + { + allStrings[localizedString.Name] = localizedString; + } } - } - catch (MissingManifestResourceException) - { + catch (MissingManifestResourceException) + { + } } } diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs index a65e6863a8..23e61e417f 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Localization.Resources.AbpValidation; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.Settings; using Volo.Abp.VirtualFileSystem; diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs new file mode 100644 index 0000000000..3e4a42603f --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Reflection; +using Microsoft.Extensions.Localization; +using Volo.Abp.DynamicProxy; + +namespace Volo.Abp.Localization +{ + public static class AbpStringLocalizerExtensions + { + public static IStringLocalizer GetInternalLocalizer(this IStringLocalizer stringLocalizer) + { + var localizerField = stringLocalizer.GetType() + .GetField( + "_localizer", + BindingFlags.Instance | + BindingFlags.NonPublic + ); + + if (localizerField == null) + { + return stringLocalizer; + } + + return localizerField.GetValue(stringLocalizer) as IStringLocalizer; + } + + public static IEnumerable GetAllStrings( + this IStringLocalizer stringLocalizer, + bool includeParentCultures, + bool includeBaseLocalizers) + { + var internalLocalizer = (ProxyHelper.UnProxy(stringLocalizer) as IStringLocalizer).GetInternalLocalizer(); + if (internalLocalizer is IStringLocalizerSupportsInheritance stringLocalizerSupportsInheritance) + { + return stringLocalizerSupportsInheritance.GetAllStrings( + includeParentCultures, + includeBaseLocalizers + ); + } + + return stringLocalizer.GetAllStrings( + includeParentCultures + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IStringLocalizerSupportsInheritance.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IStringLocalizerSupportsInheritance.cs new file mode 100644 index 0000000000..ccd1616a06 --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IStringLocalizerSupportsInheritance.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Microsoft.Extensions.Localization; + +namespace Volo.Abp.Localization +{ + public interface IStringLocalizerSupportsInheritance + { + IEnumerable GetAllStrings(bool includeParentCultures, bool includeBaseLocalizers); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs index 8c5a9f5702..6f141e56f0 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs @@ -21,6 +21,14 @@ namespace Volo.Abp.Localization _localizer = GetRequiredService>(); } + [Fact] + public void AbpStringLocalizerExtensions_GetInternalLocalizer() + { + var internalLocalizer = _localizer.GetInternalLocalizer(); + internalLocalizer.ShouldNotBeNull(); + internalLocalizer.ShouldBeOfType(); + } + [Fact] public void Should_Get_Same_Text_If_Not_Defined_Anywhere() { @@ -145,6 +153,50 @@ namespace Volo.Abp.Localization } } + [Fact] + public void GetAllStrings_With_Inheritance() + { + using (AbpCultureHelper.Use("tr")) + { + var localizedStrings = _localizer + .GetAllStrings(true, includeBaseLocalizers: true) + .ToList(); + + localizedStrings.ShouldContain( + ls => ls.Name == "USA" && + ls.Value == "Amerika Birleşik Devletleri" && + ls.ResourceNotFound == false + ); + + localizedStrings.ShouldContain( + ls => ls.Name == "Universe" && + ls.Value == "Evren" && + ls.ResourceNotFound == false + ); + } + } + + [Fact] + public void GetAllStrings_Without_Inheritance() + { + using (AbpCultureHelper.Use("tr")) + { + var localizedStrings = _localizer + .GetAllStrings(true, includeBaseLocalizers: false) + .ToList(); + + localizedStrings.ShouldNotContain( + ls => ls.Name == "USA" + ); + + localizedStrings.ShouldContain( + ls => ls.Name == "Universe" && + ls.Value == "Evren" && + ls.ResourceNotFound == false + ); + } + } + [DependsOn(typeof(AbpTestBaseModule))] [DependsOn(typeof(AbpLocalizationModule))] public class TestModule : AbpModule