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 56625f5ac4..0cfe90d9ef 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs @@ -179,7 +179,7 @@ namespace Volo.Abp.Localization : cultureName; } - public class CultureWrapperStringLocalizer : IStringLocalizer + public class CultureWrapperStringLocalizer : IStringLocalizer, IStringLocalizerSupportsInheritance { private readonly string _cultureName; private readonly AbpDictionaryBasedStringLocalizer _innerLocalizer; @@ -203,6 +203,11 @@ namespace Volo.Abp.Localization { return new CultureWrapperStringLocalizer(culture.Name, _innerLocalizer); } + + public IEnumerable GetAllStrings(bool includeParentCultures, bool includeBaseLocalizers) + { + return _innerLocalizer.GetAllStrings(includeParentCultures, includeBaseLocalizers); + } } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs index 3e4a42603f..218f9c4164 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs @@ -1,15 +1,27 @@ using System.Collections.Generic; using System.Reflection; +using JetBrains.Annotations; using Microsoft.Extensions.Localization; using Volo.Abp.DynamicProxy; +using Volo.Abp.Reflection; namespace Volo.Abp.Localization { public static class AbpStringLocalizerExtensions { - public static IStringLocalizer GetInternalLocalizer(this IStringLocalizer stringLocalizer) + [NotNull] + public static IStringLocalizer GetInternalLocalizer( + [NotNull] this IStringLocalizer stringLocalizer) { - var localizerField = stringLocalizer.GetType() + Check.NotNull(stringLocalizer, nameof(stringLocalizer)); + + var localizerType = stringLocalizer.GetType(); + if (!ReflectionHelper.IsAssignableToGenericType(localizerType, typeof(StringLocalizer<>))) + { + return stringLocalizer; + } + + var localizerField = localizerType .GetField( "_localizer", BindingFlags.Instance | @@ -18,7 +30,7 @@ namespace Volo.Abp.Localization if (localizerField == null) { - return stringLocalizer; + throw new AbpException($"Could not find the _localizer field inside the {typeof(StringLocalizer<>).FullName} class. Probably its name has changed. Please report this issue to the ABP framework."); } return localizerField.GetValue(stringLocalizer) as IStringLocalizer; 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 6f141e56f0..309e317997 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 @@ -15,10 +15,12 @@ namespace Volo.Abp.Localization public class AbpLocalization_Tests : AbpIntegratedTest { private readonly IStringLocalizer _localizer; + private readonly IStringLocalizerFactory _localizerFactory; public AbpLocalization_Tests() { _localizer = GetRequiredService>(); + _localizerFactory = GetRequiredService(); } [Fact] @@ -29,6 +31,14 @@ namespace Volo.Abp.Localization internalLocalizer.ShouldBeOfType(); } + [Fact] + public void AbpStringLocalizerExtensions_GetInternalLocalizer_Using_LocalizerFactory() + { + var internalLocalizer = _localizerFactory.Create(typeof(LocalizationTestResource)).GetInternalLocalizer(); + internalLocalizer.ShouldNotBeNull(); + internalLocalizer.ShouldBeOfType(); + } + [Fact] public void Should_Get_Same_Text_If_Not_Defined_Anywhere() { @@ -173,6 +183,12 @@ namespace Volo.Abp.Localization ls.Value == "Evren" && ls.ResourceNotFound == false ); + + localizedStrings.ShouldContain( + ls => ls.Name == "SeeYou" && + ls.Value == "See you" && + ls.ResourceNotFound == false + ); } } @@ -194,6 +210,12 @@ namespace Volo.Abp.Localization ls.Value == "Evren" && ls.ResourceNotFound == false ); + + localizedStrings.ShouldContain( + ls => ls.Name == "SeeYou" && + ls.Value == "See you" && + ls.ResourceNotFound == false + ); } }