diff --git a/src/Libraries/Nop.Core/Domain/Common/SitemapXmlSettings.cs b/src/Libraries/Nop.Core/Domain/Common/SitemapXmlSettings.cs
index 2e3ae9c88b9..ec4a7548b30 100644
--- a/src/Libraries/Nop.Core/Domain/Common/SitemapXmlSettings.cs
+++ b/src/Libraries/Nop.Core/Domain/Common/SitemapXmlSettings.cs
@@ -71,4 +71,9 @@ public SitemapXmlSettings()
/// Gets or sets the wait time (in seconds) before the operation can be started again
///
public int SitemapBuildOperationDelay { get; set; }
+
+ ///
+ /// Disallow languages
+ ///
+ public List DisallowLanguages { get; set; } = new();
}
\ No newline at end of file
diff --git a/src/Presentation/Nop.Web/Factories/SitemapModelFactory.cs b/src/Presentation/Nop.Web/Factories/SitemapModelFactory.cs
index c9b225bb097..d57ad4eb3e6 100644
--- a/src/Presentation/Nop.Web/Factories/SitemapModelFactory.cs
+++ b/src/Presentation/Nop.Web/Factories/SitemapModelFactory.cs
@@ -878,18 +878,26 @@ var name when name.Equals(nameof(ProductTag), StringComparison.InvariantCultureI
_ => GetUrlHelper().RouteUrl(routeName, values, protocol)
};
- //url for current language
- var url = await routeUrlAsync(routeName,
- getRouteParamsAwait != null ? await getRouteParamsAwait(null) : null,
- await GetHttpProtocolAsync());
-
var store = await _storeContext.GetCurrentStoreAsync();
var updatedOn = dateTimeUpdatedOn ?? DateTime.UtcNow;
var languages = _localizationSettings.SeoFriendlyUrlsForLanguagesEnabled
- ? await _languageService.GetAllLanguagesAsync(storeId: store.Id)
+ ? (await _languageService.GetAllLanguagesAsync(storeId: store.Id))
+ .Where(lang => !_sitemapXmlSettings.DisallowLanguages.Contains(lang.Id)).ToList()
: null;
+ // select store default language if allowed, fallback to first allowed if needed
+ var workingLanguage = await _workContext.GetWorkingLanguageAsync();
+ var language = languages?.FirstOrDefault(lang => lang.Id == store.DefaultLanguageId) ?? languages?.FirstOrDefault() ?? workingLanguage;
+
+ //url for current language
+ var url = await routeUrlAsync(routeName,
+ getRouteParamsAwait != null ? await getRouteParamsAwait(language.Id) : null,
+ await GetHttpProtocolAsync());
+
+ if (language.Id != workingLanguage.Id)
+ url = GetLocalizedUrl(url, language);
+
if (languages == null || languages.Count == 1)
return new SitemapUrlModel(url, new List(), updateFreq, updatedOn);
@@ -901,7 +909,7 @@ var name when name.Equals(nameof(ProductTag), StringComparison.InvariantCultureI
getRouteParamsAwait != null ? await getRouteParamsAwait(lang.Id) : null,
await GetHttpProtocolAsync());
- return GetLocalizedUrl(currentUrl, lang);
+ return lang.Id != workingLanguage.Id ? GetLocalizedUrl(currentUrl, lang) : currentUrl;
})
.Where(value => !string.IsNullOrEmpty(value))
.ToListAsync();