diff --git a/src/Orchard.Tests/Localization/CultureManagerTests.cs b/src/Orchard.Tests/Localization/CultureManagerTests.cs new file mode 100644 index 000000000..ef46905d4 --- /dev/null +++ b/src/Orchard.Tests/Localization/CultureManagerTests.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Autofac; +using NHibernate; +using NUnit.Framework; +using Orchard.Data; +using Orchard.Localization; +using Orchard.Localization.Records; +using Orchard.Tests.ContentManagement; + +namespace Orchard.Tests.Localization { + [TestFixture] + public class CultureManagerTests { + private IContainer _container; + private ICultureManager _cultureManager; + private ISessionFactory _sessionFactory; + private ISession _session; + private string _databaseFileName; + + [TestFixtureSetUp] + public void InitFixture() { + _databaseFileName = System.IO.Path.GetTempFileName(); + _sessionFactory = DataUtility.CreateSessionFactory( + _databaseFileName, + typeof(CultureRecord)); + } + + [SetUp] + public void Init() { + var builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); + _session = _sessionFactory.OpenSession(); + builder.RegisterInstance(new DefaultContentManagerTests.TestSessionLocator(_session)).As(); + _container = builder.Build(); + _cultureManager = _container.Resolve(); + } + + [TearDown] + public void Term() { + _session.Close(); + } + + [TestFixtureTearDown] + public void TermFixture() { + File.Delete(_databaseFileName); + } + + [Test] + public void CultureManagerCanAddAndListValidCultures() { + _cultureManager.AddCulture("tr-TR"); + _cultureManager.AddCulture("fr-FR"); + _cultureManager.AddCulture("bs-Latn-BA"); + List cultures = new List(_cultureManager.ListCultures()); + Assert.That(cultures.Count, Is.Not.EqualTo(0)); + } + + [Test] + public void CultureManagerRejectsInvalidCultureNames() { + Assert.Throws(() => _cultureManager.AddCulture("a-b-c")); + } + + [Test] + public void CultureManagerAcceptsValidDotNetCultureNames() { + foreach (var cultureInfo in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) { + if (!String.IsNullOrEmpty(cultureInfo.Name)) { + Assert.DoesNotThrow(() => _cultureManager.AddCulture(cultureInfo.Name)); + } + } + + foreach (var cultureInfo in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) { + if (!String.IsNullOrEmpty(cultureInfo.Name)) { + Assert.DoesNotThrow(() => _cultureManager.AddCulture(cultureInfo.Name)); + } + } + } + } +} + diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index cb1d41974..258137642 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -194,6 +194,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs index 5495ae7a8..e918d7f97 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs @@ -130,6 +130,10 @@ namespace Orchard.Setup.Services { var themeService = environment.Resolve(); themeService.SetSiteTheme("Classic"); + // set default culture + var cultureManager = environment.Resolve(); + cultureManager.AddCulture("en-US"); + var contentManager = environment.Resolve(); // this needs to exit the standalone environment? rework this process entirely? diff --git a/src/Orchard/Localization/DefaultCultureManager.cs b/src/Orchard/Localization/DefaultCultureManager.cs new file mode 100644 index 000000000..722329ade --- /dev/null +++ b/src/Orchard/Localization/DefaultCultureManager.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using Orchard.Data; +using Orchard.Localization.Records; + +namespace Orchard.Localization { + public class DefaultCultureManager : ICultureManager { + private readonly IRepository _cultureRepository; + + public DefaultCultureManager(IRepository cultureRepository) { + _cultureRepository = cultureRepository; + } + + public IEnumerable ListCultures() { + var query = from culture in _cultureRepository.Table select culture.Culture; + return query.ToList(); + } + + public void AddCulture(string cultureName) { + if (!IsValidCulture(cultureName)) { + throw new ArgumentException("cultureName"); + } + _cultureRepository.Create(new CultureRecord { Culture = cultureName }); + } + + // "" or + // "-" or + // "--" + private static bool IsValidCulture(string cultureName) { + Regex cultureRegex = new Regex(@"\w{2}(-\w{2,})*"); + if (cultureRegex.IsMatch(cultureName)) { + return true; + } + return false; + } + } +} diff --git a/src/Orchard/Localization/ICultureManager.cs b/src/Orchard/Localization/ICultureManager.cs new file mode 100644 index 000000000..4b4e7ac18 --- /dev/null +++ b/src/Orchard/Localization/ICultureManager.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Orchard.Localization { + public interface ICultureManager : IDependency { + IEnumerable ListCultures(); + void AddCulture(string cultureName); + } +} diff --git a/src/Orchard/Localization/Records/CultureRecord.cs b/src/Orchard/Localization/Records/CultureRecord.cs new file mode 100644 index 000000000..ac164aa14 --- /dev/null +++ b/src/Orchard/Localization/Records/CultureRecord.cs @@ -0,0 +1,6 @@ +namespace Orchard.Localization.Records { + public class CultureRecord { + public virtual int Id { get; set; } + public virtual string Culture { get; set; } + } +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index fed37f65b..64114adb8 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -143,6 +143,9 @@ + + +