From 6245352da89c7ddadf0172682ae19ebfe7033600 Mon Sep 17 00:00:00 2001 From: Nicholas Mayne Date: Fri, 13 Mar 2015 17:10:00 +0000 Subject: [PATCH] #21243: Fixing issue with multiple calls to cultrue selector Taken some of the fixes from jtkech and anoordende Work Item: 21243 --- .../Helpers/ContextHelpers.cs | 3 +-- .../Selectors/ContentCultureSelector.cs | 2 +- .../Services/CurrentCultureWorkContext.cs | 27 ++++++++++++++++--- .../Services/DefaultCultureManager.cs | 16 +---------- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Helpers/ContextHelpers.cs b/src/Orchard.Web/Modules/Orchard.Localization/Helpers/ContextHelpers.cs index 8bda8071b..0d11c1d4d 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Helpers/ContextHelpers.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Helpers/ContextHelpers.cs @@ -1,5 +1,4 @@ using System.Web; -using System.Web.Routing; using Orchard.UI.Admin; namespace Orchard.Localization { @@ -9,7 +8,7 @@ namespace Orchard.Localization { } internal static bool IsRequestAdmin(HttpContextBase context) { - if (AdminFilter.IsApplied(new RequestContext(context, new RouteData()))) + if (AdminFilter.IsApplied(context.Request.RequestContext)) return true; return false; diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Selectors/ContentCultureSelector.cs b/src/Orchard.Web/Modules/Orchard.Localization/Selectors/ContentCultureSelector.cs index 873126280..b8424a5f1 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Selectors/ContentCultureSelector.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Selectors/ContentCultureSelector.cs @@ -31,7 +31,7 @@ namespace Orchard.Localization.Selectors { if (context.Request.UrlReferrer != null) path = context.Request.UrlReferrer.AbsolutePath; else - path = context.Request.Path; + return null; } else { path = context.Request.Path; diff --git a/src/Orchard/Localization/Services/CurrentCultureWorkContext.cs b/src/Orchard/Localization/Services/CurrentCultureWorkContext.cs index aa80870e0..ebee7f059 100644 --- a/src/Orchard/Localization/Services/CurrentCultureWorkContext.cs +++ b/src/Orchard/Localization/Services/CurrentCultureWorkContext.cs @@ -1,18 +1,37 @@ using System; +using System.Collections.Generic; +using System.Linq; +using Orchard.Mvc; namespace Orchard.Localization.Services { public class CurrentCultureWorkContext : IWorkContextStateProvider { - private readonly ICultureManager _cultureManager; + private readonly IEnumerable _cultureSelectors; + private readonly IHttpContextAccessor _httpContextAccessor; - public CurrentCultureWorkContext(ICultureManager cultureManager) { - _cultureManager = cultureManager; + public CurrentCultureWorkContext(IEnumerable cultureSelectors, + IHttpContextAccessor httpContextAccessor) { + _cultureSelectors = cultureSelectors; + _httpContextAccessor = httpContextAccessor; } public Func Get(string name) { if (name == "CurrentCulture") { - return ctx => (T)(object)_cultureManager.GetCurrentCulture(ctx.HttpContext); + var cultureName = GetCurrentCulture(); + return ctx => (T)(object)cultureName; } return null; } + + private string GetCurrentCulture() { + var httpContext = _httpContextAccessor.Current(); + + var culture = _cultureSelectors + .Select(c => c.GetCulture(httpContext)) + .Where(c => c != null) + .OrderByDescending(c => c.Priority) + .FirstOrDefault(c => !string.IsNullOrEmpty(c.CultureName)); + + return culture == null ? string.Empty : culture.CultureName; + } } } diff --git a/src/Orchard/Localization/Services/DefaultCultureManager.cs b/src/Orchard/Localization/Services/DefaultCultureManager.cs index 6ebc1ed6d..6f0f030c7 100644 --- a/src/Orchard/Localization/Services/DefaultCultureManager.cs +++ b/src/Orchard/Localization/Services/DefaultCultureManager.cs @@ -60,21 +60,7 @@ namespace Orchard.Localization.Services { } public string GetCurrentCulture(HttpContextBase requestContext) { - var requestCulture = _cultureSelectors - .Select(x => x.GetCulture(requestContext)) - .Where(x => x != null) - .OrderByDescending(x => x.Priority); - - if ( !requestCulture.Any() ) - return String.Empty; - - foreach (var culture in requestCulture) { - if (!String.IsNullOrEmpty(culture.CultureName)) { - return culture.CultureName; - } - } - - return String.Empty; + return _workContextAccessor.GetContext().CurrentCulture; } public CultureRecord GetCultureById(int id) {