- An ICultureManager implementation for culture management.

- Setting default culture in setup.
- Tests for ICultureManager, culture name validation etc

--HG--
branch : dev
This commit is contained in:
Suha Can
2010-06-01 13:26:16 -07:00
parent e8e8158ff3
commit c15566fd9c
7 changed files with 142 additions and 0 deletions

View File

@@ -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<DefaultCultureManager>().As<ICultureManager>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
_session = _sessionFactory.OpenSession();
builder.RegisterInstance(new DefaultContentManagerTests.TestSessionLocator(_session)).As<ISessionLocator>();
_container = builder.Build();
_cultureManager = _container.Resolve<ICultureManager>();
}
[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<string> cultures = new List<string>(_cultureManager.ListCultures());
Assert.That(cultures.Count, Is.Not.EqualTo(0));
}
[Test]
public void CultureManagerRejectsInvalidCultureNames() {
Assert.Throws<ArgumentException>(() => _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));
}
}
}
}
}

View File

@@ -194,6 +194,7 @@
<Compile Include="Environment\OrchardStarterTests.cs" />
<Compile Include="Environment\ShellBuilders\DefaultShellContainerFactoryTests.cs" />
<Compile Include="Environment\ShellBuilders\DefaultShellContextFactoryTests.cs" />
<Compile Include="Localization\CultureManagerTests.cs" />
<Compile Include="Mvc\Routes\ShellRouteTests.cs" />
<Compile Include="Mvc\Routes\UrlPrefixTests.cs" />
<Compile Include="Stubs\StubCacheManager.cs" />

View File

@@ -130,6 +130,10 @@ namespace Orchard.Setup.Services {
var themeService = environment.Resolve<IThemeService>();
themeService.SetSiteTheme("Classic");
// set default culture
var cultureManager = environment.Resolve<ICultureManager>();
cultureManager.AddCulture("en-US");
var contentManager = environment.Resolve<IContentManager>();
// this needs to exit the standalone environment? rework this process entirely?

View File

@@ -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<CultureRecord> _cultureRepository;
public DefaultCultureManager(IRepository<CultureRecord> cultureRepository) {
_cultureRepository = cultureRepository;
}
public IEnumerable<string> 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 });
}
// "<languagecode2>" or
// "<languagecode2>-<country/regioncode2>" or
// "<languagecode2>-<scripttag>-<country/regioncode2>"
private static bool IsValidCulture(string cultureName) {
Regex cultureRegex = new Regex(@"\w{2}(-\w{2,})*");
if (cultureRegex.IsMatch(cultureName)) {
return true;
}
return false;
}
}
}

View File

@@ -0,0 +1,8 @@
using System.Collections.Generic;
namespace Orchard.Localization {
public interface ICultureManager : IDependency {
IEnumerable<string> ListCultures();
void AddCulture(string cultureName);
}
}

View File

@@ -0,0 +1,6 @@
namespace Orchard.Localization.Records {
public class CultureRecord {
public virtual int Id { get; set; }
public virtual string Culture { get; set; }
}
}

View File

@@ -143,6 +143,9 @@
<Compile Include="Environment\State\IShellStateManager.cs" />
<Compile Include="Environment\State\ShellStateCoordinator.cs" />
<Compile Include="IDependency.cs" />
<Compile Include="Localization\DefaultCultureManager.cs" />
<Compile Include="Localization\ICultureManager.cs" />
<Compile Include="Localization\Records\CultureRecord.cs" />
<Compile Include="Mvc\Html\ThemeExtensions.cs" />
<Compile Include="Mvc\Routes\IRoutePublisher.cs" />
<Compile Include="Mvc\Routes\IRouteProvider.cs" />