Moving away from the providers and pushin all to Selectors, makes for a cleaner iplementation

This commit is contained in:
Nicholas Mayne
2014-09-23 22:20:38 +01:00
parent b2bd25f1af
commit ba16115128
8 changed files with 76 additions and 110 deletions

View File

@@ -0,0 +1,19 @@
using System.Web;
using System.Web.Routing;
using Orchard.UI.Admin;
namespace Orchard.Localization {
public static class ContextHelpers {
internal static bool IsRequestFrontEnd(HttpContextBase context) {
return !IsRequestAdmin(context);
}
internal static bool IsRequestAdmin(HttpContextBase context) {
if (AdminFilter.IsApplied(new RequestContext(context, new RouteData())))
return true;
return false;
}
}
}

View File

@@ -67,16 +67,17 @@
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Controllers\TransliterationAdminController.cs" />
<Compile Include="Controllers\AdminCutlureSelectorController.cs" />
<Compile Include="Helpers\ContextHelpers.cs" />
<Compile Include="Models\TransliterationSpecificationRecord.cs" />
<Compile Include="Selectors\DefaultAdminCultureSelector.cs" />
<Compile Include="Providers\BrowserCultureProvider.cs" />
<Compile Include="Selectors\DefaultFrontEndCultureSelector.cs" />
<Compile Include="Selectors\ContentCultureSelector.cs" />
<Compile Include="Selectors\RouteCultureSelector.cs" />
<Compile Include="Selectors\BrowserCultureSelector.cs" />
<Compile Include="Providers\ICultureStorageProvider.cs" />
<Compile Include="RuleEngine\CultureRuleProvider.cs" />
<Compile Include="Services\AdminDirectionalityFactory.cs" />
<Compile Include="Services\CultureSelectorFactory.cs" />
<Compile Include="Services\LocalizationCultureFilter.cs" />
<Compile Include="Providers\CookieCultureProvider.cs" />
<Compile Include="Selectors\CookieCultureSelector.cs" />
<Compile Include="Drivers\LocalizationPartDriver.cs" />
<Compile Include="Handlers\LocalizationPartHandler.cs" />
<Compile Include="Migrations.cs" />
@@ -85,7 +86,6 @@
<Compile Include="Projections\CurrentCultureFilter.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResourceManifest.cs" />
<Compile Include="Providers\ICultureProvider.cs" />
<Compile Include="Services\ILocalizationService.cs" />
<Compile Include="Services\ITransliterationService.cs" />
<Compile Include="Providers\LocalizationDateTimeFormatProvider.cs" />

View File

@@ -1,6 +0,0 @@
namespace Orchard.Localization.Providers {
public interface ICultureProvider : IDependency {
string GetCulture();
int Priority { get; }
}
}

View File

@@ -1,32 +1,25 @@
using System;
using System.Globalization;
using System.Linq;
using System.Web;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
using Orchard.Mvc;
namespace Orchard.Localization.Providers {
namespace Orchard.Localization.Selectors {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class BrowserCultureProvider : ICultureProvider {
public class BrowserCultureSelector : ICultureSelector {
private readonly Lazy<ICultureManager> _cultureManager;
private readonly IHttpContextAccessor _httpContextAccessor;
public BrowserCultureProvider(
Lazy<ICultureManager> cultureManager,
IHttpContextAccessor httpContextAccessor) {
public BrowserCultureSelector(
Lazy<ICultureManager> cultureManager) {
_cultureManager = cultureManager;
_httpContextAccessor = httpContextAccessor;
}
public string GetCulture() {
var httpContext = _httpContextAccessor.Current();
if (httpContext == null) return null;
public CultureSelectorResult GetCulture(HttpContextBase context) {
/* Fall back to Browser */
var userLanguages = httpContext.Request.UserLanguages;
var userLanguages = context.Request.UserLanguages;
if (userLanguages == null || userLanguages.Length == 0)
if (userLanguages == null || !userLanguages.Any())
return null;
var cultures = _cultureManager.Value.ListCultures().ToList();
@@ -36,7 +29,7 @@ namespace Orchard.Localization.Providers {
if (cultures.Contains(language, StringComparer.OrdinalIgnoreCase)) {
try {
return CultureInfo.CreateSpecificCulture(language).Name;
return new CultureSelectorResult { Priority = -4, CultureName = CultureInfo.CreateSpecificCulture(language).Name };
}
catch (ArgumentException) {
}
@@ -45,9 +38,5 @@ namespace Orchard.Localization.Providers {
return null;
}
public int Priority {
get { return -6; }
}
}
}

View File

@@ -1,21 +1,20 @@
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Orchard.Alias;
using Orchard.ContentManagement;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
using Orchard.UI.Admin;
namespace Orchard.Localization.Selectors {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class DefaultFrontEndCultureSelector : ICultureSelector {
public class ContentCultureSelector : ICultureSelector {
private readonly IAliasService _aliasService;
private readonly IContentManager _contentManager;
private readonly Lazy<ILocalizationService> _localizationService;
public DefaultFrontEndCultureSelector(IAliasService aliasService,
public ContentCultureSelector(
IAliasService aliasService,
IContentManager contentManager,
Lazy<ILocalizationService> localizationService) {
_aliasService = aliasService;
@@ -23,29 +22,12 @@ namespace Orchard.Localization.Selectors {
_localizationService = localizationService;
}
private bool IsActivable(HttpContextBase context) {
// activate on front end screen only
if (AdminFilter.IsApplied(new RequestContext(context, new RouteData())))
return false;
return true;
}
public CultureSelectorResult GetCulture(HttpContextBase context) {
if (!IsActivable(context))
if (ContextHelpers.IsRequestAdmin(context))
return null;
// Attempt to determine culture by route.
// This normally happens when you are using non standard pages that are not content items
// {culture}/foo
var routeCulture = context.Request.RequestContext.RouteData.Values["culture"] ??
context.Request.RequestContext.HttpContext.Request.Params["culture"];
if (routeCulture != null && !string.IsNullOrWhiteSpace(routeCulture.ToString())) {
return new CultureSelectorResult { Priority = -1, CultureName = routeCulture.ToString() };
}
// Attempt to determine culture by previous route if by POST
string path = string.Empty;
string path;
if (context.Request.HttpMethod.Equals(HttpVerbs.Post.ToString(), StringComparison.OrdinalIgnoreCase)) {
path = context.Request.UrlReferrer.AbsolutePath;
}
@@ -55,7 +37,7 @@ namespace Orchard.Localization.Selectors {
var content = GetByPath(path.TrimStart('/'));
if (content != null) {
return new CultureSelectorResult { Priority = -1, CultureName = _localizationService.Value.GetContentCulture(content) };
return new CultureSelectorResult { Priority = -2, CultureName = _localizationService.Value.GetContentCulture(content) };
}
return null;

View File

@@ -2,12 +2,14 @@ using System;
using System.Web;
using Orchard.Environment.Configuration;
using Orchard.Environment.Extensions;
using Orchard.Localization.Providers;
using Orchard.Localization.Services;
using Orchard.Mvc;
using Orchard.Services;
namespace Orchard.Localization.Providers {
namespace Orchard.Localization.Selectors {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class CookieCultureProvider : ICultureProvider, ICultureStorageProvider {
public class CookieCultureSelector : ICultureSelector, ICultureStorageProvider {
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IClock _clock;
private readonly ShellSettings _shellSettings;
@@ -15,7 +17,7 @@ namespace Orchard.Localization.Providers {
private const string CookieName = "OrchardCurrentCulture";
private const int DefaultExpireTimeYear = 1;
public CookieCultureProvider(IHttpContextAccessor httpContextAccessor,
public CookieCultureSelector(IHttpContextAccessor httpContextAccessor,
IClock clock,
ShellSettings shellSettings) {
_httpContextAccessor = httpContextAccessor;
@@ -45,23 +47,15 @@ namespace Orchard.Localization.Providers {
httpContext.Response.Cookies.Add(cookie);
}
public string GetCulture() {
var httpContext = _httpContextAccessor.Current();
if (httpContext == null) return null;
var cookie = httpContext.Request.Cookies.Get(CookieName);
public CultureSelectorResult GetCulture(HttpContextBase context) {
var cookie = context.Request.Cookies.Get(CookieName);
if (cookie != null)
return cookie.Value;
return new CultureSelectorResult { Priority = -1, CultureName = cookie.Value };
return null;
}
public int Priority {
get { return -5; }
}
private string GetCookiePath(HttpContextBase httpContext) {
var cookiePath = httpContext.Request.ApplicationPath;
if (cookiePath != null && cookiePath.Length > 1) {

View File

@@ -1,41 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using Orchard.Environment.Extensions;
using Orchard.Localization.Providers;
using Orchard.Localization.Services;
using Orchard.UI.Admin;
namespace Orchard.Localization.Selectors {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class DefaultAdminCultureSelector : ICultureSelector {
private readonly IEnumerable<ICultureProvider> _providers;
public DefaultAdminCultureSelector(IEnumerable<ICultureProvider> providers) {
_providers = providers;
}
private bool IsActivable(HttpContextBase context) {
// activate on admin screen only
if (AdminFilter.IsApplied(new RequestContext(context, new RouteData())))
return true;
return false;
}
public CultureSelectorResult GetCulture(HttpContextBase context) {
if (!IsActivable(context))
return null;
var cultureName = _providers
.OrderByDescending(x => x.Priority)
.Select(x => x.GetCulture())
.FirstOrDefault();
if (string.IsNullOrWhiteSpace(cultureName)) return null;
return new CultureSelectorResult { Priority = -4, CultureName = cultureName };
}
}
}

View File

@@ -0,0 +1,29 @@
using System.Globalization;
using System.Web;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
namespace Orchard.Localization.Selectors {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class RouteCultureSelector : ICultureSelector {
public CultureSelectorResult GetCulture(HttpContextBase context) {
if (ContextHelpers.IsRequestAdmin(context))
return null;
// Attempt to determine culture by route.
// This normally happens when you are using non standard pages that are not content items
// {culture}/foo or ?culture={culture}
var routeCulture = context.Request.RequestContext.RouteData.Values["culture"] ??
context.Request.RequestContext.HttpContext.Request.Params["culture"];
if (routeCulture != null && !string.IsNullOrWhiteSpace(routeCulture.ToString())) {
try {
var culture = CultureInfo.GetCultureInfo(routeCulture.ToString());
return new CultureSelectorResult {Priority = -4, CultureName = culture.Name};
}
catch {}
}
return null;
}
}
}