using System; using System.Globalization; using System.Linq; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web.Routing; using Domain = Umbraco.Web.Routing.Domain; namespace Umbraco.Web.Models { public static class ContentExtensions { /// /// Returns true if the content has any property type that allows language variants /// /// /// public static bool HasLanguageVariantPropertyType(this IContent content) { return content.PropertyTypes.Any(x => x.Variations == ContentVariation.CultureNeutral); } /// /// Returns true if the content has a variation for the language/segment combination /// /// /// /// /// public static bool HasVariation(this IContent content, int langId, string segment = null) { //TODO: Wire up with new APIs return false; //return content.Languages.FirstOrDefault(x => x == langId); } /// /// Gets the culture that would be selected to render a specified content, /// within the context of a specified current request. /// /// The content. /// The request Uri. /// The culture that would be selected to render the content. public static CultureInfo GetCulture(this IContent content, Uri current = null) { return GetCulture(UmbracoContext.Current, Current.Services.DomainService, Current.Services.LocalizationService, Current.Services.ContentService, content.Id, content.Path, current); } /// /// Gets the culture that would be selected to render a specified content, /// within the context of a specified current request. /// /// An instance. /// An implementation. /// An implementation. /// An implementation. /// The content identifier. /// The content path. /// The request Uri. /// The culture that would be selected to render the content. internal static CultureInfo GetCulture(UmbracoContext umbracoContext, IDomainService domainService, ILocalizationService localizationService, IContentService contentService, int contentId, string contentPath, Uri current) { var route = umbracoContext == null ? null // for tests only : umbracoContext.ContentCache.GetRouteById(contentId); // may be cached var domainCache = umbracoContext == null ? new PublishedCache.XmlPublishedCache.DomainCache(domainService) // for tests only : umbracoContext.PublishedShapshot.Domains; // default var domainHelper = new DomainHelper(domainCache); Domain domain; if (route == null) { // if content is not published then route is null and we have to work // on non-published content (note: could optimize by checking routes?) var content = contentService.GetById(contentId); if (content == null) return GetDefaultCulture(localizationService); var hasDomain = domainHelper.NodeHasDomains(content.Id); while (hasDomain == false && content != null) { content = content.Parent(contentService); hasDomain = content != null && domainHelper.NodeHasDomains(content.Id); } domain = hasDomain ? domainHelper.DomainForNode(content.Id, current) : null; } else { // if content is published then we have a route // from which we can figure out the domain var pos = route.IndexOf('/'); domain = pos == 0 ? null : domainHelper.DomainForNode(int.Parse(route.Substring(0, pos)), current); } var rootContentId = domain == null ? -1 : domain.ContentId; var wcDomain = DomainHelper.FindWildcardDomainInPath(domainCache.GetAll(true), contentPath, rootContentId); if (wcDomain != null) return wcDomain.Culture; if (domain != null) return domain.Culture; return GetDefaultCulture(localizationService); } private static CultureInfo GetDefaultCulture(ILocalizationService localizationService) { var defaultLanguage = localizationService.GetAllLanguages().FirstOrDefault(); return defaultLanguage == null ? CultureInfo.CurrentUICulture : new CultureInfo(defaultLanguage.IsoCode); } } }