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();