2015-12-14 05:21:02 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Orchard.ContentManagement;
|
|
|
|
|
using Orchard.Localization.Models;
|
|
|
|
|
|
|
|
|
|
namespace Orchard.Localization.Services {
|
|
|
|
|
public class LocalizationService : ILocalizationService {
|
|
|
|
|
private readonly IContentManager _contentManager;
|
|
|
|
|
private readonly ICultureManager _cultureManager;
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
|
2015-12-14 05:21:02 +08:00
|
|
|
|
public LocalizationService(IContentManager contentManager, ICultureManager cultureManager) {
|
|
|
|
|
_contentManager = contentManager;
|
|
|
|
|
_cultureManager = cultureManager;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
|
|
|
|
|
public LocalizationPart GetLocalizedContentItem(IContent content, string culture) {
|
2015-12-14 05:21:02 +08:00
|
|
|
|
// Warning: Returns only the first of same culture localizations.
|
2019-08-23 19:45:08 +08:00
|
|
|
|
return GetLocalizedContentItem(content, culture, null);
|
2015-12-14 05:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
public LocalizationPart GetLocalizedContentItem(IContent content, string culture, VersionOptions versionOptions) {
|
2015-12-14 05:21:02 +08:00
|
|
|
|
var cultureRecord = _cultureManager.GetCultureByName(culture);
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
if (cultureRecord == null) return null;
|
2015-12-14 05:21:02 +08:00
|
|
|
|
|
|
|
|
|
var localized = content.As<LocalizationPart>();
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
if (localized == null) return null;
|
2015-12-14 05:21:02 +08:00
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
var masterContentItemId = localized.HasTranslationGroup ? localized.Record.MasterContentItemId : localized.Id;
|
2019-08-23 19:35:07 +08:00
|
|
|
|
|
2015-12-14 05:21:02 +08:00
|
|
|
|
// Warning: Returns only the first of same culture localizations.
|
|
|
|
|
return _contentManager
|
|
|
|
|
.Query<LocalizationPart>(versionOptions, content.ContentItem.ContentType)
|
|
|
|
|
.Where<LocalizationPartRecord>(l =>
|
2019-08-23 19:45:08 +08:00
|
|
|
|
(l.Id == masterContentItemId || l.MasterContentItemId == masterContentItemId) &&
|
|
|
|
|
l.CultureId == cultureRecord.Id)
|
2015-12-14 05:21:02 +08:00
|
|
|
|
.Slice(1)
|
|
|
|
|
.FirstOrDefault();
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
public string GetContentCulture(IContent content) {
|
2015-12-14 05:21:02 +08:00
|
|
|
|
var localized = content.As<LocalizationPart>();
|
2019-08-23 19:45:08 +08:00
|
|
|
|
|
|
|
|
|
return localized?.Culture == null ?
|
|
|
|
|
_cultureManager.GetSiteCulture() :
|
|
|
|
|
localized.Culture.Culture;
|
2015-12-14 05:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
public void SetContentCulture(IContent content, string culture) {
|
2015-12-14 05:21:02 +08:00
|
|
|
|
var localized = content.As<LocalizationPart>();
|
2019-08-23 19:45:08 +08:00
|
|
|
|
|
|
|
|
|
if (localized == null) return;
|
2015-12-14 05:21:02 +08:00
|
|
|
|
|
|
|
|
|
localized.Culture = _cultureManager.GetCultureByName(culture);
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
public IEnumerable<LocalizationPart> GetLocalizations(IContent content) {
|
2015-12-14 05:21:02 +08:00
|
|
|
|
// Warning: May contain more than one localization of the same culture.
|
2019-08-23 19:45:08 +08:00
|
|
|
|
return GetLocalizations(content, null);
|
2015-12-14 05:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
public IEnumerable<LocalizationPart> GetLocalizations(IContent content, VersionOptions versionOptions) {
|
|
|
|
|
if (content.ContentItem.Id == 0) return Enumerable.Empty<LocalizationPart>();
|
2015-12-14 05:21:02 +08:00
|
|
|
|
|
|
|
|
|
var localized = content.As<LocalizationPart>();
|
|
|
|
|
|
2019-08-23 19:45:08 +08:00
|
|
|
|
var query = versionOptions == null ?
|
|
|
|
|
_contentManager.Query<LocalizationPart>(localized.ContentItem.ContentType) :
|
|
|
|
|
_contentManager.Query<LocalizationPart>(versionOptions, localized.ContentItem.ContentType);
|
2015-12-14 05:21:02 +08:00
|
|
|
|
|
|
|
|
|
int contentItemId = localized.ContentItem.Id;
|
|
|
|
|
|
|
|
|
|
if (localized.HasTranslationGroup) {
|
|
|
|
|
int masterContentItemId = localized.MasterContentItem.ContentItem.Id;
|
|
|
|
|
|
|
|
|
|
query = query.Where<LocalizationPartRecord>(l =>
|
2019-08-23 19:45:08 +08:00
|
|
|
|
l.Id != contentItemId && // Exclude the content
|
|
|
|
|
(l.Id == masterContentItemId || l.MasterContentItemId == masterContentItemId));
|
2015-12-14 05:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
else {
|
2019-08-23 19:45:08 +08:00
|
|
|
|
query = query.Where<LocalizationPartRecord>(l => l.MasterContentItemId == contentItemId);
|
2015-12-14 05:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Warning: May contain more than one localization of the same culture.
|
|
|
|
|
return query.List().ToList();
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-07-12 18:03:18 +08:00
|
|
|
|
}
|