From 46d65e708bfec83732094402976fa86fdb42df47 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 5 Jan 2021 15:41:24 +0800 Subject: [PATCH 1/2] Introduce AbpRequestLocalizationOptions Sometimes the module may need to configure RequestLocalizationOptions --- .../AbpRequestLocalizationMiddleware.cs | 4 +- .../AbpRequestLocalizationOptions.cs | 17 +++++++ ...ltAbpRequestLocalizationOptionsProvider.cs | 8 ++++ .../LocalizationTestController.cs | 15 +++++++ .../LocalizationTestController_Tests.cs | 45 +++++++++++++++++++ 5 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptions.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs index e83e240c85..06f3922b22 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs @@ -23,10 +23,10 @@ namespace Microsoft.AspNetCore.RequestLocalization public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - var middleware = new RequestLocalizationMiddleware( next, - new OptionsWrapper(await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync()), _loggerFactory + new OptionsWrapper(await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync()), + _loggerFactory ); await middleware.Invoke(context); diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptions.cs new file mode 100644 index 0000000000..ccf2aeb3f4 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptions.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; + +namespace Microsoft.AspNetCore.RequestLocalization +{ + public class AbpRequestLocalizationOptions + { + public List> RequestLocalizationOptionConfigurators { get; } + + public AbpRequestLocalizationOptions() + { + RequestLocalizationOptionConfigurators = new List>(); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs index 93ced35c45..226c0a9f6c 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Localization; using Volo.Abp.Settings; @@ -67,6 +68,13 @@ namespace Microsoft.AspNetCore.RequestLocalization .ToArray() }; + foreach (var configurator in serviceScope.ServiceProvider + .GetRequiredService>() + .Value.RequestLocalizationOptionConfigurators) + { + await configurator(serviceScope.ServiceProvider, options); + } + _optionsAction?.Invoke(options); _requestLocalizationOptions = options; } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController.cs new file mode 100644 index 0000000000..7426f95148 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController.cs @@ -0,0 +1,15 @@ +using System.Globalization; +using Microsoft.AspNetCore.Mvc; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + [Route("api/LocalizationTestController")] + public class LocalizationTestController : AbpController + { + [HttpGet] + public string Culture() + { + return CultureInfo.CurrentCulture.Name + ":" + CultureInfo.CurrentUICulture.Name; + } + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs new file mode 100644 index 0000000000..726717c2a6 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs @@ -0,0 +1,45 @@ +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.RequestLocalization; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Primitives; +using Shouldly; +using Volo.Abp.DependencyInjection; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public class LocalizationTestController_Tests : AspNetCoreMvcTestBase + { + class TestRequestCultureProvider : RequestCultureProvider, ITransientDependency + { + public override Task DetermineProviderCultureResult(HttpContext httpContext) + { + return Task.FromResult(new ProviderCultureResult((StringSegment) "tr", (StringSegment) "hu")); + } + } + + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.Configure(options => + { + options.RequestLocalizationOptionConfigurators.Add((provider, localizationOptions) => + { + localizationOptions.RequestCultureProviders.Insert(0, provider.GetRequiredService()); + return Task.CompletedTask; + }); + }); + } + + [Fact] + public async Task TestRequestCultureProvider_Test() + { + var response = await GetResponseAsync("api/LocalizationTestController", HttpStatusCode.OK); + var resultAsString = await response.Content.ReadAsStringAsync(); + resultAsString.ToLower().ShouldBe("tr:hu"); + } + } +} From 1d761eb49b9ab79d8a7a94eb1c1f7a94711c8963 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 5 Jan 2021 15:59:30 +0800 Subject: [PATCH 2/2] Update LocalizationTestController_Tests --- .../Mvc/Localization/LocalizationTestController_Tests.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs index 726717c2a6..872d85013c 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/LocalizationTestController_Tests.cs @@ -7,14 +7,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Primitives; using Shouldly; -using Volo.Abp.DependencyInjection; using Xunit; namespace Volo.Abp.AspNetCore.Mvc.Localization { public class LocalizationTestController_Tests : AspNetCoreMvcTestBase { - class TestRequestCultureProvider : RequestCultureProvider, ITransientDependency + class TestRequestCultureProvider : RequestCultureProvider { public override Task DetermineProviderCultureResult(HttpContext httpContext) { @@ -26,9 +25,9 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization { services.Configure(options => { - options.RequestLocalizationOptionConfigurators.Add((provider, localizationOptions) => + options.RequestLocalizationOptionConfigurators.Add((serviceProvider, localizationOptions) => { - localizationOptions.RequestCultureProviders.Insert(0, provider.GetRequiredService()); + localizationOptions.RequestCultureProviders.Insert(0, new TestRequestCultureProvider()); return Task.CompletedTask; }); });