mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
- 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:
81
src/Orchard.Tests/Localization/CultureManagerTests.cs
Normal file
81
src/Orchard.Tests/Localization/CultureManagerTests.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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" />
|
||||
|
@@ -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?
|
||||
|
39
src/Orchard/Localization/DefaultCultureManager.cs
Normal file
39
src/Orchard/Localization/DefaultCultureManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
8
src/Orchard/Localization/ICultureManager.cs
Normal file
8
src/Orchard/Localization/ICultureManager.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.Localization {
|
||||
public interface ICultureManager : IDependency {
|
||||
IEnumerable<string> ListCultures();
|
||||
void AddCulture(string cultureName);
|
||||
}
|
||||
}
|
6
src/Orchard/Localization/Records/CultureRecord.cs
Normal file
6
src/Orchard/Localization/Records/CultureRecord.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Orchard.Localization.Records {
|
||||
public class CultureRecord {
|
||||
public virtual int Id { get; set; }
|
||||
public virtual string Culture { get; set; }
|
||||
}
|
||||
}
|
@@ -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" />
|
||||
|
Reference in New Issue
Block a user