Browse Source

Allow to define non-typed localization resources.

pull/13845/head
Halil İbrahim Kalkan 4 years ago
parent
commit
2b5e7fd03f
  1. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs
  2. 4
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs
  3. 8
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerFactory.cs
  4. 2
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs
  5. 12
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs
  6. 12
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceBase.cs
  7. 54
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs
  8. 4
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceInitializationContext.cs
  9. 17
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/NonTypedLocalizationResource.cs
  10. 8
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs
  11. 6
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/LocalizationTestCountryNamesResource.cs
  12. 6
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs

2
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<RemoteLocalizationContributor> _logger;

4
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<IStringLocalizer> 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<IStringLocalizer> baseLocalizers,
AbpLocalizationOptions abpLocalizationOptions)
{

8
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)
{

2
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;
}

12
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()

12
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);
}
}
}

54
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<Type, LocalizationResource>
public class LocalizationResourceDictionary : Dictionary<string, LocalizationResourceBase>
{
private readonly Dictionary<string, LocalizationResource> _resourcesByNames = new();
private readonly Dictionary<Type, LocalizationResourceBase> _resourcesByTypes = new();
public LocalizationResource Add<TResouce>([CanBeNull] string defaultCultureName = null)
{
@ -15,24 +15,41 @@ public class LocalizationResourceDictionary : Dictionary<Type, LocalizationResou
public LocalizationResource Add(Type resourceType, [CanBeNull] string defaultCultureName = null)
{
if (ContainsKey(resourceType))
var resourceName = LocalizationResourceNameAttribute.GetName(resourceType);
if (ContainsKey(resourceName))
{
throw new AbpException("This resource is already added before: " + resourceType.AssemblyQualifiedName);
}
var resource = new LocalizationResource(resourceType, defaultCultureName);
this[resourceType] = resource;
_resourcesByNames[resource.ResourceName] = resource;
this[resourceName] = resource;
_resourcesByTypes[resourceType] = resource;
return resource;
}
public NonTypedLocalizationResource Add([NotNull] string resourceName, [CanBeNull] string defaultCultureName = null)
{
Check.NotNullOrWhiteSpace(resourceName, nameof(resourceName));
if (ContainsKey(resourceName))
{
throw new AbpException("This resource is already added before: " + resourceName);
}
var resource = new NonTypedLocalizationResource(resourceName, defaultCultureName);
this[resourceName] = resource;
return resource;
}
public LocalizationResource Get<TResource>()
public LocalizationResourceBase Get<TResource>()
{
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<Type, LocalizationResou
return resource;
}
public LocalizationResource Get(string resourceName)
public LocalizationResourceBase Get(string resourceName)
{
var resource = GetOrNull(resourceName);
var resource = this.GetOrDefault(resourceName);
if (resource == null)
{
throw new AbpException("Can not find a resource with given name: " + resourceName);
@ -51,14 +68,25 @@ public class LocalizationResourceDictionary : Dictionary<Type, LocalizationResou
return resource;
}
public LocalizationResourceBase Get(Type resourceType)
{
var resource = GetOrNull(resourceType);
if (resource == null)
{
throw new AbpException("Can not find a resource with given type: " + resourceType);
}
return resource;
}
public LocalizationResource GetOrNull(string resourceName)
public LocalizationResourceBase GetOrNull(Type resourceType)
{
return _resourcesByNames.GetOrDefault(resourceName);
return _resourcesByTypes.GetOrDefault(resourceType);
}
public bool ContainsResource(string resourceName)
public bool ContainsResource(Type resourceType)
{
return _resourcesByNames.ContainsKey(resourceName);
return _resourcesByTypes.ContainsKey(resourceType);
}
}

4
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceInitializationContext.cs

@ -4,11 +4,11 @@ namespace Volo.Abp.Localization;
public class LocalizationResourceInitializationContext
{
public LocalizationResource Resource { get; }
public LocalizationResourceBase Resource { get; }
public IServiceProvider ServiceProvider { get; }
public LocalizationResourceInitializationContext(LocalizationResource resource, IServiceProvider serviceProvider)
public LocalizationResourceInitializationContext(LocalizationResourceBase resource, IServiceProvider serviceProvider)
{
Resource = resource;
ServiceProvider = serviceProvider;

17
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/NonTypedLocalizationResource.cs

@ -0,0 +1,17 @@
using JetBrains.Annotations;
namespace Volo.Abp.Localization;
public class NonTypedLocalizationResource : LocalizationResourceBase
{
public NonTypedLocalizationResource(
[NotNull] string resourceName,
[CanBeNull] string defaultCultureName = null,
[CanBeNull] ILocalizationResourceContributor initialContributor = null
) : base(
resourceName,
defaultCultureName,
initialContributor)
{
}
}

8
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs

@ -1,5 +1,4 @@
using Volo.Abp.Localization.TestResources.Base.CountryNames;
using Volo.Abp.Localization.TestResources.Base.Validation;
using Volo.Abp.Localization.TestResources.Base.Validation;
using Volo.Abp.Localization.TestResources.Source;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
@ -24,12 +23,13 @@ public class AbpLocalizationTestModule : AbpModule
.AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/Validation");
options.Resources
.Add<LocalizationTestCountryNamesResource>("en")
.Add("LocalizationTestCountryNames")
.AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/CountryNames");
options.Resources
.Add<LocalizationTestResource>("en")
.AddVirtualJson("/Volo/Abp/Localization/TestResources/Source");
.AddVirtualJson("/Volo/Abp/Localization/TestResources/Source")
.AddBaseResources("LocalizationTestCountryNames");
options.Resources
.Get<LocalizationTestResource>()

6
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/LocalizationTestCountryNamesResource.cs

@ -1,6 +0,0 @@
namespace Volo.Abp.Localization.TestResources.Base.CountryNames;
public sealed class LocalizationTestCountryNamesResource
{
}

6
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

Loading…
Cancel
Save