You can use it as a starting point. Maybe there are better ways.
add first the following references
@using Nop.Core.Domain.Localization;
@using System.Text;
@using Nop.Services.Seo;
...
then add the following code after
//custom tag(s)
var seoSettings = EngineContext.Current.Resolve<SeoSettings>();
if (!string.IsNullOrEmpty(seoSettings.CustomHeadTags))
{
Html.AppendHeadCustomParts(seoSettings.CustomHeadTags);
}
add this code
//Hhreflang and Bing content-language tags
RouteData data = Request.RequestContext.RouteData;
if (data != null)
{
var languageService = EngineContext.Current.Resolve<Nop.Services.Localization.ILanguageService>();
var storeContext = EngineContext.Current.Resolve<Nop.Core.IStoreContext>();
var urlRecordService = EngineContext.Current.Resolve<IUrlRecordService>();
var workContext = EngineContext.Current.Resolve<Nop.Core.IWorkContext>();
var slug = data.Values["generic_se_name"] as string;
var urlRecord = urlRecordService.GetBySlugCached(slug);
string pageURL = "";
var result = new StringBuilder();
//bing lang
result.AppendFormat("<meta http-equiv=\"content-language\" content=\"{0}\" >", workContext.WorkingLanguage.LanguageCulture.ToLower());
result.Append(Environment.NewLine);
//base URL
if (urlRecord != null)
{
pageURL = urlRecordService.GetActiveSlug(urlRecord.EntityId, urlRecord.EntityName, 0);
}
else
{ //non SEO URL
pageURL = Request.Path.Substring(1);
}
result.AppendFormat("<link rel=\"alternate\" href=\"{0}{1}\" hreflang=\"x-default\" />", storeContext.CurrentStore.Url, pageURL);
result.Append(Environment.NewLine);
//SEO Lang Url
var localizationSettings = EngineContext.Current.Resolve<LocalizationSettings>();
if (localizationSettings.SeoFriendlyUrlsForLanguagesEnabled)
{
foreach (var language in languageService.GetAllLanguages(storeId: storeContext.CurrentStore.Id))
{
if (urlRecord != null) //SEO URL
{
pageURL = SeoExtensions.GetSeName(urlRecord.EntityId, urlRecord.EntityName, language.Id);
}
result.AppendFormat("<link rel=\"alternate\" href=\"{0}{1}/{2}\" hreflang=\"{1}\" />", storeContext.CurrentStore.Url, language.UniqueSeoCode, pageURL);
result.Append(Environment.NewLine);
}
}
Html.AppendHeadCustomParts(result.ToString());
} //Hhreflang