From 34fc8bc75db599bf0d1fceca2d9c9ad03be77e6f Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 9 Jul 2021 11:16:32 +0800 Subject: [PATCH] Add QueryStringCultureReplacement. --- ...NetCoreMvcQueryStringCultureReplacement.cs | 28 +++++++++++++++++++ .../Localization/AbpLanguagesController.cs | 14 ++++++++-- .../IQueryStringCultureReplacement.cs | 10 +++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpAspNetCoreMvcQueryStringCultureReplacement.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacement.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpAspNetCoreMvcQueryStringCultureReplacement.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpAspNetCoreMvcQueryStringCultureReplacement.cs new file mode 100644 index 0000000000..7875251f64 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpAspNetCoreMvcQueryStringCultureReplacement.cs @@ -0,0 +1,28 @@ +using System; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Localization; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public class AbpAspNetCoreMvcQueryStringCultureReplacement : IQueryStringCultureReplacement, ITransientDependency + { + public virtual Task ReplaceAsync(string returnUrl, RequestCulture requestCulture) + { + if (!string.IsNullOrWhiteSpace(returnUrl)) + { + if (returnUrl.Contains("culture=", StringComparison.OrdinalIgnoreCase)) + { + returnUrl = Regex.Replace(returnUrl, "culture=[A-Za-z-]+?&", $"culture={requestCulture.Culture}&", RegexOptions.Compiled | RegexOptions.IgnoreCase); + } + if (returnUrl.Contains("ui-Culture=", StringComparison.OrdinalIgnoreCase)) + { + returnUrl = Regex.Replace(returnUrl, "ui-culture=[A-Za-z-]+?$", $"ui-culture={requestCulture.UICulture}",RegexOptions.Compiled | RegexOptions.IgnoreCase); + } + } + + return Task.FromResult(returnUrl); + } + } +} 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 6b73aa26da..33bf30045c 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 @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc; using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.RequestLocalization; using Volo.Abp.Localization; @@ -12,8 +13,15 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization [ApiExplorerSettings(IgnoreApi = true)] public class AbpLanguagesController : AbpController { + protected IQueryStringCultureReplacement QueryStringCultureReplacement { get; } + + public AbpLanguagesController(IQueryStringCultureReplacement queryStringCultureReplacement) + { + QueryStringCultureReplacement = queryStringCultureReplacement; + } + [HttpGet] - public IActionResult Switch(string culture, string uiCulture = "", string returnUrl = "") + public virtual async Task Switch(string culture, string uiCulture = "", string returnUrl = "") { if (!CultureHelper.IsValidCultureCode(culture)) { @@ -25,6 +33,8 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization new RequestCulture(culture, uiCulture) ); + returnUrl = await QueryStringCultureReplacement.ReplaceAsync(returnUrl, new RequestCulture(culture, uiCulture)); + if (!string.IsNullOrWhiteSpace(returnUrl)) { return Redirect(GetRedirectUrl(returnUrl)); @@ -33,7 +43,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization return Redirect("~/"); } - private string GetRedirectUrl(string returnUrl) + protected virtual string GetRedirectUrl(string returnUrl) { if (returnUrl.IsNullOrEmpty()) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacement.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacement.cs new file mode 100644 index 0000000000..b08287be19 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacement.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Localization; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public interface IQueryStringCultureReplacement + { + Task ReplaceAsync(string returnUrl, RequestCulture requestCulture); + } +}