diff --git a/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs b/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs index 6170f2179c..f46a90d262 100644 --- a/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs +++ b/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs @@ -6,7 +6,6 @@ using Volo.Abp.Identity.Web.Localization.Resource; using Volo.Abp.Identity.Web.Navigation; using Volo.Abp.Identity.Web.ObjectMappings; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.Validation; using Volo.Abp.Modularity; using Volo.Abp.Ui.Navigation; using Volo.Abp.VirtualFileSystem; @@ -42,9 +41,7 @@ namespace Volo.Abp.Identity.Web services.Configure(options => { - //TODO: Declare base type by attribute - options.Resources.AddJson("en") - .InheritFrom(typeof(AbpValidationResource)); + options.Resources.AddJson("en"); }); services.Configure(options => diff --git a/src/Volo.Abp.Identity.Web/Localization/Resource/IdentityResource.cs b/src/Volo.Abp.Identity.Web/Localization/Resource/IdentityResource.cs index 2829300a3f..c0cd16cb74 100644 --- a/src/Volo.Abp.Identity.Web/Localization/Resource/IdentityResource.cs +++ b/src/Volo.Abp.Identity.Web/Localization/Resource/IdentityResource.cs @@ -1,8 +1,10 @@ using Volo.Abp.Localization; +using Volo.Abp.Localization.Resources.Validation; namespace Volo.Abp.Identity.Web.Localization.Resource { [ShortLocalizationResourceName("AbpIdentity")] + [InheritResource(typeof(AbpValidationResource))] public class IdentityResource { diff --git a/src/Volo.Abp/Volo/Abp/Localization/IInheritedResourceTypesProvider.cs b/src/Volo.Abp/Volo/Abp/Localization/IInheritedResourceTypesProvider.cs new file mode 100644 index 0000000000..c9e41774cd --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Localization/IInheritedResourceTypesProvider.cs @@ -0,0 +1,11 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.Localization +{ + public interface IInheritedResourceTypesProvider + { + [NotNull] + Type[] GetInheritedModuleTypes(); + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Localization/InheritResourceAttribute.cs b/src/Volo.Abp/Volo/Abp/Localization/InheritResourceAttribute.cs new file mode 100644 index 0000000000..1ee8aa85e9 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Localization/InheritResourceAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace Volo.Abp.Localization +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] + public class InheritResourceAttribute : Attribute, IInheritedResourceTypesProvider + { + public Type[] ResourceTypes { get; } + + public InheritResourceAttribute(params Type[] resourceTypes) + { + ResourceTypes = resourceTypes ?? new Type[0]; + } + + public Type[] GetInheritedModuleTypes() + { + return ResourceTypes; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Localization/LocalizationResource.cs b/src/Volo.Abp/Volo/Abp/Localization/LocalizationResource.cs index a881cac337..39fdc86d03 100644 --- a/src/Volo.Abp/Volo/Abp/Localization/LocalizationResource.cs +++ b/src/Volo.Abp/Volo/Abp/Localization/LocalizationResource.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using JetBrains.Annotations; namespace Volo.Abp.Localization @@ -28,6 +29,8 @@ namespace Volo.Abp.Localization BaseResourceTypes = new List(); Extensions = new List(); + + AddBaseResourceTypes(); } public virtual void Initialize(IServiceProvider serviceProvider) //TODO: Create a LocalizationResourceInitializationContext! @@ -40,5 +43,20 @@ namespace Volo.Abp.Localization DictionaryProvider.Extend(extension); } } + + protected virtual void AddBaseResourceTypes() + { + var descriptors = ResourceType + .GetCustomAttributes(true) + .OfType(); + + foreach (var descriptor in descriptors) + { + foreach (var baseResourceType in descriptor.GetInheritedModuleTypes()) + { + BaseResourceTypes.AddIfNotContains(baseResourceType); + } + } + } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Modularity/AbpModuleHelper.cs b/src/Volo.Abp/Volo/Abp/Modularity/AbpModuleHelper.cs index f13d21a9d2..295356ad31 100644 --- a/src/Volo.Abp/Volo/Abp/Modularity/AbpModuleHelper.cs +++ b/src/Volo.Abp/Volo/Abp/Modularity/AbpModuleHelper.cs @@ -22,7 +22,6 @@ namespace Volo.Abp.Modularity var dependencies = new List(); var dependencyDescriptors = moduleType - .GetTypeInfo() .GetCustomAttributes() .OfType(); diff --git a/src/Volo.Abp/Volo/Abp/Modularity/DependsOnAttribute.cs b/src/Volo.Abp/Volo/Abp/Modularity/DependsOnAttribute.cs index aa71b4954b..5cd3a2baaf 100644 --- a/src/Volo.Abp/Volo/Abp/Modularity/DependsOnAttribute.cs +++ b/src/Volo.Abp/Volo/Abp/Modularity/DependsOnAttribute.cs @@ -25,7 +25,6 @@ namespace Volo.Abp.Modularity DependedModuleTypes = dependedModuleTypes ?? new Type[0]; } - [NotNull] public virtual Type[] GetDependedModuleTypes() { return DependedModuleTypes; diff --git a/test/Volo.Abp.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs b/test/Volo.Abp.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs index 7981922126..93a0a14bae 100644 --- a/test/Volo.Abp.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs +++ b/test/Volo.Abp.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs @@ -112,14 +112,7 @@ namespace Volo.Abp.Localization { options.Resources.AddJson("en"); options.Resources.AddJson("en"); - - //TODO: Declare base type by attribute - options.Resources.AddJson("en") - .InheritFrom( - typeof(LocalizationTestValidationResource), - typeof(LocalizationTestCountryNamesResource) - ); - + options.Resources.AddJson("en"); options.Resources.ExtendWithJson(); }); } diff --git a/test/Volo.Abp.Tests/Volo/Abp/Localization/Source/LocalizationTestResource.cs b/test/Volo.Abp.Tests/Volo/Abp/Localization/Source/LocalizationTestResource.cs index 7a9b6be6ca..73d4c400cd 100644 --- a/test/Volo.Abp.Tests/Volo/Abp/Localization/Source/LocalizationTestResource.cs +++ b/test/Volo.Abp.Tests/Volo/Abp/Localization/Source/LocalizationTestResource.cs @@ -1,5 +1,10 @@ -namespace Volo.Abp.Localization.Source +using Volo.Abp.Localization.Base.CountryNames; +using Volo.Abp.Localization.Base.Validation; + +namespace Volo.Abp.Localization.Source { + [InheritResource(typeof(LocalizationTestValidationResource))] + [InheritResource(typeof(LocalizationTestCountryNamesResource))] public sealed class LocalizationTestResource {