diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs index 7e01a1c42c..910e442968 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs @@ -1,4 +1,5 @@ using Volo.Abp.Localization.TestResources.Base.Validation; +using Volo.Abp.Localization.TestResources.External; using Volo.Abp.Localization.TestResources.Source; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; @@ -34,6 +35,8 @@ public class AbpLocalizationTestModule : AbpModule options.Resources .Get() .AddVirtualJson("/Volo/Abp/Localization/TestResources/SourceExt"); + + options.GlobalContributors.Add(); }); } } \ No newline at end of file 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 ee0e929e32..e5262bc8a2 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 @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Localization; using Shouldly; +using Volo.Abp.Localization.TestResources.External; using Volo.Abp.Localization.TestResources.Source; using Volo.Abp.Testing; using Xunit; @@ -367,4 +368,11 @@ public class AbpLocalization_Tests : AbpIntegratedTest await _factory.CreateByResourceNameAsync("UnknownResourceName") ); } + + [Fact] + public void Should_Create_External_Resource_By_Name() + { + using (CultureHelper.Use("en")) + { + var localizer = _factory.CreateByResourceNameOrNull(TestExternalLocalizationStore.TestExternalResourceNames.ExternalResource1); + localizer.ShouldNotBeNull(); + localizer["CarPlural"].Value.ShouldBe("CarPlural"); + + var localizer2 = _factory.CreateByResourceNameOrNull(TestExternalLocalizationStore.TestExternalResourceNames.ExternalResource2); + localizer2.ShouldNotBeNull(); + localizer2["CarPlural"].Value.ShouldBe("CarPlural"); + } + } + + [Fact] + public async Task Should_Create_External_Resource_By_Name_Async() + { + using (CultureHelper.Use("en")) + { + var localizer = await _factory.CreateByResourceNameOrNullAsync(TestExternalLocalizationStore.TestExternalResourceNames.ExternalResource1); + localizer.ShouldNotBeNull(); + localizer["CarPlural"].Value.ShouldBe("CarPlural"); + + var localizer2 = await _factory.CreateByResourceNameOrNullAsync(TestExternalLocalizationStore.TestExternalResourceNames.ExternalResource2); + localizer2.ShouldNotBeNull(); + localizer2["CarPlural"].Value.ShouldBe("CarPlural"); + } + } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/External/TestExternalLocalizationContributor.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/External/TestExternalLocalizationContributor.cs new file mode 100644 index 0000000000..fb4e1e7043 --- /dev/null +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/External/TestExternalLocalizationContributor.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Localization; + +namespace Volo.Abp.Localization.TestResources.External; + +public class TestExternalLocalizationContributor : ILocalizationResourceContributor +{ + public bool IsDynamic => true; + + private string ResourceName { get; set; } + + public void Initialize(LocalizationResourceInitializationContext context) + { + ResourceName = context.Resource.ResourceName; + } + + public LocalizedString GetOrNull(string cultureName, string name) + { + switch (ResourceName) + { + case TestExternalLocalizationStore.TestExternalResourceNames.ExternalResource1: + case TestExternalLocalizationStore.TestExternalResourceNames.ExternalResource2: + return new LocalizedString(name, name ); + default: + return null; + } + } + + public void Fill(string cultureName, Dictionary dictionary) + { + } + + public Task FillAsync(string cultureName, Dictionary dictionary) + { + return Task.CompletedTask; + } + + public Task> GetSupportedCulturesAsync() + { + return Task.FromResult(new List().AsEnumerable()); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/External/TestExternalLocalizationStore.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/External/TestExternalLocalizationStore.cs new file mode 100644 index 0000000000..318e6f3143 --- /dev/null +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/External/TestExternalLocalizationStore.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization.External; + +namespace Volo.Abp.Localization.TestResources.External; + +public class TestExternalLocalizationStore : IExternalLocalizationStore, ITransientDependency +{ + private readonly IDictionary _resources = new LocalizationResourceDictionary(); + + public LocalizationResourceBase GetResourceOrNull(string resourceName) + { + return GetOrCreateResource(resourceName); + } + + public Task GetResourceOrNullAsync(string resourceName) + { + return Task.FromResult(GetOrCreateResource(resourceName)); + } + + public Task GetResourceNamesAsync() + { + return Task.FromResult(new []{TestExternalResourceNames.ExternalResource1, TestExternalResourceNames.ExternalResource2}); + } + + public async Task GetResourcesAsync() + { + var resourceNames = await GetResourceNamesAsync(); + return resourceNames.Select(GetResourceOrNull).ToArray(); + } + + private LocalizationResourceBase GetOrCreateResource(string resourceName) + { + if(resourceName != TestExternalResourceNames.ExternalResource1 && resourceName != TestExternalResourceNames.ExternalResource2) + { + return null; + } + + return _resources.GetOrAdd(resourceName, name => new NonTypedLocalizationResource(name)); + } + + public class TestExternalResourceNames + { + public const string ExternalResource1 = "TestExternalResource1"; + + public const string ExternalResource2 = "TestExternalResource2"; + } +} \ No newline at end of file