diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Controllers/TransliterationAdminController.cs b/src/Orchard.Web/Modules/Orchard.Localization/Controllers/TransliterationAdminController.cs index ead94ea75..2611885d7 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Controllers/TransliterationAdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Controllers/TransliterationAdminController.cs @@ -7,7 +7,7 @@ using Orchard.UI.Admin; namespace Orchard.Localization.Controllers { [OrchardFeature("Orchard.Localization.Transliteration")] - [Admin] + [Admin, ValidateInput(false)] public class TransliterationAdminController : Controller { private readonly ITransliterationService _transliterationService; @@ -36,5 +36,48 @@ namespace Orchard.Localization.Controllers { return View(viewModel); } + + [HttpPost, ActionName("Create")] + public ActionResult CreatePost(CreateTransliterationViewModel viewModel) { + + if (!ModelState.IsValid) { + return View(viewModel); + } + + _transliterationService.Create(viewModel.CultureFrom, viewModel.CultureTo, viewModel.Rules); + + return RedirectToAction("Index"); + } + + public ActionResult Edit(int id) { + var record = _transliterationService.Get(id); + + var viewModel = new EditTransliterationViewModel { + Id = record.Id, + CultureFrom = record.CultureFrom, + CultureTo = record.CultureTo, + Rules = record.Rules + }; + + return View(viewModel); + } + + [HttpPost, ActionName("Edit")] + public ActionResult EditPost(EditTransliterationViewModel viewModel) { + + if (!ModelState.IsValid) { + return View(viewModel); + } + + _transliterationService.Update(viewModel.Id, viewModel.CultureFrom, viewModel.CultureTo, viewModel.Rules); + + return RedirectToAction("Index"); + } + + public ActionResult Remove(int id) { + _transliterationService.Remove(id); + + return RedirectToAction("Index"); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj index 497497658..5659bd159 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj +++ b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj @@ -94,10 +94,12 @@ + + @@ -139,6 +141,10 @@ {9916839C-39FC-4CEB-A5AF-89CA7E87119F} Orchard.Core + + {66FCCD76-2761-47E3-8D11-B45D0001DDAA} + Orchard.Autoroute + @@ -152,6 +158,9 @@ + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Services/ITransliterationService.cs b/src/Orchard.Web/Modules/Orchard.Localization/Services/ITransliterationService.cs index 90263b9e4..c0dfeaa5c 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Services/ITransliterationService.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Services/ITransliterationService.cs @@ -3,7 +3,11 @@ using Orchard.Localization.Models; namespace Orchard.Localization.Services { public interface ITransliterationService : IDependency { - string Convert(string value, int transliterationSpecificationId); + string Convert(string value, string cultureFrom); IEnumerable GetSpecifications(); + void Create(string cultureFrom, string cultureTo, string rules); + void Update(int id, string cultureFrom, string cultureTo, string rules); + void Remove(int id); + TransliterationSpecificationRecord Get(int id); } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationService.cs b/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationService.cs index d77dc407b..6b8d664f0 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationService.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationService.cs @@ -17,8 +17,8 @@ namespace Orchard.Localization.Services { _transliterationRepository = transliterationRepository; } - public string Convert(string value, int transliterationSpecificationId) { - var transliterationSpecification = _transliterationRepository.Get(transliterationSpecificationId); + public string Convert(string value, string cultureFrom) { + var transliterationSpecification = _transliterationRepository.Get(x => x.CultureFrom == cultureFrom); if (transliterationSpecification == null) return value; var specification = GetSpecification(transliterationSpecification); @@ -38,6 +38,30 @@ namespace Orchard.Localization.Services { return _transliterationRepository.Table.ToList(); } + public void Create(string cultureFrom, string cultureTo, string rules) { + _transliterationRepository.Create(new TransliterationSpecificationRecord { + CultureFrom = cultureFrom, + CultureTo = cultureTo, + Rules = rules + }); + } + + public void Update(int id, string cultureFrom, string cultureTo, string rules) { + var record = _transliterationRepository.Get(id); + record.CultureFrom = cultureFrom; + record.CultureTo = cultureTo; + record.Rules = rules; + _transliterationRepository.Update(record); + } + + public void Remove(int id) { + _transliterationRepository.Delete(_transliterationRepository.Get(id)); + } + + public TransliterationSpecificationRecord Get(int id) { + return _transliterationRepository.Get(id); + } + private TransliteratorSpecification GetSpecification(TransliterationSpecificationRecord record) { using (TextReader specificationReader = new StringReader(record.Rules)) { return TransliteratorSpecification.FromSpecificationFile(specificationReader, fOnlyMetadata); diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationSlugEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationSlugEventHandler.cs new file mode 100644 index 000000000..b4b1ff87d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Localization/Services/TransliterationSlugEventHandler.cs @@ -0,0 +1,26 @@ +using Orchard.Autoroute.Services; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.Environment.Extensions; + +namespace Orchard.Localization.Services { + [OrchardFeature("Orchard.Localization.Transliteration")] + public class TransliterationSlugEventHandler : ISlugEventHandler { + private readonly ITransliterationService _transliterationService; + + public TransliterationSlugEventHandler(ITransliterationService transliterationService) { + _transliterationService = transliterationService; + } + + public void FillingSlugFromTitle(FillSlugContext context) { + var localizationAspect = context.Content.As(); + if (localizationAspect == null) return; + + context.Title = _transliterationService.Convert(context.Title, localizationAspect.Culture); + context.Adjusted = true; + } + + public void FilledSlugFromTitle(FillSlugContext context) { + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditTransliterationViewModel.cs b/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditTransliterationViewModel.cs new file mode 100644 index 000000000..3a1a770bd --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditTransliterationViewModel.cs @@ -0,0 +1,8 @@ +namespace Orchard.Localization.ViewModels { + public class EditTransliterationViewModel { + public int Id { get; set; } + public string CultureFrom { get; set; } + public string CultureTo { get; set; } + public string Rules { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Create.cshtml b/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Create.cshtml index eb56f3d1f..0f0dcf13e 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Create.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Create.cshtml @@ -21,7 +21,7 @@ @Html.DropDownList("CultureTo", new SelectList(cultures, "Name", "DisplayName", Model.CultureTo)) - + diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Edit.cshtml new file mode 100644 index 000000000..ac8e16814 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Edit.cshtml @@ -0,0 +1,24 @@ +@using System.Globalization +@model Orchard.Localization.ViewModels.EditTransliterationViewModel + +@{ + Layout.Title = T("Edit Transliteration").Text; + + var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); +} + +@using(Html.BeginFormAntiForgeryPost()) { + @Html.ValidationSummary() +
+ + @Html.DropDownList("CultureFrom", new SelectList(cultures, "Name", "DisplayName", Model.CultureFrom)) + + @Html.DropDownList("CultureTo", new SelectList(cultures, "Name", "DisplayName", Model.CultureTo)) + + + + @Html.HiddenFor(x => x.Id) +
+ + +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Index.cshtml index 025a30a94..a1159db61 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Localization/Views/TransliterationAdmin/Index.cshtml @@ -10,7 +10,7 @@ @Html.ValidationSummary() if (currentSpecifications.Any()) { - + @@ -21,21 +21,21 @@ @foreach (var currentSpecification in currentSpecifications) { - CultureInfo cultureInfoFrom = CultureInfo.GetCultureInfo(currentSpecification.CultureFrom); - CultureInfo cultureInfoTo = CultureInfo.GetCultureInfo(currentSpecification.CultureTo); + CultureInfo cultureInfoFrom = string.IsNullOrWhiteSpace(currentSpecification.CultureFrom) ? CultureInfo.InvariantCulture : CultureInfo.GetCultureInfo(currentSpecification.CultureFrom); + CultureInfo cultureInfoTo = string.IsNullOrWhiteSpace(currentSpecification.CultureTo) ? CultureInfo.InvariantCulture : CultureInfo.GetCultureInfo(currentSpecification.CultureTo); }
@cultureInfoFrom.DisplayName @cultureInfoTo.DisplayName - @*@T("Remove")*@ + @T("Edit") | + @T("Remove")
- @T("A provider identifier may not be shown if not supplied by an internal library. Also A key and secret are not required for every mechanism") } else { -

@T("There are no specifications registered. Why not Create one?", Url.Action("Create"))

+

@T("There are no specifications registered. Why not Create one?", Url.Action("Create", "TransliterationAdmin"))

} } \ No newline at end of file