Splitting culture picker up to Admin and User facing implementations. Removing the Culture Service, and changign the way the culture selectors work. The Admin UI should act differently to the Front end site, and hense should be indepentant of each other.

This commit is contained in:
Nicholas Mayne
2014-09-14 13:56:06 +01:00
parent 5750d978a3
commit 6b14e748ff
19 changed files with 240 additions and 148 deletions
@@ -0,0 +1,23 @@
using System.Web.Mvc;
using Orchard.Environment.Extensions;
using Orchard.Localization.Providers;
using Orchard.Mvc.Extensions;
using Orchard.UI.Admin;
namespace Orchard.Localization.Controllers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
[Admin]
public class AdminCutlureSelectorController : Controller {
private readonly ICultureStorageProvider _cultureStorageProvider;
public AdminCutlureSelectorController(ICultureStorageProvider cultureStorageProvider) {
_cultureStorageProvider = cultureStorageProvider;
}
public ActionResult ChangeCulture(string culture, string returnUrl) {
_cultureStorageProvider.SetCulture(culture);
return this.RedirectLocal(returnUrl);
}
}
}
@@ -1,22 +0,0 @@
using System.Web.Mvc;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
using Orchard.Mvc.Extensions;
namespace Orchard.Localization.Controllers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class CutlureSelectorController : Controller {
private readonly ICultureService _cultureService;
public CutlureSelectorController(ICultureService cultureService) {
_cultureService = cultureService;
}
public ActionResult SetCulture(string culture, string returnUrl) {
_cultureService.SetCulture(culture);
return this.RedirectLocal(returnUrl);
}
}
}
@@ -17,10 +17,10 @@ Features:
Name: Date/Time Format Localization
Dependencies: Orchard.Localization
Orchard.Localization.CutlureSelector:
Description: Enables a culture picker to localize the UI.
Description: Enables a culture picker services, and also the admin cutlure picker.
Category: Content
Name: Culture Picker
Dependencies: Orchard.Localization
Dependencies: Orchard.Localization, Orchard.Alias
Orchard.Localization.Transliteration:
Description: Enabled transliteration of content
Category: Content
@@ -72,16 +72,17 @@
<Compile Include="Extensions\Constants.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Controllers\TransliterationAdminController.cs" />
<Compile Include="Controllers\CutlureSelectorController.cs" />
<Compile Include="Controllers\AdminCutlureSelectorController.cs" />
<Compile Include="Models\TransliterationSpecificationRecord.cs" />
<Compile Include="Providers\CultureSelectorSelector.cs" />
<Compile Include="Providers\AdminCultureSelectorSelector.cs" />
<Compile Include="Providers\BrowserCultureProvider.cs" />
<Compile Include="Providers\DefaultFrontEndCultureSelector.cs" />
<Compile Include="Providers\ICultureStorageProvider.cs" />
<Compile Include="RuleEngine\CultureRuleProvider.cs" />
<Compile Include="Services\AdminDirectionalityFactory.cs" />
<Compile Include="Services\CultureSelectorFactory.cs" />
<Compile Include="Services\CultureService.cs" />
<Compile Include="Services\LocalizationCultureFilter.cs" />
<Compile Include="Providers\CultureStorageProvider.cs" />
<Compile Include="Services\ICultureService.cs" />
<Compile Include="Providers\CookieCultureProvider.cs" />
<Compile Include="Drivers\LocalizationPartDriver.cs" />
<Compile Include="Handlers\LocalizationPartHandler.cs" />
<Compile Include="Migrations.cs" />
@@ -91,7 +92,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResourceManifest.cs" />
<Compile Include="Routes.cs" />
<Compile Include="Providers\ICultureStorageProvider.cs" />
<Compile Include="Providers\ICultureProvider.cs" />
<Compile Include="Services\ILocalizationService.cs" />
<Compile Include="Services\ITransliterationService.cs" />
<Compile Include="Providers\LocalizationDateTimeFormatProvider.cs" />
@@ -140,6 +141,10 @@
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
<Name>Orchard.Core</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Alias\Orchard.Alias.csproj">
<Project>{475B6C45-B27C-438B-8966-908B9D6D1077}</Project>
<Name>Orchard.Alias</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Autoroute\Orchard.Autoroute.csproj">
<Project>{66FCCD76-2761-47E3-8D11-B45D0001DDAA}</Project>
<Name>Orchard.Autoroute</Name>
@@ -149,7 +154,7 @@
<Content Include="web.config" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\UICultureSelector.cshtml" />
<Content Include="Views\AdminUICultureSelector.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\TransliterationAdmin\Index.cshtml" />
@@ -160,6 +165,9 @@
<ItemGroup>
<Content Include="Views\TransliterationAdmin\Edit.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\FrontEndUICultureSelector.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
@@ -0,0 +1,40 @@
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
using Orchard.UI.Admin;
namespace Orchard.Localization.Providers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class AdminCultureSelectorSelector : ICultureSelector {
private readonly IEnumerable<ICultureProvider> _providers;
public AdminCultureSelectorSelector(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,53 @@
using System;
using System.Globalization;
using System.Linq;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
using Orchard.Mvc;
namespace Orchard.Localization.Providers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class BrowserCultureProvider : ICultureProvider {
private readonly Lazy<ICultureManager> _cultureManager;
private readonly IHttpContextAccessor _httpContextAccessor;
public BrowserCultureProvider(
Lazy<ICultureManager> cultureManager,
IHttpContextAccessor httpContextAccessor) {
_cultureManager = cultureManager;
_httpContextAccessor = httpContextAccessor;
}
public string GetCulture() {
var httpContext = _httpContextAccessor.Current();
if (httpContext == null) return null;
/* Fall back to Browser */
var userLanguages = httpContext.Request.UserLanguages;
if (userLanguages == null || userLanguages.Length == 0)
return null;
var cultures = _cultureManager.Value.ListCultures().ToList();
foreach (var userLanguage in userLanguages) {
var language = userLanguage.Split(';')[0].Trim();
if (cultures.Contains(language, StringComparer.OrdinalIgnoreCase)) {
try {
return CultureInfo.CreateSpecificCulture(language).Name;
}
catch (ArgumentException) {
}
}
}
return null;
}
public int Priority {
get { return -6; }
}
}
}
@@ -2,13 +2,12 @@ using System;
using System.Web;
using Orchard.Environment.Configuration;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
using Orchard.Mvc;
using Orchard.Services;
namespace Orchard.Localization.Providers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class CultureStorageProvider : ICultureStorageProvider {
public class CookieCultureProvider : ICultureProvider, ICultureStorageProvider {
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IClock _clock;
private readonly ShellSettings _shellSettings;
@@ -16,7 +15,7 @@ namespace Orchard.Localization.Providers {
private const string CookieName = "OrchardCurrentCulture";
private const int DefaultExpireTimeYear = 1;
public CultureStorageProvider(IHttpContextAccessor httpContextAccessor,
public CookieCultureProvider(IHttpContextAccessor httpContextAccessor,
IClock clock,
ShellSettings shellSettings) {
_httpContextAccessor = httpContextAccessor;
@@ -59,6 +58,10 @@ namespace Orchard.Localization.Providers {
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,21 +0,0 @@
using System.Web;
using Orchard.Environment.Extensions;
using Orchard.Localization.Services;
namespace Orchard.Localization.Providers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class CultureSelectorSelector : ICultureSelector {
private readonly ICultureService _cultureService;
public CultureSelectorSelector(ICultureService cultureService) {
_cultureService = cultureService;
}
public CultureSelectorResult GetCulture(HttpContextBase context) {
var cultureName = _cultureService.GetCulture();
if (cultureName == null) return null;
return new CultureSelectorResult { Priority = -4, CultureName = cultureName };
}
}
}
@@ -0,0 +1,62 @@
using System;
using System.Web;
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.Providers {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class DefaultFrontEndCultureSelector : ICultureSelector {
private readonly IAliasService _aliasService;
private readonly IContentManager _contentManager;
private readonly Lazy<ILocalizationService> _localizationService;
public DefaultFrontEndCultureSelector(IAliasService aliasService,
IContentManager contentManager,
Lazy<ILocalizationService> localizationService) {
_aliasService = aliasService;
_contentManager = contentManager;
_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))
return null;
var content = GetByPath(context.Request.Path.TrimStart('/'));
if (content != null) {
return new CultureSelectorResult {Priority = -1, CultureName = _localizationService.Value.GetContentCulture(content)};
}
return null;
}
public IContent GetByPath(string aliasPath) {
var contentRouting = _aliasService.Get(aliasPath);
if (contentRouting == null)
return null;
object id;
if (contentRouting.TryGetValue("id", out id)) {
int contentId;
if (int.TryParse(id as string, out contentId)) {
return _contentManager.Get(contentId);
}
}
return null;
}
}
}
@@ -0,0 +1,6 @@
namespace Orchard.Localization.Providers {
public interface ICultureProvider : IDependency {
string GetCulture();
int Priority { get; }
}
}
@@ -1,6 +1,5 @@
namespace Orchard.Localization.Providers {
public interface ICultureStorageProvider : IDependency {
void SetCulture(string culture);
string GetCulture();
}
}
@@ -1,3 +1,4 @@
using System.Linq;
using System.Web.Routing;
using Orchard.DisplayManagement;
using Orchard.DisplayManagement.Implementation;
@@ -7,11 +8,14 @@ using Orchard.UI.Admin;
namespace Orchard.Localization.Services {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class AdminCultureSelectorFactory : ShapeDisplayEvents {
private readonly ICultureManager _cultureManager;
private readonly WorkContext _workContext;
public AdminCultureSelectorFactory(
IWorkContextAccessor workContextAccessor,
IShapeFactory shapeFactory) {
IShapeFactory shapeFactory,
ICultureManager cultureManager) {
_cultureManager = cultureManager;
_workContext = workContextAccessor.GetContext();
Shape = shapeFactory;
}
@@ -29,7 +33,10 @@ namespace Orchard.Localization.Services {
public override void Displaying(ShapeDisplayingContext context) {
context.ShapeMetadata.OnDisplaying(displayedContext => {
if (displayedContext.ShapeMetadata.Type == "Layout" && IsActivable()) {
_workContext.Layout.Header.Add(Shape.UICultureSelector());
var supportedCultures = _cultureManager.ListCultures().ToList();
if (supportedCultures.Count() > 1) {
_workContext.Layout.Header.Add(Shape.AdminUICultureSelector(SupportedCultures: supportedCultures));
}
}
});
}
@@ -1,74 +0,0 @@
using System;
using System.Globalization;
using System.Linq;
using Orchard.Data;
using Orchard.Environment.Extensions;
using Orchard.Localization.Providers;
using Orchard.Localization.Records;
using Orchard.Mvc;
namespace Orchard.Localization.Services {
[OrchardFeature("Orchard.Localization.CutlureSelector")]
public class CultureService : ICultureService {
private readonly ICultureStorageProvider _cultureStorageProvider;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IRepository<CultureRecord> _cultureRepository;
public CultureService(ICultureStorageProvider cultureStorageProvider,
IHttpContextAccessor httpContextAccessor,
IRepository<CultureRecord> cultureRepository) {
_cultureStorageProvider = cultureStorageProvider;
_httpContextAccessor = httpContextAccessor;
_cultureRepository = cultureRepository;
}
public void SetCulture(string culture) {
_cultureStorageProvider.SetCulture(culture);
}
public string GetCulture() {
var culture = _cultureStorageProvider.GetCulture();
if (culture == null) {
var httpContext = _httpContextAccessor.Current();
if (httpContext == null) return null;
var browserCulture = GetBrowserCulture();
if (browserCulture == null)
return null;
culture = browserCulture.Name;
}
return culture;
}
private CultureInfo GetBrowserCulture() {
var httpContext = _httpContextAccessor.Current();
/* Fall back to Browser */
var userLanguages = httpContext.Request.UserLanguages;
if (userLanguages == null || userLanguages.Length == 0)
return null;
var cultures = (from culture in _cultureRepository.Table select culture.Culture).ToList();
foreach (var userLanguage in userLanguages) {
var language = userLanguage.Split(';')[0].Trim();
if (cultures.Contains(language, StringComparer.OrdinalIgnoreCase)) {
try {
return CultureInfo.CreateSpecificCulture(language);
}
catch (ArgumentException) {
}
}
}
return null;
}
}
}
@@ -1,6 +0,0 @@
namespace Orchard.Localization.Services {
public interface ICultureService : IDependency {
void SetCulture(string culture);
string GetCulture();
}
}
@@ -0,0 +1,20 @@
@{
var currentCulture = WorkContext.CurrentCulture;
var supportedCultures = (IList<string>)Model.SupportedCultures;
}
<div id="culture-selection">
<ul>
@foreach (var supportedCulure in supportedCultures) {
var url = Url.Action("ChangeCulture", "AdminCutlureSelector", new { area = "Orchard.Localization", culture = supportedCulure, returnUrl = Html.ViewContext.HttpContext.Request.RawUrl });
<li>
@if (supportedCulure.Equals(currentCulture)) {
<a href="@url">@T("{0} (current)", supportedCulure)</a>
} else {
<a href="@url">@supportedCulure</a>
}
</li>
}
</ul>
</div>
@@ -7,7 +7,7 @@
<div id="culture-selection">
<ul>
@foreach (var supportedCulure in supportedCultures) {
var url = Url.Action("SetCulture", "CutlureSelector", new { area = "Orchard.Localization", culture = supportedCulure, returnUrl = Html.ViewContext.HttpContext.Request.RawUrl });
var url = Url.Action("ChangeCulture", "CutlureSelector", new { area = "Orchard.Localization", id = Model.ContentItem.Id, culture = supportedCulure, returnUrl = Html.ViewContext.HttpContext.Request.RawUrl });
<li>
@if (supportedCulure.Equals(currentCulture)) {
@@ -1,16 +1,14 @@
@using System.Globalization
@using Orchard.Localization.Services
@{
var currentCulture = WorkContext.CurrentCulture;
var supportedCultures = WorkContext.Resolve<ICultureManager>().ListCultures();
var supportedCultures = (IList<string>)Model.SupportedCultures;
}
@if (supportedCultures.Count() > 1) {
<div id="culture-selection">
<select>
@foreach (var supportedCulure in supportedCultures) {
var cultureInfo = CultureInfo.GetCultureInfo(supportedCulure);
var url = Url.Action("SetCulture", "CutlureSelector", new { area = "Orchard.Localization", culture = supportedCulure, returnUrl = Html.ViewContext.HttpContext.Request.RawUrl });
var url = Url.Action("ChangeCulture", "AdminCutlureSelector", new { area = "Orchard.Localization", culture = supportedCulure, returnUrl = Html.ViewContext.HttpContext.Request.RawUrl });
<option @if (supportedCulure.Equals(currentCulture)) { <text> selected="selected" </text> } value="@url">
@cultureInfo.DisplayName&#x200E;
@@ -18,7 +16,6 @@
}
</select>
</div>
}
@using (Script.Foot()) {
<script type="text/javascript">
//<![CDATA[
+1 -1
View File
@@ -170,7 +170,7 @@
<Content Include="TheAdmin\Views\ErrorPage.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="TheAdmin\Views\UICultureSelector.cshtml" />
<Content Include="TheAdmin\Views\AdminUICultureSelector.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
@@ -19,7 +19,4 @@ namespace Orchard.Localization.Services {
return new CultureSelectorResult { Priority = -5, CultureName = currentCultureName };
}
}
public class CultureSettings {
}
}