From 2b5e7fd03fbd89c268cf01fd256ae18d7c0917b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Aug 2022 14:07:00 +0300 Subject: [PATCH] Allow to define non-typed localization resources. --- .../Client/RemoteLocalizationContributor.cs | 2 +- .../AbpDictionaryBasedStringLocalizer.cs | 4 +- .../Localization/AbpStringLocalizerFactory.cs | 8 +-- .../LocalizableStringSerializer.cs | 2 +- .../Abp/Localization/LocalizationResource.cs | 12 ++--- .../Localization/LocalizationResourceBase.cs | 12 ++++- .../LocalizationResourceDictionary.cs | 54 ++++++++++++++----- ...calizationResourceInitializationContext.cs | 4 +- .../NonTypedLocalizationResource.cs | 17 ++++++ .../Localization/AbpLocalizationTestModule.cs | 8 +-- .../LocalizationTestCountryNamesResource.cs | 6 --- .../Source/LocalizationTestResource.cs | 6 +-- 12 files changed, 89 insertions(+), 46 deletions(-) create mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/NonTypedLocalizationResource.cs delete mode 100644 framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/LocalizationTestCountryNamesResource.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs index c01fc6a1af..319739dc09 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Client; public class RemoteLocalizationContributor : ILocalizationResourceContributor { - private LocalizationResource _resource; + private LocalizationResourceBase _resource; private ICachedApplicationConfigurationClient _applicationConfigurationClient; private ILogger _logger; 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 102e5971d6..3acafa833e 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.Localization; public class AbpDictionaryBasedStringLocalizer : IStringLocalizer, IStringLocalizerSupportsInheritance { - public LocalizationResource Resource { get; } + public LocalizationResourceBase Resource { get; } public List BaseLocalizers { get; } @@ -21,7 +21,7 @@ public class AbpDictionaryBasedStringLocalizer : IStringLocalizer, IStringLocali public virtual LocalizedString this[string name, params object[] arguments] => GetLocalizedStringFormatted(name, arguments); public AbpDictionaryBasedStringLocalizer( - LocalizationResource resource, + LocalizationResourceBase resource, List baseLocalizers, AbpLocalizationOptions abpLocalizationOptions) { 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 63206a4d31..0712fe567c 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs @@ -34,7 +34,7 @@ public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLoca public virtual IStringLocalizer Create(Type resourceType) { - var resource = AbpLocalizationOptions.Resources.GetOrDefault(resourceType); + var resource = AbpLocalizationOptions.Resources.GetOrNull(resourceType); if (resource == null) { return InnerFactory.Create(resourceType); @@ -45,7 +45,7 @@ public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLoca public IStringLocalizer CreateByResourceNameOrNull(string resourceName) { - var resource = AbpLocalizationOptions.Resources.GetOrNull(resourceName); + var resource = AbpLocalizationOptions.Resources.GetOrDefault(resourceName); if (resource == null) { resource = ExternalLocalizationStore.GetResourceOrNull(resourceName); @@ -58,7 +58,7 @@ public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLoca return CreateInternal(resourceName, resource); } - private IStringLocalizer CreateInternal(string resourceName, LocalizationResource resource) + private IStringLocalizer CreateInternal(string resourceName, LocalizationResourceBase resource) { if (LocalizerCache.TryGetValue(resourceName, out var cacheItem)) { @@ -74,7 +74,7 @@ public class AbpStringLocalizerFactory : IStringLocalizerFactory, IAbpStringLoca } } - private StringLocalizerCacheItem CreateStringLocalizerCacheItem(LocalizationResource resource) + private StringLocalizerCacheItem CreateStringLocalizerCacheItem(LocalizationResourceBase resource) { foreach (var globalContributorType in AbpLocalizationOptions.GlobalContributors) { 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 655175f1ac..a6181d0a61 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs @@ -56,7 +56,7 @@ public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransi throw new AbpException("Invalid LocalizableString value: " + value); } - if (!LocalizationOptions.Resources.ContainsResource(resourceName)) + if (!LocalizationOptions.Resources.ContainsKey(resourceName)) { resourceName = null; } diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs index 7996ab2dbf..8158cb77b1 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs @@ -14,17 +14,13 @@ public class LocalizationResource : LocalizationResourceBase [NotNull] Type resourceType, [CanBeNull] string defaultCultureName = null, [CanBeNull] ILocalizationResourceContributor initialContributor = null) - : base(LocalizationResourceNameAttribute.GetName(resourceType)) + : base( + LocalizationResourceNameAttribute.GetName(resourceType), + defaultCultureName, + initialContributor) { ResourceType = Check.NotNull(resourceType, nameof(resourceType)); - DefaultCultureName = defaultCultureName; - AddBaseResourceTypes(); - - if (initialContributor != null) - { - Contributors.Add(initialContributor); - } } protected virtual void AddBaseResourceTypes() diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceBase.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceBase.cs index f523569ba3..a7ec4fb93b 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceBase.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceBase.cs @@ -16,10 +16,20 @@ public abstract class LocalizationResourceBase [NotNull] public LocalizationResourceContributorList Contributors { get; } - public LocalizationResourceBase([NotNull] string resourceName) + public LocalizationResourceBase( + [NotNull] string resourceName, + [CanBeNull] string defaultCultureName = null, + [CanBeNull] ILocalizationResourceContributor initialContributor = null) { ResourceName = Check.NotNullOrWhiteSpace(resourceName, nameof(resourceName)); + DefaultCultureName = defaultCultureName; + Contributors = new LocalizationResourceContributorList(); BaseResourceNames = new(); + + if (initialContributor != null) + { + Contributors.Add(initialContributor); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs index 548e7ae37d..4a88eac199 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs @@ -4,9 +4,9 @@ using JetBrains.Annotations; namespace Volo.Abp.Localization; -public class LocalizationResourceDictionary : Dictionary +public class LocalizationResourceDictionary : Dictionary { - private readonly Dictionary _resourcesByNames = new(); + private readonly Dictionary _resourcesByTypes = new(); public LocalizationResource Add([CanBeNull] string defaultCultureName = null) { @@ -15,24 +15,41 @@ public class LocalizationResourceDictionary : Dictionary() + public LocalizationResourceBase Get() { var resourceType = typeof(TResource); - var resource = this.GetOrDefault(resourceType); + var resource = _resourcesByTypes.GetOrDefault(resourceType); if (resource == null) { throw new AbpException("Can not find a resource with given type: " + resourceType.AssemblyQualifiedName); @@ -41,9 +58,9 @@ public class LocalizationResourceDictionary : Dictionary("en") + .Add("LocalizationTestCountryNames") .AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/CountryNames"); options.Resources .Add("en") - .AddVirtualJson("/Volo/Abp/Localization/TestResources/Source"); + .AddVirtualJson("/Volo/Abp/Localization/TestResources/Source") + .AddBaseResources("LocalizationTestCountryNames"); options.Resources .Get() diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/LocalizationTestCountryNamesResource.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/LocalizationTestCountryNamesResource.cs deleted file mode 100644 index a70436cbc7..0000000000 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/LocalizationTestCountryNamesResource.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Volo.Abp.Localization.TestResources.Base.CountryNames; - -public sealed class LocalizationTestCountryNamesResource -{ - -} diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs index bc32e98bcc..95a1bbd32f 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs @@ -1,11 +1,9 @@ -using Volo.Abp.Localization.TestResources.Base.CountryNames; -using Volo.Abp.Localization.TestResources.Base.Validation; +using Volo.Abp.Localization.TestResources.Base.Validation; namespace Volo.Abp.Localization.TestResources.Source; [InheritResource( - typeof(LocalizationTestValidationResource), - typeof(LocalizationTestCountryNamesResource) + typeof(LocalizationTestValidationResource) )] [LocalizationResourceName("Test")] public sealed class LocalizationTestResource