1313using Nop . Core . Domain . Localization ;
1414using Nop . Core . Domain . News ;
1515using Nop . Core . Domain . Seo ;
16- using Nop . Core . Domain . Stores ;
1716using Nop . Core . Domain . Topics ;
1817using Nop . Core . Events ;
19- using Nop . Core . Http ;
2018using Nop . Core . Infrastructure ;
2119using Nop . Services . Blogs ;
2220using Nop . Services . Catalog ;
@@ -524,7 +522,7 @@ protected virtual async Task WriteSitemapUrlAsync(XmlWriter writer, SitemapUrlMo
524522 /// <param name="fullPath">The path and name of the sitemap file</param>
525523 /// <param name="id">Sitemap identifier</param>
526524 /// <returns>A task that represents the asynchronous operation</returns>
527- protected virtual async Task GenerateAsync ( string fullPath , int id = 0 )
525+ protected virtual async Task GenerateAsync ( string fullPath , int id = 0 )
528526 {
529527 //generate all URLs for the sitemap
530528 var sitemapUrls = await GenerateUrlsAsync ( ) ;
@@ -605,22 +603,6 @@ protected string GetLocalizedUrl(string currentUrl, Language lang)
605603 return new Uri ( new Uri ( scheme ) , localizedPath ) . ToString ( ) ;
606604 }
607605
608- /// <summary>
609- /// Retrieves the list of languages for the given store that are not excluded in the sitemap XML settings,
610- /// if SEO-friendly URLs for languages are enabled.
611- /// </summary>
612- /// <param name="store">The store to retrieve allowed languages for.</param>
613- /// <returns>
614- /// A list of <see cref="Language"/> if SEO-friendly URLs are enabled; otherwise, <c>null</c>.
615- /// </returns>
616- protected async Task < List < Language > > GetAllowedLanguagesAsync ( Store store )
617- {
618- return _localizationSettings . SeoFriendlyUrlsForLanguagesEnabled
619- ? ( await _languageService . GetAllLanguagesAsync ( storeId : store . Id ) )
620- . Where ( lang => ! _sitemapXmlSettings . DisallowLanguages . Contains ( lang . Id ) )
621- . ToList ( )
622- : null ;
623- }
624606 #endregion
625607
626608 #region Methods
@@ -841,43 +823,27 @@ public virtual async Task<SitemapModel> PrepareSitemapModelAsync(SitemapPageMode
841823 /// </returns>
842824 public virtual async Task < SitemapXmlModel > PrepareSitemapXmlModelAsync ( int id = 0 )
843825 {
844- var workingLanguage = await _workContext . GetWorkingLanguageAsync ( ) ;
826+ var language = await _workContext . GetWorkingLanguageAsync ( ) ;
845827 var store = await _storeContext . GetCurrentStoreAsync ( ) ;
846-
847- // get list of allowed languages (null if multilingual URLs are disabled)
848- var languages = await GetAllowedLanguagesAsync ( store ) ;
849828
850- // select current language if allowed, fallback to first allowed if needed
851- var language = languages ? . FirstOrDefault ( lang => lang . Id == workingLanguage ? . Id ) ?? languages ? . FirstOrDefault ( ) ?? workingLanguage ;
829+ var fileName = string . Format ( NopSeoDefaults . SitemapXmlFilePattern , store . Id , language . Id , id ) ;
830+ var fullPath = _nopFileProvider . GetAbsolutePath ( NopSeoDefaults . SitemapXmlDirectory , fileName ) ;
852831
853- if ( language . Id != workingLanguage . Id )
854- _actionContextAccessor . ActionContext . HttpContext . Items [ NopHttpDefaults . ForcedSitemapXmlLanguage ] = language . UniqueSeoCode . ToLowerInvariant ( ) ;
855-
856- try
832+ if ( _nopFileProvider . FileExists ( fullPath ) && _nopFileProvider . GetLastWriteTimeUtc ( fullPath ) > DateTime . UtcNow . AddHours ( - _sitemapXmlSettings . RebuildSitemapXmlAfterHours ) )
857833 {
858- var fileName = string . Format ( NopSeoDefaults . SitemapXmlFilePattern , store . Id , language . Id , id ) ;
859- var fullPath = _nopFileProvider . GetAbsolutePath ( NopSeoDefaults . SitemapXmlDirectory , fileName ) ;
860-
861- if ( _nopFileProvider . FileExists ( fullPath ) && _nopFileProvider . GetLastWriteTimeUtc ( fullPath ) > DateTime . UtcNow . AddHours ( - _sitemapXmlSettings . RebuildSitemapXmlAfterHours ) )
862- {
863- return new SitemapXmlModel { SitemapXmlPath = fullPath } ;
864- }
865-
866- //execute task with lock
867- if ( ! await _locker . PerformActionWithLockAsync (
868- fullPath ,
869- TimeSpan . FromSeconds ( _sitemapXmlSettings . SitemapBuildOperationDelay ) ,
870- async ( ) => await GenerateAsync ( fullPath , id ) ) )
871- {
872- throw new InvalidOperationException ( ) ;
873- }
874-
875834 return new SitemapXmlModel { SitemapXmlPath = fullPath } ;
876835 }
877- finally
836+
837+ //execute task with lock
838+ if ( ! await _locker . PerformActionWithLockAsync (
839+ fullPath ,
840+ TimeSpan . FromSeconds ( _sitemapXmlSettings . SitemapBuildOperationDelay ) ,
841+ async ( ) => await GenerateAsync ( fullPath , id ) ) )
878842 {
879- _actionContextAccessor . ActionContext . HttpContext . Items . Remove ( NopHttpDefaults . ForcedSitemapXmlLanguage ) ;
843+ throw new InvalidOperationException ( ) ;
880844 }
845+
846+ return new SitemapXmlModel { SitemapXmlPath = fullPath } ;
881847 }
882848
883849 /// <summary>
@@ -912,16 +878,26 @@ var name when name.Equals(nameof(ProductTag), StringComparison.InvariantCultureI
912878 _ => GetUrlHelper ( ) . RouteUrl ( routeName , values , protocol )
913879 } ;
914880
915- //url for current language
916- var url = await routeUrlAsync ( routeName ,
917- getRouteParamsAwait != null ? await getRouteParamsAwait ( null ) : null ,
918- await GetHttpProtocolAsync ( ) ) ;
919-
920881 var store = await _storeContext . GetCurrentStoreAsync ( ) ;
921882
922883 var updatedOn = dateTimeUpdatedOn ?? DateTime . UtcNow ;
923- var languages = await GetAllowedLanguagesAsync ( store ) ;
884+ var languages = _localizationSettings . SeoFriendlyUrlsForLanguagesEnabled
885+ ? ( await _languageService . GetAllLanguagesAsync ( storeId : store . Id ) )
886+ . Where ( lang => ! _sitemapXmlSettings . DisallowLanguages . Contains ( lang . Id ) ) . ToList ( )
887+ : null ;
888+
889+ // select store default language if allowed, fallback to first allowed if needed
890+ var workingLanguage = await _workContext . GetWorkingLanguageAsync ( ) ;
891+ var language = languages ? . FirstOrDefault ( lang => lang . Id == store . DefaultLanguageId ) ?? languages ? . FirstOrDefault ( ) ?? workingLanguage ;
924892
893+ //url for current language
894+ var url = await routeUrlAsync ( routeName ,
895+ getRouteParamsAwait != null ? await getRouteParamsAwait ( language . Id ) : null ,
896+ await GetHttpProtocolAsync ( ) ) ;
897+
898+ if ( language . Id != workingLanguage . Id )
899+ url = GetLocalizedUrl ( url , language ) ;
900+
925901 if ( languages == null || languages . Count == 1 )
926902 return new SitemapUrlModel ( url , new List < string > ( ) , updateFreq , updatedOn ) ;
927903
@@ -933,7 +909,7 @@ var name when name.Equals(nameof(ProductTag), StringComparison.InvariantCultureI
933909 getRouteParamsAwait != null ? await getRouteParamsAwait ( lang . Id ) : null ,
934910 await GetHttpProtocolAsync ( ) ) ;
935911
936- return GetLocalizedUrl ( currentUrl , lang ) ;
912+ return lang . Id != workingLanguage . Id ? GetLocalizedUrl ( currentUrl , lang ) : currentUrl ;
937913 } )
938914 . Where ( value => ! string . IsNullOrEmpty ( value ) )
939915 . ToListAsync ( ) ;
0 commit comments