diff --git a/src/Orchard.Tests/Localization/CultureManagerTests.cs b/src/Orchard.Tests/Localization/CultureManagerTests.cs index ef46905d4..ac4208767 100644 --- a/src/Orchard.Tests/Localization/CultureManagerTests.cs +++ b/src/Orchard.Tests/Localization/CultureManagerTests.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Web; +using System.Web.Routing; using Autofac; using NHibernate; using NUnit.Framework; @@ -30,6 +32,7 @@ namespace Orchard.Tests.Localization { [SetUp] public void Init() { var builder = new ContainerBuilder(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); _session = _sessionFactory.OpenSession(); @@ -76,6 +79,17 @@ namespace Orchard.Tests.Localization { } } } + + [Test] + public void CultureManagerReturnsCultureFromSelector() { + Assert.That(_cultureManager.GetCurrentCulture(null), Is.EqualTo("en-US")); + } + } + + public class TestCultureSelector : ICultureSelector { + public CultureSelectorResult GetCulture(RequestContext context) { + return new CultureSelectorResult { Priority = 1, CultureName = "en-US" }; + } } } diff --git a/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs b/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs index 28df8bd51..44a705c5e 100644 --- a/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs +++ b/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs @@ -16,7 +16,7 @@ namespace Orchard.Core.Settings.Models { public string SiteSalt { get { return Record.SiteSalt; } } - public string SuperUser { + public string SuperUser { get { return Record.SuperUser; } set { Record.SuperUser = value; } } @@ -24,5 +24,9 @@ namespace Orchard.Core.Settings.Models { get { return Record.HomePage; } set { Record.HomePage = value; } } + public string SiteCulture { + get { return Record.SiteCulture; } + set { Record.SiteCulture = value; } + } } } diff --git a/src/Orchard.Web/Core/Settings/Models/SiteSettingsRecord.cs b/src/Orchard.Web/Core/Settings/Models/SiteSettingsRecord.cs index 5f2fef34c..f79fa6489 100644 --- a/src/Orchard.Web/Core/Settings/Models/SiteSettingsRecord.cs +++ b/src/Orchard.Web/Core/Settings/Models/SiteSettingsRecord.cs @@ -7,5 +7,6 @@ namespace Orchard.Core.Settings.Models { public virtual string SuperUser { get; set; } public virtual string PageTitleSeparator { get; set; } public virtual string HomePage { get; set; } + public virtual string SiteCulture { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs index e918d7f97..72837f422 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs @@ -125,12 +125,13 @@ namespace Orchard.Setup.Services { siteSettings.Record.SiteName = context.SiteName; siteSettings.Record.SuperUser = context.AdminUsername; siteSettings.Record.PageTitleSeparator = " - "; + siteSettings.Record.SiteCulture = "en-US"; // set site theme var themeService = environment.Resolve(); themeService.SetSiteTheme("Classic"); - // set default culture + // add default culture var cultureManager = environment.Resolve(); cultureManager.AddCulture("en-US"); diff --git a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs index 42bafdd02..ab66f8d0d 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs @@ -123,6 +123,11 @@ namespace Orchard.Setup { get { return ""; } set { throw new NotImplementedException(); } } + + public string SiteCulture { + get { return ""; } + set { throw new NotImplementedException(); } + } } } } diff --git a/src/Orchard/Localization/DefaultCultureManager.cs b/src/Orchard/Localization/DefaultCultureManager.cs index 722329ade..a2b8e409a 100644 --- a/src/Orchard/Localization/DefaultCultureManager.cs +++ b/src/Orchard/Localization/DefaultCultureManager.cs @@ -2,15 +2,18 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using System.Web.Routing; using Orchard.Data; using Orchard.Localization.Records; namespace Orchard.Localization { public class DefaultCultureManager : ICultureManager { private readonly IRepository _cultureRepository; + private readonly IEnumerable _cultureSelectors; - public DefaultCultureManager(IRepository cultureRepository) { + public DefaultCultureManager(IRepository cultureRepository, IEnumerable cultureSelectors) { _cultureRepository = cultureRepository; + _cultureSelectors = cultureSelectors; } public IEnumerable ListCultures() { @@ -25,6 +28,24 @@ namespace Orchard.Localization { _cultureRepository.Create(new CultureRecord { Culture = cultureName }); } + public string GetCurrentCulture(RequestContext requestContext) { + var requestCulture = _cultureSelectors + .Select(x => x.GetCulture(requestContext)) + .Where(x => x != null) + .OrderByDescending(x => x.Priority); + + if (requestCulture.Count() < 1) + return String.Empty; + + foreach (var culture in requestCulture) { + if (!String.IsNullOrEmpty(culture.CultureName)) { + return culture.CultureName; + } + } + + return String.Empty; + } + // "" or // "-" or // "--" diff --git a/src/Orchard/Localization/ICultureManager.cs b/src/Orchard/Localization/ICultureManager.cs index 4b4e7ac18..f0f3c4fb5 100644 --- a/src/Orchard/Localization/ICultureManager.cs +++ b/src/Orchard/Localization/ICultureManager.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; +using System.Web.Routing; namespace Orchard.Localization { public interface ICultureManager : IDependency { IEnumerable ListCultures(); void AddCulture(string cultureName); + string GetCurrentCulture(RequestContext requestContext); } } diff --git a/src/Orchard/Localization/ICultureSelector.cs b/src/Orchard/Localization/ICultureSelector.cs new file mode 100644 index 000000000..e35b3c20c --- /dev/null +++ b/src/Orchard/Localization/ICultureSelector.cs @@ -0,0 +1,12 @@ +using System.Web.Routing; + +namespace Orchard.Localization { + public class CultureSelectorResult { + public int Priority { get; set; } + public string CultureName { get; set; } + } + + public interface ICultureSelector : IDependency { + CultureSelectorResult GetCulture(RequestContext context); + } +} diff --git a/src/Orchard/Localization/SiteCultureSelector.cs b/src/Orchard/Localization/SiteCultureSelector.cs new file mode 100644 index 000000000..a836b0181 --- /dev/null +++ b/src/Orchard/Localization/SiteCultureSelector.cs @@ -0,0 +1,23 @@ +using System; +using System.Web.Routing; +using JetBrains.Annotations; +using Orchard.Settings; + +namespace Orchard.Localization { + public class SiteCultureSelector : ICultureSelector { + protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; } + + public CultureSelectorResult GetCulture(RequestContext context) { + string currentCultureName = CurrentSite.SiteCulture; + + if (String.IsNullOrEmpty(currentCultureName)) { + return null; + } + + return new CultureSelectorResult { Priority = -5, CultureName = currentCultureName }; + } + } + + public class CultureSettings { + } +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 64114adb8..f5bf61389 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -145,7 +145,9 @@ + + diff --git a/src/Orchard/Settings/ISite.cs b/src/Orchard/Settings/ISite.cs index ef6432fc6..6ca061104 100644 --- a/src/Orchard/Settings/ISite.cs +++ b/src/Orchard/Settings/ISite.cs @@ -10,5 +10,6 @@ namespace Orchard.Settings { string SiteSalt { get; } string SuperUser { get; } string HomePage { get; set; } + string SiteCulture { get; set; } } }