diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Localization/Controllers/AdminController.cs index e1adf502a..0070d801c 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Controllers/AdminController.cs @@ -37,58 +37,32 @@ namespace Orchard.Localization.Controllers { public IOrchardServices Services { get; set; } public ActionResult Translate(int id, string to) { - var contentItem = _contentManager.Get(id, VersionOptions.Latest); - - if (contentItem == null) + var masterContentItem = _contentManager.Get(id, VersionOptions.Latest); + if (masterContentItem == null) return HttpNotFound(); - var lp = contentItem.As(); - - if (lp == null) + var masterLocalizationPart = masterContentItem.As(); + if (masterLocalizationPart == null) return HttpNotFound(); - string contentItemCulture = _localizationService.GetContentCulture(contentItem); - var localizations = _localizationService.GetLocalizations(lp, VersionOptions.Latest); + // Check is current item stll exists, and redirect. + var existingTranslation = _localizationService.GetLocalizedContentItem(masterContentItem, to); + if (existingTranslation != null) { + var existingTranslationMetadata = _contentManager.GetItemMetadata(existingTranslation); + return RedirectToAction( + Convert.ToString(existingTranslationMetadata.EditorRouteValues["action"]), + existingTranslationMetadata.EditorRouteValues); + } + + var contentItemTranslation = _contentManager.New(masterContentItem.ContentType); + + var contentItemTranslationPart = contentItemTranslation.As(); + + contentItemTranslationPart.MasterContentItem = masterContentItem; + + var content = _contentManager.BuildEditor(contentItemTranslation); - var siteCultures = _cultureManager.ListCultures(); - - var missingCultures = siteCultures.Where(s => - s != contentItemCulture - && !localizations.Any(l => s == l.Culture.Culture)) - .ToList(); - - string selectedCulture = null; - - if (!String.IsNullOrEmpty(to)) { - - if (!siteCultures.Any(c => String.Equals(c, to, StringComparison.OrdinalIgnoreCase))) - return HttpNotFound(); - - var existingLocalization = String.Equals(contentItemCulture, to, StringComparison.OrdinalIgnoreCase) - ? lp - : localizations.FirstOrDefault(l => string.Equals(l.Culture.Culture, to, StringComparison.OrdinalIgnoreCase)); - - if (existingLocalization != null) { - var metadata = _contentManager.GetItemMetadata(existingLocalization); - return RedirectToAction(Convert.ToString(metadata.EditorRouteValues["action"]), metadata.EditorRouteValues); - } - - selectedCulture = missingCultures.SingleOrDefault(s => string.Equals(s, to, StringComparison.OrdinalIgnoreCase)); - } - - if (lp.Culture != null) - lp.Culture.Culture = null; - var model = new AddLocalizationViewModel { - Id = id, - SelectedCulture = selectedCulture, - MissingCultures = missingCultures, - Content = _contentManager.BuildEditor(contentItem) - }; - - // Cancel transaction so that the LocalizationPart is not modified. - Services.TransactionManager.Cancel(); - - return View(model); + return View(content); } [HttpPost, ActionName("Translate")] @@ -107,64 +81,47 @@ namespace Orchard.Localization.Controllers { } public ActionResult TranslatePOST(int id, Action conditionallyPublish) { - var contentItem = _contentManager.Get(id, VersionOptions.Latest); - var originalLp = contentItem.As(); - - if (contentItem == null) + var masterContentItem = _contentManager.Get(id, VersionOptions.Latest); + if (masterContentItem == null) return HttpNotFound(); - var model = new AddLocalizationViewModel(); - TryUpdateModel(model); + var masterLocalizationPart = masterContentItem.As(); + if (masterLocalizationPart == null) + return HttpNotFound(); - ContentItem contentItemTranslation; - var existingTranslation = _localizationService.GetLocalizedContentItem(contentItem, model.SelectedCulture); + var model = new EditLocalizationViewModel(); + TryUpdateModel(model, "Localization"); + + var existingTranslation = _localizationService.GetLocalizedContentItem(masterContentItem, model.SelectedCulture); if (existingTranslation != null) { - // edit existing - contentItemTranslation = _contentManager.Get(existingTranslation.ContentItem.Id, VersionOptions.DraftRequired); - } else { - // create - contentItemTranslation = _contentManager.New(contentItem.ContentType); - - var translationLp = contentItemTranslation.As(); - - translationLp.MasterContentItem = originalLp.MasterContentItem ?? contentItem; - - if (!string.IsNullOrWhiteSpace(model.SelectedCulture)) - { - translationLp.Culture = _cultureManager.GetCultureByName(model.SelectedCulture); - } - - _contentManager.Create(contentItemTranslation, VersionOptions.Draft); + var existingTranslationMetadata = _contentManager.GetItemMetadata(existingTranslation); + return RedirectToAction( + Convert.ToString(existingTranslationMetadata.EditorRouteValues["action"]), + existingTranslationMetadata.EditorRouteValues); } - model.Content = _contentManager.UpdateEditor(contentItemTranslation, this); + var contentItemTranslation = _contentManager.New(masterContentItem.ContentType); + + var contentItemTranslationPart = contentItemTranslation.As(); + + contentItemTranslationPart.MasterContentItem = masterContentItem; + + _contentManager.Create(contentItemTranslation, VersionOptions.Draft); + + var content = _contentManager.UpdateEditor(contentItemTranslation, this); if (!ModelState.IsValid) { Services.TransactionManager.Cancel(); - model.MissingCultures = _cultureManager.ListCultures().Where(s => s != _localizationService.GetContentCulture(contentItem) && s != _cultureManager.GetSiteCulture()); - var culture = originalLp.Culture; - - if (culture != null) { - culture.Culture = null; - } - model.Content = _contentManager.BuildEditor(contentItem); - return View(model); + return View(content); } - if (existingTranslation != null) { - Services.Notifier.Information(T("Edited content item translation.")); - } - else { - conditionallyPublish(contentItemTranslation); + conditionallyPublish(contentItemTranslation); - Services.Notifier.Information(T("Created content item translation.")); - } + Services.Notifier.Information(T("Created content item translation.")); - var metadata = _contentManager.GetItemMetadata(model.Content.ContentItem); - - //todo: (heskew) if null, redirect to somewhere better than nowhere - return metadata.EditorRouteValues == null ? null : RedirectToRoute(metadata.EditorRouteValues); + var metadata = _contentManager.GetItemMetadata(contentItemTranslation); + return RedirectToAction(Convert.ToString(metadata.EditorRouteValues["action"]), metadata.EditorRouteValues); } bool IUpdateModel.TryUpdateModel(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs index 7777c9f9c..c1d775182 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/Drivers/LocalizationPartDriver.cs @@ -39,10 +39,33 @@ namespace Orchard.Localization.Drivers { } protected override DriverResult Editor(LocalizationPart part, dynamic shapeHelper) { - var localizations = GetEditorLocalizations(part).ToList(); + List localizations = GetEditorLocalizations(part).ToList(); + + var siteCultures = _cultureManager.ListCultures().ToList(); + + List missingCultures; + + if (part.MasterContentItem != null) { + var localizationPart = part.MasterContentItem.As(); + missingCultures = + siteCultures.Where(s => GetEditorLocalizations(localizationPart).All(l => l.Culture.Culture != s)) + .ToList(); + + missingCultures.Remove(localizationPart.Culture.Culture); + } + else { + missingCultures = + siteCultures.Where(s => GetEditorLocalizations(part).All(l => l.Culture.Culture != s)) + .ToList(); + + if (part.Culture != null) + missingCultures.Remove(part.Culture.Culture); + } + var model = new EditLocalizationViewModel { SelectedCulture = GetCulture(part), - SiteCultures = _cultureManager.ListCultures().Where(s => !localizations.Any(l => l.Culture.Culture == s)).ToList(), + SiteCultures = siteCultures, + MissingCultures = missingCultures, ContentItem = part, MasterContentItem = part.MasterContentItem, ContentLocalizations = new ContentLocalizationsViewModel(part) { Localizations = localizations } @@ -84,7 +107,7 @@ namespace Orchard.Localization.Drivers { return c; }).ToList(); } - + protected override void Importing(LocalizationPart part, ContentManagement.Handlers.ImportContentContext context) { var masterContentItem = context.Attribute(part.PartDefinition.Name, "MasterContentItem"); if (masterContentItem != null) { diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj index 1ba82c3e6..d5beb3335 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj +++ b/src/Orchard.Web/Modules/Orchard.Localization/Orchard.Localization.csproj @@ -98,7 +98,6 @@ - @@ -117,9 +116,6 @@ - - - diff --git a/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/AddLocalizationViewModel.cs b/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/AddLocalizationViewModel.cs deleted file mode 100644 index fd259d4a3..000000000 --- a/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/AddLocalizationViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using Orchard.ContentManagement; - -namespace Orchard.Localization.ViewModels { - public class AddLocalizationViewModel { - public int Id { get; set; } - [Required] - public string SelectedCulture { get; set; } - public IEnumerable MissingCultures { get; set; } - public IContent Content { get; set; } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditLocalizationViewModel.cs b/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditLocalizationViewModel.cs index c662e6bbd..1ccd04bf5 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditLocalizationViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Localization/ViewModels/EditLocalizationViewModel.cs @@ -5,6 +5,7 @@ namespace Orchard.Localization.ViewModels { public class EditLocalizationViewModel { public string SelectedCulture { get; set; } public IEnumerable SiteCultures { get; set; } + public IEnumerable MissingCultures { get; set; } public IContent ContentItem { get; set; } public IContent MasterContentItem { get; set; } public ContentLocalizationsViewModel ContentLocalizations { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Views/Admin/Translate.cshtml b/src/Orchard.Web/Modules/Orchard.Localization/Views/Admin/Translate.cshtml index a525f287a..554f22bf7 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Views/Admin/Translate.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Localization/Views/Admin/Translate.cshtml @@ -1,54 +1,8 @@ -@model AddLocalizationViewModel -@using Orchard.Localization.ViewModels; @{ - dynamic content = Model.Content; - content.Zones.Content.Add(New.Partial(TemplateName: "CultureSelection", Model: Model), "0"); - Layout.Title = T("Translate Content").ToString(); } @using (Html.BeginFormAntiForgeryPost()) { @Html.ValidationSummary() - @Display(Model.Content) -} -@using (Script.Foot()) { - + @Display(Model) } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Views/CultureSelection.cshtml b/src/Orchard.Web/Modules/Orchard.Localization/Views/CultureSelection.cshtml deleted file mode 100644 index de5861dbf..000000000 --- a/src/Orchard.Web/Modules/Orchard.Localization/Views/CultureSelection.cshtml +++ /dev/null @@ -1,31 +0,0 @@ -@using System.Globalization -@using System.Text -@model Orchard.Localization.ViewModels.AddLocalizationViewModel -@{ - Style.Require("LocalizationAdmin"); -} -
- -
- @T("This is the {0} variation of {1}", - BuildSelectedCultureList(Html.FieldIdFor(m => m.SelectedCulture), Html.FieldNameFor(m => m.SelectedCulture), Model.MissingCultures, Model.SelectedCulture), - Html.ItemEditLink(Model.Content)) -
-
-@functions{ - private string BuildSelectedCultureList(string id, string name, IEnumerable siteCultures, string culture) { - TagBuilder selectTag = new TagBuilder("select"); - selectTag.Attributes["id"] = id; - selectTag.Attributes["name"] = name; - - foreach (var siteCulture in siteCultures) { - TagBuilder optionTag = new TagBuilder("option"); - optionTag.Attributes["data-content-dir"] = CultureInfo.GetCultureInfo(siteCulture).TextInfo.IsRightToLeft ? "rtl" : "ltr"; - optionTag.Attributes["value"] = siteCulture; - optionTag.SetInnerText(siteCulture); - selectTag.InnerHtml += optionTag.ToString(); - } - - return selectTag.ToString(); - } -} diff --git a/src/Orchard.Web/Modules/Orchard.Localization/Views/EditorTemplates/Parts/Localization.ContentTranslations.Edit.cshtml b/src/Orchard.Web/Modules/Orchard.Localization/Views/EditorTemplates/Parts/Localization.ContentTranslations.Edit.cshtml index 04c2f8f39..9c232b647 100644 --- a/src/Orchard.Web/Modules/Orchard.Localization/Views/EditorTemplates/Parts/Localization.ContentTranslations.Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Localization/Views/EditorTemplates/Parts/Localization.ContentTranslations.Edit.cshtml @@ -1,61 +1,66 @@ @model Orchard.Localization.ViewModels.EditLocalizationViewModel @using System.Globalization -@using System.Linq; @{ Style.Require("LocalizationAdmin"); - var siteCultures = Model.SiteCultures.ToList(); }
- @if (Model.ContentItem.ContentItem.Id == 0 && Model.SelectedCulture == null && Model.ContentLocalizations.Localizations.Count() == 0) { - /* If this is a new item */ -
- -
+ +
+ @*Brand new content item*@ + @if (Model.ContentItem.ContentItem.Id == 0) { + if (Model.MasterContentItem == null) { @T("This is the {0} variation of the content", - BuildSelectedCultureList( - Html.FieldIdFor(m => m.SelectedCulture), - Html.FieldNameFor(m => m.SelectedCulture), - siteCultures, - Model.SelectedCulture)) -
-
- } - - @if (Model.ContentItem.ContentItem.Id > 0 && Model.SelectedCulture != null && Model.ContentLocalizations.Localizations.Count() == 0) { -
- -
- @T("This is the {0} variation of content.", - Html.Encode(Model.SelectedCulture)) -
- @Html.Hidden("SelectedCulture", Model.SelectedCulture) -
- } - - @if (Model.ContentItem.ContentItem.Id > 0 && Model.SelectedCulture != null && Model.ContentLocalizations.Localizations.Count() > 0) { -
- -
- @T("This is the {0} variation of {1}.", - Html.Encode(Model.SelectedCulture), - Html.ItemEditLink(Model.MasterContentItem ?? Model.ContentItem)) -
- @Html.Hidden("SelectedCulture", Model.SelectedCulture) -
- if (Model.ContentLocalizations.Localizations.Count() > 0) { -
-
@T("Other translations:")
-
- @Html.UnorderedList(Model.ContentLocalizations.Localizations, (c, i) => Html.ItemEditLink(c.Culture.Culture, c), "localizations") -
-
+ BuildSelectedCultureList( + Html.FieldIdFor(m => m.SelectedCulture), + Html.FieldNameFor(m => m.SelectedCulture), + Model.SiteCultures, + Model.SelectedCulture)) + } + else { + @T("This is the {0} variation of {1}", + BuildSelectedCultureList( + Html.FieldIdFor(m => m.SelectedCulture), + Html.FieldNameFor(m => m.SelectedCulture), + Model.MissingCultures, + Model.SelectedCulture), + Html.ItemEditLink(Model.MasterContentItem)) + } } - } - @if (Model.SelectedCulture != null && !siteCultures.All(c => c == Model.SelectedCulture || Model.ContentLocalizations.Localizations.Any(l => c == l.Culture.Culture))) { -
@Html.ActionLink(T("+ New translation").Text, "Translate", "Admin", new { area = "Orchard.Localization", id = Model.ContentItem.Id }, null)
- } + @if (Model.ContentItem.ContentItem.Id > 0) { + //if (Model.MasterContentItem == null) { + @T("This is the {0} variation of the content", + Html.Encode(Model.SelectedCulture)) + @*} + else { + @T("This is the {0} variation of {1}", + Html.Encode(Model.SelectedCulture), + Html.ItemEditLink(Model.MasterContentItem)) + }*@ + + if (Model.ContentLocalizations.Localizations.Any()) { +
+
@T("Other translations:")
+
+ @Html.UnorderedList(Model.ContentLocalizations.Localizations, (c, i) => + Html.ItemEditLink(c.Culture.Culture, c), "localizations") +
+
+ } + + if (Model.MissingCultures.Any()) { + var contentItemId = Model.MasterContentItem != null ? Model.MasterContentItem.Id : Model.ContentItem.Id; + +
@Html.ActionLink(T("+ New translation").Text, "Translate", "Admin", new { area = "Orchard.Localization", id = contentItemId }, null)
+ } + + @Html.Hidden(Html.FieldNameFor(m => m.SelectedCulture), Model.SelectedCulture) + } +
+ + + @functions{ private string BuildSelectedCultureList(string id, string name, IEnumerable siteCultures, string culture) { TagBuilder selectTag = new TagBuilder("select"); @@ -65,7 +70,10 @@ foreach (var siteCulture in siteCultures) { TagBuilder optionTag = new TagBuilder("option"); optionTag.Attributes["data-content-dir"] = CultureInfo.GetCultureInfo(siteCulture).TextInfo.IsRightToLeft ? "rtl" : "ltr"; - //optionTag.Attributes["value"] = siteCulture; + + if (siteCulture == culture) { + optionTag.Attributes["selected"] = "selected"; + } optionTag.SetInnerText(siteCulture); selectTag.InnerHtml += optionTag.ToString(); }