[8194] Find translations for Localizaed Terms (#8195)

Fixes #8194
This commit is contained in:
Hermes Sbicego
2019-05-10 21:13:58 +02:00
committed by Sébastien Ros
parent f3f7c98e47
commit a542efbe8d
4 changed files with 26 additions and 29 deletions

View File

@@ -30,15 +30,10 @@ namespace Orchard.Localization.Services {
if (localized == null)
return null;
var masterContent = content.ContentItem.As<LocalizationPart>().MasterContentItem != null ? content.ContentItem.As<LocalizationPart>().MasterContentItem : content;
// Warning: Returns only the first of same culture localizations.
return _contentManager
.Query<LocalizationPart>(versionOptions, content.ContentItem.ContentType)
.Where<LocalizationPartRecord>(l =>
(l.Id == masterContent.Id || l.MasterContentItemId == masterContent.Id)
&& l.CultureId == cultureRecord.Id)
.Slice(1)
.FirstOrDefault();
if (localized.Culture.Culture == culture)
return localized;
return ((ILocalizationService)this).GetLocalizations(content, versionOptions).FirstOrDefault(x=>x.Culture.Id == cultureRecord.Id);
}
string ILocalizationService.GetContentCulture(IContent content) {
@@ -92,8 +87,8 @@ namespace Orchard.Localization.Services {
}
// Warning: May contain more than one localization of the same culture.
return query.List().ToList();
return query.List();
}
}
}
}

View File

@@ -28,7 +28,7 @@
}
if (Model.MissingCultures.Any()) {
var contentItemId = Model.MasterContentItem != null ? Model.MasterContentItem.Id : Model.ContentItem.Id;
var contentItemId = Model.ContentItem.Id;
if (returnUrl != "") {
<div class="add-localization">@Html.ActionLink(T("+ New translation").Text, "Translate", "Admin", new { area = "Orchard.Localization", id = contentItemId, ReturnUrl = returnUrl }, new { itemprop = "UnsafeUrl" })</div>
}
@@ -39,14 +39,14 @@
@Html.Hidden(Html.FieldNameFor(m => m.SelectedCulture), Model.SelectedCulture)
}
else if (Model.MasterContentItem != null) {
else {
@T("This is the <em>{0}</em> variation of {1}",
BuildSelectedCultureList(
Html.FieldIdFor(m => m.SelectedCulture),
Html.FieldNameFor(m => m.SelectedCulture),
Model.MissingCultures,
Model.SelectedCulture),
Html.ItemEditLink(Model.MasterContentItem))
Html.ItemEditLink(Model.MasterContentItem != null?Model.MasterContentItem:Model.ContentLocalizations.Localizations.FirstOrDefault()))
if (Model.ContentLocalizations.Localizations.Any()) {
<dl class="content-localization">
@@ -64,14 +64,7 @@
</dl>
}
}
else {
@T("This is the <em>{0}</em> variation of the content",
BuildSelectedCultureList(
Html.FieldIdFor(m => m.SelectedCulture),
Html.FieldNameFor(m => m.SelectedCulture),
Model.MissingCultures,
Model.SelectedCulture))
}
</div>
</fieldset>

View File

@@ -4,6 +4,7 @@ using System.Web.Mvc;
using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData;
using Orchard.Environment.Extensions;
using Orchard.Localization.Models;
using Orchard.Localization.Services;
using Orchard.Taxonomies.Drivers;
using Orchard.Taxonomies.Fields;
@@ -56,8 +57,15 @@ namespace Orchard.Taxonomies.Controllers {
? _taxonomyService.GetTerms(taxonomy.Id).Where(t => !string.IsNullOrWhiteSpace(t.Name)).Select(t => t.CreateTermEntry()).Where(te => !te.HasDraft).ToList()
: new List<TermEntry>(0);
List<TermPart> appliedTerms = new List<TermPart>();
int firstTermIdForCulture = 0;
if (contentId > 0) {
appliedTerms = _taxonomyService.GetTermsForContentItem(contentId, taxonomyFieldName, VersionOptions.Published).Distinct(new TermPartComparer()).ToList();
// It takes the first term localized with the culture in order to set correctly the TaxonomyFieldViewModel.SingleTermId
var firstTermForCulture = appliedTerms.FirstOrDefault(x => x.As<LocalizationPart>() != null && x.As<LocalizationPart>().Culture != null && x.As<LocalizationPart>().Culture.Culture == culture);
if (firstTermForCulture != null) {
firstTermIdForCulture = firstTermForCulture.Id;
}
terms.ForEach(t => t.IsChecked = appliedTerms.Select(x => x.Id).Contains(t.Id));
}
viewModel = new TaxonomyFieldViewModel {
@@ -66,7 +74,7 @@ namespace Orchard.Taxonomies.Controllers {
Terms = terms,
SelectedTerms = appliedTerms,
Settings = taxonomySettings,
SingleTermId = appliedTerms.Select(t => t.Id).FirstOrDefault(),
SingleTermId = firstTermIdForCulture,
TaxonomyId = taxonomy != null ? taxonomy.Id : 0,
HasTerms = taxonomy != null && _taxonomyService.GetTermsCount(taxonomy.Id) > 0
};

View File

@@ -70,20 +70,21 @@ namespace Orchard.Taxonomies.Handlers {
if (partFieldDefinitions == null)
return; // contentitem without taxonomy
base.BuildEditorShape(context);
var missingCultures = localizationPart.HasTranslationGroup ?
RetrieveMissingCultures(localizationPart.MasterContentItem.As<LocalizationPart>(), true) :
RetrieveMissingCultures(localizationPart, localizationPart.Culture != null);
var missingCultures = RetrieveMissingCultures(localizationPart, localizationPart.Culture != null);
foreach (var partFieldDefinition in partFieldDefinitions) {
if (partFieldDefinition.Settings.GetModel<TaxonomyFieldLocalizationSettings>().TryToLocalize) {
var originalTermParts = _taxonomyService.GetTermsForContentItem(context.ContentItem.As<LocalizationPart>().MasterContentItem.Id, partFieldDefinition.Name, VersionOptions.Latest).Distinct(new TermPartComparer()).ToList();
var originalTermParts = _taxonomyService.GetTermsForContentItem(context.ContentItem.Id, partFieldDefinition.Name, VersionOptions.Latest).Distinct(new TermPartComparer()).ToList();
var newTermParts = new List<TermPart>();
foreach (var originalTermPart in originalTermParts) {
var masterTermPart = _taxonomyExtensionsService.GetMasterItem(originalTermPart.ContentItem);
if (masterTermPart != null) {
foreach (var missingCulture in missingCultures) {
var newTerm = _localizationService.GetLocalizedContentItem(masterTermPart, missingCulture);
if (newTerm != null)
newTermParts.Add(newTerm.ContentItem.As<TermPart>());
if (newTerm != null) {
if (!newTermParts.Contains(newTerm.ContentItem.As<TermPart>())) { //Prevent duplicates
newTermParts.Add(newTerm.ContentItem.As<TermPart>());
}
}
else
_notifier.Add(NotifyType.Warning, T("Term {0} can't be localized on {1}, term has been removed on this language", originalTermPart.ContentItem.As<TitlePart>().Title, missingCulture));
}