From 34fc8bc75db599bf0d1fceca2d9c9ad03be77e6f Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 9 Jul 2021 11:16:32 +0800 Subject: [PATCH 1/4] 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); + } +} From b4040e75abc8aa4c13005abb83ca6f9b28d3bf7d Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 9 Jul 2021 13:07:47 +0800 Subject: [PATCH 2/4] Add QueryStringCultureReplacementContext. --- ...bpAspNetCoreMvcQueryStringCultureReplacement.cs | 9 +++++---- .../Mvc/Localization/AbpLanguagesController.cs | 7 ++++++- .../Localization/IQueryStringCultureReplacement.cs | 3 +-- .../QueryStringCultureReplacementContext.cs | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.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 index 7875251f64..7f4dce5da0 100644 --- 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 @@ -1,24 +1,25 @@ 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) + public virtual Task ReplaceAsync(QueryStringCultureReplacementContext context) { + var returnUrl = context.ReturnUrl; + 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); + returnUrl = Regex.Replace(returnUrl, "culture=[A-Za-z-]+?&", $"culture={context.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); + returnUrl = Regex.Replace(returnUrl, "ui-culture=[A-Za-z-]+?$", $"ui-culture={context.RequestCulture.UICulture}",RegexOptions.Compiled | RegexOptions.IgnoreCase); } } 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 33bf30045c..d4d4dabe71 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,7 +33,12 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization new RequestCulture(culture, uiCulture) ); - returnUrl = await QueryStringCultureReplacement.ReplaceAsync(returnUrl, new RequestCulture(culture, uiCulture)); + returnUrl = await QueryStringCultureReplacement.ReplaceAsync(new QueryStringCultureReplacementContext() + { + HttpContext = HttpContext, + RequestCulture = new RequestCulture(culture, uiCulture), + ReturnUrl = returnUrl + }); if (!string.IsNullOrWhiteSpace(returnUrl)) { 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 index b08287be19..2635852a6c 100644 --- 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 @@ -1,10 +1,9 @@ using System.Threading.Tasks; -using Microsoft.AspNetCore.Localization; namespace Volo.Abp.AspNetCore.Mvc.Localization { public interface IQueryStringCultureReplacement { - Task ReplaceAsync(string returnUrl, RequestCulture requestCulture); + Task ReplaceAsync(QueryStringCultureReplacementContext context); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs new file mode 100644 index 0000000000..b537cf2baf --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public class QueryStringCultureReplacementContext + { + public HttpContext HttpContext { get; set; } + + public string ReturnUrl { get; set; } + + public RequestCulture RequestCulture { get; set; } + } +} From addefc2a925db4f9951c759c727e08910d8e488e Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 9 Jul 2021 13:47:31 +0800 Subject: [PATCH 3/4] Support multiple culture replacement providers --- ...NetCoreMvcQueryStringCultureReplacement.cs | 30 ++++++++++------- .../Localization/AbpLanguagesController.cs | 12 +++---- ...ltQueryStringCultureReplacementProvider.cs | 33 +++++++++++++++++++ .../IQueryStringCultureReplacement.cs | 2 +- .../IQueryStringCultureReplacementProvider.cs | 9 +++++ .../QueryStringCultureReplacementContext.cs | 11 +++++-- .../QueryStringCultureReplacementOptions.cs | 15 +++++++++ 7 files changed, 89 insertions(+), 23 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.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 index 7f4dce5da0..376a3c8446 100644 --- 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 @@ -1,29 +1,35 @@ using System; -using System.Text.RegularExpressions; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.Localization { public class AbpAspNetCoreMvcQueryStringCultureReplacement : IQueryStringCultureReplacement, ITransientDependency { - public virtual Task ReplaceAsync(QueryStringCultureReplacementContext context) + protected AbpQueryStringCultureReplacementOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } + + public AbpAspNetCoreMvcQueryStringCultureReplacement( + IOptions queryStringCultureReplacementOptions, + IServiceProvider serviceProvider) { - var returnUrl = context.ReturnUrl; + ServiceProvider = serviceProvider; + Options = queryStringCultureReplacementOptions.Value; + } - if (!string.IsNullOrWhiteSpace(returnUrl)) + public virtual async Task ReplaceAsync(QueryStringCultureReplacementContext context) + { + using (var scope = ServiceProvider.CreateScope()) { - if (returnUrl.Contains("culture=", StringComparison.OrdinalIgnoreCase)) + foreach (var provider in Options.QueryStringCultureReplacementProviders) { - returnUrl = Regex.Replace(returnUrl, "culture=[A-Za-z-]+?&", $"culture={context.RequestCulture.Culture}&", RegexOptions.Compiled | RegexOptions.IgnoreCase); - } - if (returnUrl.Contains("ui-Culture=", StringComparison.OrdinalIgnoreCase)) - { - returnUrl = Regex.Replace(returnUrl, "ui-culture=[A-Za-z-]+?$", $"ui-culture={context.RequestCulture.UICulture}",RegexOptions.Compiled | RegexOptions.IgnoreCase); + // ReSharper disable once PossibleNullReferenceException + await (scope.ServiceProvider.GetRequiredService(provider) as IQueryStringCultureReplacementProvider) + .ReplaceAsync(context); } } - - 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 d4d4dabe71..b0fa63e4f5 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,16 +33,12 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization new RequestCulture(culture, uiCulture) ); - returnUrl = await QueryStringCultureReplacement.ReplaceAsync(new QueryStringCultureReplacementContext() - { - HttpContext = HttpContext, - RequestCulture = new RequestCulture(culture, uiCulture), - ReturnUrl = returnUrl - }); + var context = new QueryStringCultureReplacementContext(HttpContext, new RequestCulture(culture, uiCulture), returnUrl); + await QueryStringCultureReplacement.ReplaceAsync(context); - if (!string.IsNullOrWhiteSpace(returnUrl)) + if (!string.IsNullOrWhiteSpace(context.ReturnUrl)) { - return Redirect(GetRedirectUrl(returnUrl)); + return Redirect(GetRedirectUrl(context.ReturnUrl)); } return Redirect("~/"); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs new file mode 100644 index 0000000000..04c7ed4554 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs @@ -0,0 +1,33 @@ +using System; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public class DefaultQueryStringCultureReplacementProvider : IQueryStringCultureReplacementProvider, ITransientDependency + { + public Task ReplaceAsync(QueryStringCultureReplacementContext context) + { + if (!string.IsNullOrWhiteSpace(context.ReturnUrl)) + { + if (context.ReturnUrl.Contains("culture=", StringComparison.OrdinalIgnoreCase) && + context.ReturnUrl.Contains("ui-Culture=", StringComparison.OrdinalIgnoreCase)) + { + context.ReturnUrl = Regex.Replace( + context.ReturnUrl, + "culture=[A-Za-z-]+?&", + $"culture={context.RequestCulture.Culture}&", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + context.ReturnUrl = Regex.Replace( + context.ReturnUrl, "ui-culture=[A-Za-z-]+?$", + $"ui-culture={context.RequestCulture.UICulture}", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + } + } + + return Task.CompletedTask; + } + } +} 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 index 2635852a6c..7cd8113060 100644 --- 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 @@ -4,6 +4,6 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization { public interface IQueryStringCultureReplacement { - Task ReplaceAsync(QueryStringCultureReplacementContext context); + Task ReplaceAsync(QueryStringCultureReplacementContext context); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs new file mode 100644 index 0000000000..4f4ca7df68 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public interface IQueryStringCultureReplacementProvider + { + Task ReplaceAsync(QueryStringCultureReplacementContext context); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs index b537cf2baf..11437a91ce 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementContext.cs @@ -5,10 +5,17 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization { public class QueryStringCultureReplacementContext { - public HttpContext HttpContext { get; set; } + public HttpContext HttpContext { get; } + + public RequestCulture RequestCulture { get; } public string ReturnUrl { get; set; } - public RequestCulture RequestCulture { get; set; } + public QueryStringCultureReplacementContext(HttpContext httpContext, RequestCulture requestCulture, string returnUrl) + { + HttpContext = httpContext; + RequestCulture = requestCulture; + ReturnUrl = returnUrl; + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.cs new file mode 100644 index 0000000000..2b3d105ee7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.cs @@ -0,0 +1,15 @@ +using Volo.Abp.Collections; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + public class AbpQueryStringCultureReplacementOptions + { + public ITypeList QueryStringCultureReplacementProviders { get; } + + public AbpQueryStringCultureReplacementOptions() + { + QueryStringCultureReplacementProviders = new TypeList(); + QueryStringCultureReplacementProviders.Add(); + } + } +} From a627e1d754eb5ac31470b7b642f8da5951b75aa5 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 9 Jul 2021 14:35:44 +0800 Subject: [PATCH 4/4] Make the implementation simpler. --- ...NetCoreMvcQueryStringCultureReplacement.cs | 36 +++++++++---------- ...ltQueryStringCultureReplacementProvider.cs | 33 ----------------- .../IQueryStringCultureReplacementProvider.cs | 9 ----- .../QueryStringCultureReplacementOptions.cs | 15 -------- 4 files changed, 17 insertions(+), 76 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.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 index 376a3c8446..900d1c5de7 100644 --- 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 @@ -1,35 +1,33 @@ using System; +using System.Text.RegularExpressions; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.Localization { public class AbpAspNetCoreMvcQueryStringCultureReplacement : IQueryStringCultureReplacement, ITransientDependency { - protected AbpQueryStringCultureReplacementOptions Options { get; } - protected IServiceProvider ServiceProvider { get; } - - public AbpAspNetCoreMvcQueryStringCultureReplacement( - IOptions queryStringCultureReplacementOptions, - IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - Options = queryStringCultureReplacementOptions.Value; - } - - public virtual async Task ReplaceAsync(QueryStringCultureReplacementContext context) + public virtual Task ReplaceAsync(QueryStringCultureReplacementContext context) { - using (var scope = ServiceProvider.CreateScope()) + if (!string.IsNullOrWhiteSpace(context.ReturnUrl)) { - foreach (var provider in Options.QueryStringCultureReplacementProviders) + if (context.ReturnUrl.Contains("culture=", StringComparison.OrdinalIgnoreCase) && + context.ReturnUrl.Contains("ui-Culture=", StringComparison.OrdinalIgnoreCase)) { - // ReSharper disable once PossibleNullReferenceException - await (scope.ServiceProvider.GetRequiredService(provider) as IQueryStringCultureReplacementProvider) - .ReplaceAsync(context); + context.ReturnUrl = Regex.Replace( + context.ReturnUrl, + "culture=[A-Za-z-]+?&", + $"culture={context.RequestCulture.Culture}&", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + context.ReturnUrl = Regex.Replace( + context.ReturnUrl, "ui-culture=[A-Za-z-]+?$", + $"ui-culture={context.RequestCulture.UICulture}", + RegexOptions.Compiled | RegexOptions.IgnoreCase); } } + + return Task.CompletedTask; } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs deleted file mode 100644 index 04c7ed4554..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/DefaultQueryStringCultureReplacementProvider.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.AspNetCore.Mvc.Localization -{ - public class DefaultQueryStringCultureReplacementProvider : IQueryStringCultureReplacementProvider, ITransientDependency - { - public Task ReplaceAsync(QueryStringCultureReplacementContext context) - { - if (!string.IsNullOrWhiteSpace(context.ReturnUrl)) - { - if (context.ReturnUrl.Contains("culture=", StringComparison.OrdinalIgnoreCase) && - context.ReturnUrl.Contains("ui-Culture=", StringComparison.OrdinalIgnoreCase)) - { - context.ReturnUrl = Regex.Replace( - context.ReturnUrl, - "culture=[A-Za-z-]+?&", - $"culture={context.RequestCulture.Culture}&", - RegexOptions.Compiled | RegexOptions.IgnoreCase); - - context.ReturnUrl = Regex.Replace( - context.ReturnUrl, "ui-culture=[A-Za-z-]+?$", - $"ui-culture={context.RequestCulture.UICulture}", - RegexOptions.Compiled | RegexOptions.IgnoreCase); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs deleted file mode 100644 index 4f4ca7df68..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/IQueryStringCultureReplacementProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Volo.Abp.AspNetCore.Mvc.Localization -{ - public interface IQueryStringCultureReplacementProvider - { - Task ReplaceAsync(QueryStringCultureReplacementContext context); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.cs deleted file mode 100644 index 2b3d105ee7..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/QueryStringCultureReplacementOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Volo.Abp.Collections; - -namespace Volo.Abp.AspNetCore.Mvc.Localization -{ - public class AbpQueryStringCultureReplacementOptions - { - public ITypeList QueryStringCultureReplacementProviders { get; } - - public AbpQueryStringCultureReplacementOptions() - { - QueryStringCultureReplacementProviders = new TypeList(); - QueryStringCultureReplacementProviders.Add(); - } - } -}