mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Hooking in Slugification in to Transliteration
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,10 +94,12 @@
|
||||
<Compile Include="Services\LocalizationDateTimeFormatProvider.cs" />
|
||||
<Compile Include="Services\LocalizationService.cs" />
|
||||
<Compile Include="Services\TransliterationService.cs" />
|
||||
<Compile Include="Services\TransliterationSlugEventHandler.cs" />
|
||||
<Compile Include="ViewModels\AddLocalizationViewModel.cs" />
|
||||
<Compile Include="ViewModels\ContentLocalizationsViewModel.cs" />
|
||||
<Compile Include="ViewModels\EditLocalizationViewModel.cs" />
|
||||
<Compile Include="ViewModels\CreateTransliterationViewModel.cs" />
|
||||
<Compile Include="ViewModels\EditTransliterationViewModel.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Module.txt" />
|
||||
@@ -139,6 +141,10 @@
|
||||
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
|
||||
<Name>Orchard.Core</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Orchard.Autoroute\Orchard.Autoroute.csproj">
|
||||
<Project>{66FCCD76-2761-47E3-8D11-B45D0001DDAA}</Project>
|
||||
<Name>Orchard.Autoroute</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="web.config" />
|
||||
@@ -152,6 +158,9 @@
|
||||
<ItemGroup>
|
||||
<Content Include="Views\TransliterationAdmin\Create.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\TransliterationAdmin\Edit.cshtml" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
|
||||
@@ -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<TransliterationSpecificationRecord> 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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<ILocalizableAspect>();
|
||||
if (localizationAspect == null) return;
|
||||
|
||||
context.Title = _transliterationService.Convert(context.Title, localizationAspect.Culture);
|
||||
context.Adjusted = true;
|
||||
}
|
||||
|
||||
public void FilledSlugFromTitle(FillSlugContext context) {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@
|
||||
<label for="CultureTo">@T("To")</label>
|
||||
@Html.DropDownList("CultureTo", new SelectList(cultures, "Name", "DisplayName", Model.CultureTo))
|
||||
|
||||
<textarea rows="25" cols="80" name="Rules">@value</textarea>
|
||||
<textarea rows="25" cols="80" name="Rules" id="Rules">@value</textarea>
|
||||
</fieldset>
|
||||
|
||||
<input class="button" type="submit" value="@T("Create")" />
|
||||
|
||||
@@ -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()
|
||||
<fieldset>
|
||||
<label for="CultureFrom">@T("From")</label>
|
||||
@Html.DropDownList("CultureFrom", new SelectList(cultures, "Name", "DisplayName", Model.CultureFrom))
|
||||
<label for="CultureTo">@T("To")</label>
|
||||
@Html.DropDownList("CultureTo", new SelectList(cultures, "Name", "DisplayName", Model.CultureTo))
|
||||
|
||||
<textarea rows="25" cols="80" name="Rules" id="Rules">@Model.Rules</textarea>
|
||||
|
||||
@Html.HiddenFor(x => x.Id)
|
||||
</fieldset>
|
||||
|
||||
<input class="button" type="submit" value="@T("Save")" />
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
@Html.ValidationSummary()
|
||||
|
||||
if (currentSpecifications.Any()) {
|
||||
<div class="actions" style="margin-bottom: 15px;"><a class="add button primaryAction" href="#">@T("Create a new specification")</a></div>
|
||||
<div class="actions" style="margin-bottom: 15px;"><a class="add button primaryAction" href="@Url.Action("Create", "TransliterationAdmin")">@T("Create a new specification")</a></div>
|
||||
<table class="items">
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -21,21 +21,21 @@
|
||||
</thead>
|
||||
|
||||
@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);
|
||||
|
||||
<tr>
|
||||
<td>@cultureInfoFrom.DisplayName</td>
|
||||
<td>@cultureInfoTo.DisplayName</td>
|
||||
<td>
|
||||
@*<a href="@Url.RemoveProviderConfiguration(currentProvider.Id)">@T("Remove")</a>*@
|
||||
<a href="@Url.Action("Edit", "TransliterationAdmin", new { id = currentSpecification.Id})">@T("Edit")</a> |
|
||||
<a href="@Url.Action("Remove", "TransliterationAdmin", new { id = currentSpecification.Id})">@T("Remove")</a>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
<span class="hint">@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")</span>
|
||||
}
|
||||
else {
|
||||
<p class="nospecifications">@T("There are no specifications registered. Why not <a href=\"{0}\">Create one</a>?", Url.Action("Create"))</p>
|
||||
<p class="nospecifications">@T("There are no specifications registered. Why not <a href=\"{0}\">Create one</a>?", Url.Action("Create", "TransliterationAdmin"))</p>
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user