mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Moving away from the providers and pushin all to Selectors, makes for a cleaner iplementation
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -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" />
|
||||
|
@@ -1,6 +0,0 @@
|
||||
namespace Orchard.Localization.Providers {
|
||||
public interface ICultureProvider : IDependency {
|
||||
string GetCulture();
|
||||
int Priority { get; }
|
||||
}
|
||||
}
|
@@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
@@ -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) {
|
@@ -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 };
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user