public static MvcHtmlString GetAlternateLinks(this ContentReference contentReference) { if (!ProcessRequest) { return(MvcHtmlString.Create("")); } var alternates = new List <AlternativePageLink>(); var languages = ServiceLocator.Current.GetInstance <ILanguageBranchRepository>().ListEnabled(); GetAlternativePageLink(contentReference, languages, alternates); var masterLanguage = languages.FirstOrDefault(l => l.ID == 1) ?? languages.FirstOrDefault(); var xDefault = alternates.FirstOrDefault(a => string.Equals(a.Culture.ToLower(), masterLanguage?.LanguageID.ToLower())); var siteLanguageList = languages.Select(language => language.LanguageID).ToList(); #region For fallback language page links foreach (var link in alternates) { if (siteLanguageList.Contains(link.Culture)) { siteLanguageList.Remove(link.Culture); } } foreach (var language in siteLanguageList) { if (xDefault != null && language != null) { var fallbackLanguages = ContentLanguageSettingsHandler.Instance.GetFallbackLanguages(contentReference, language); if (fallbackLanguages.Any() && fallbackLanguages.Contains(masterLanguage?.LanguageID)) { var url = xDefault.Url.Replace("/" + masterLanguage?.LanguageID.ToLower() + "/", "/" + language + "/"); var alternate = new AlternativePageLink(url, language); alternates.Add(alternate); } } } #endregion var model = new AlternativeLinkViewModel(alternates); if (!string.IsNullOrEmpty(xDefault?.Url)) { model.XDefaultUrl = xDefault.Url; } var htmlString = CreateHtmlString(model); return(htmlString); }
private static MvcHtmlString CreateHtmlString(AlternativeLinkViewModel model) { var sb = new StringBuilder(); foreach (var alternate in model.Alternates) { sb.AppendLine("<link rel=\"alternate\" href=\"" + alternate.Url + "\" hreflang=\"" + alternate.Culture.ToLower() + "\" />"); } if (!string.IsNullOrEmpty(model.XDefaultUrl)) { sb.AppendLine(" <link rel=\"alternate\" href=\"" + model.XDefaultUrl + "\" hreflang=\"x-default\" />"); } return(MvcHtmlString.Create(sb.ToString())); }