From 614512d1f1a21c402af36ade1b52c75491705c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Aug 2022 10:11:17 +0300 Subject: [PATCH] Allow to create stringlocalizer by resource name instead of resource type --- .../AbpStringLocalizerFactoryExtensions.cs | 10 +++++- ...pport.cs => IAbpStringLocalizerFactory.cs} | 5 ++- .../Localization/AbpStringLocalizerFactory.cs | 18 +++++++++- .../AbpStringLocalizerFactory_Tests.cs | 34 +++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) rename framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/{IAbpStringLocalizerFactoryWithDefaultResourceSupport.cs => IAbpStringLocalizerFactory.cs} (50%) create mode 100644 framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpStringLocalizerFactory_Tests.cs diff --git a/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/AbpStringLocalizerFactoryExtensions.cs b/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/AbpStringLocalizerFactoryExtensions.cs index 896fdb6fa0..87c7a2a2be 100644 --- a/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/AbpStringLocalizerFactoryExtensions.cs +++ b/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/AbpStringLocalizerFactoryExtensions.cs @@ -4,7 +4,15 @@ public static class AbpStringLocalizerFactoryExtensions { public static IStringLocalizer CreateDefaultOrNull(this IStringLocalizerFactory localizerFactory) { - return (localizerFactory as IAbpStringLocalizerFactoryWithDefaultResourceSupport) + return (localizerFactory as IAbpStringLocalizerFactory) ?.CreateDefaultOrNull(); } + + public static IStringLocalizer CreateByResourceNameOrNull( + this IStringLocalizerFactory localizerFactory, + string resourceName) + { + return (localizerFactory as IAbpStringLocalizerFactory) + ?.CreateByResourceNameOrNull(resourceName); + } } diff --git a/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/IAbpStringLocalizerFactoryWithDefaultResourceSupport.cs b/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/IAbpStringLocalizerFactory.cs similarity index 50% rename from framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/IAbpStringLocalizerFactoryWithDefaultResourceSupport.cs rename to framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/IAbpStringLocalizerFactory.cs index 0ab20aec4b..d9ae96c324 100644 --- a/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/IAbpStringLocalizerFactoryWithDefaultResourceSupport.cs +++ b/framework/src/Volo.Abp.Localization.Abstractions/Microsoft/Extensions/Localization/IAbpStringLocalizerFactory.cs @@ -2,8 +2,11 @@ namespace Microsoft.Extensions.Localization; -public interface IAbpStringLocalizerFactoryWithDefaultResourceSupport +public interface IAbpStringLocalizerFactory { [CanBeNull] IStringLocalizer CreateDefaultOrNull(); + + [CanBeNull] + IStringLocalizer CreateByResourceNameOrNull([NotNull] string resourceName); } diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs index 3f47fd779d..5e8769ddab 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs @@ -9,7 +9,7 @@ using Microsoft.Extensions.Options; namespace Volo.Abp.Localization; -public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLocalizerFactoryWithDefaultResourceSupport +public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLocalizerFactory { protected internal AbpLocalizationOptions AbpLocalizationOptions { get; } protected ResourceManagerStringLocalizerFactory InnerFactory { get; } @@ -37,6 +37,22 @@ public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLoca return InnerFactory.Create(resourceType); } + return CreateInternal(resourceType, resource); + } + + public IStringLocalizer CreateByResourceNameOrNull(string resourceName) + { + var resource = AbpLocalizationOptions.Resources.GetOrNull(resourceName); + if (resource == null) + { + return null; + } + + return CreateInternal(resource.ResourceType, resource); + } + + private IStringLocalizer CreateInternal(Type resourceType, LocalizationResource resource) + { if (LocalizerCache.TryGetValue(resourceType, out var cacheItem)) { return cacheItem.Localizer; diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpStringLocalizerFactory_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpStringLocalizerFactory_Tests.cs new file mode 100644 index 0000000000..47db1bbd26 --- /dev/null +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpStringLocalizerFactory_Tests.cs @@ -0,0 +1,34 @@ +using Microsoft.Extensions.Localization; +using Shouldly; +using Volo.Abp.DynamicProxy; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.Localization; + +public class AbpStringLocalizerFactory_Tests : AbpIntegratedTest +{ + private readonly IStringLocalizerFactory _factory; + + public AbpStringLocalizerFactory_Tests() + { + _factory = GetRequiredService(); + } + + [Fact] + public void Factory_Type_Should_Be_AbpStringLocalizerFactory() + { + ProxyHelper.UnProxy(_factory).ShouldBeOfType(); + } + + [Fact] + public void Should_Create_Resource_By_Name() + { + using (CultureHelper.Use("en")) + { + var localizer = _factory.CreateByResourceNameOrNull("Test"); + localizer.ShouldNotBeNull(); + localizer["CarPlural"].Value.ShouldBe("Cars"); + } + } +} \ No newline at end of file