From 66ec1cacd869fcabf22d823aa15d254c62650c16 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 12 Jul 2021 09:14:32 +0800 Subject: [PATCH 1/2] Switch to the given language if sent in the querystring. Resolve #9384 --- .../AbpRequestLocalizationMiddleware.cs | 9 +++++++++ 1 file changed, 9 insertions(+) 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 06f3922b22..276fb6cb6c 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs @@ -29,6 +29,15 @@ namespace Microsoft.AspNetCore.RequestLocalization _loggerFactory ); + var requestCultureFeature = context.Features.Get(); + if (requestCultureFeature?.Provider is QueryStringRequestCultureProvider) + { + AbpRequestCultureCookieHelper.SetCultureCookie( + context, + requestCultureFeature.RequestCulture + ); + } + await middleware.Invoke(context); } } From c87a34b6f9bb9b3182fc4dfb113100089061fa03 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 12 Jul 2021 11:10:11 +0800 Subject: [PATCH 2/2] Avoid setting cookies multiple times. --- .../MultiTenancy/MultiTenancyMiddleware.cs | 1 + .../Localization/AbpLanguagesController.cs | 2 ++ .../AbpRequestLocalizationMiddleware.cs | 24 +++++++++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index f5541e3b40..f3d21a804b 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -64,6 +64,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy context, requestCulture ); + context.Items[AbpRequestLocalizationMiddleware.HttpContextItemName] = true; } await next(context); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs index b0fa63e4f5..f5324656b9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs @@ -33,6 +33,8 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization new RequestCulture(culture, uiCulture) ); + HttpContext.Items[AbpRequestLocalizationMiddleware.HttpContextItemName] = true; + var context = new QueryStringCultureReplacementContext(HttpContext, new RequestCulture(culture, uiCulture), returnUrl); await QueryStringCultureReplacement.ReplaceAsync(context); 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 276fb6cb6c..dad2b240d8 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs @@ -10,6 +10,8 @@ namespace Microsoft.AspNetCore.RequestLocalization { public class AbpRequestLocalizationMiddleware : IMiddleware, ITransientDependency { + public const string HttpContextItemName = "__AbpSetCultureCookie"; + private readonly IAbpRequestLocalizationOptionsProvider _requestLocalizationOptionsProvider; private readonly ILoggerFactory _loggerFactory; @@ -29,14 +31,22 @@ namespace Microsoft.AspNetCore.RequestLocalization _loggerFactory ); - var requestCultureFeature = context.Features.Get(); - if (requestCultureFeature?.Provider is QueryStringRequestCultureProvider) + context.Response.OnStarting(() => { - AbpRequestCultureCookieHelper.SetCultureCookie( - context, - requestCultureFeature.RequestCulture - ); - } + if (context.Items[HttpContextItemName] == null) + { + var requestCultureFeature = context.Features.Get(); + if (requestCultureFeature?.Provider is QueryStringRequestCultureProvider) + { + AbpRequestCultureCookieHelper.SetCultureCookie( + context, + requestCultureFeature.RequestCulture + ); + } + } + + return Task.CompletedTask; + }); await middleware.Invoke(context); }