diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IRouteBasedCultureNavigationHelper.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IRouteBasedCultureNavigationHelper.cs new file mode 100644 index 0000000000..b2b34e1a65 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IRouteBasedCultureNavigationHelper.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Volo.Abp.Localization; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly; + +public interface IRouteBasedCultureNavigationHelper +{ + Task NavigateToNewCultureAsync( + NavigationManager navigationManager, + LanguageInfo newLanguage, + IEnumerable allLanguages); +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/RouteBasedCultureNavigationHelper.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/RouteBasedCultureNavigationHelper.cs new file mode 100644 index 0000000000..012d7e5705 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/RouteBasedCultureNavigationHelper.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly; + +public class RouteBasedCultureNavigationHelper : IRouteBasedCultureNavigationHelper, ITransientDependency +{ + public virtual Task NavigateToNewCultureAsync( + NavigationManager navigationManager, + LanguageInfo newLanguage, + IEnumerable allLanguages) + { + var relativePath = navigationManager.ToBaseRelativePath(navigationManager.Uri); + var slashIndex = relativePath.IndexOf('/'); + var firstSegment = slashIndex >= 0 ? relativePath.Substring(0, slashIndex) : relativePath; + + var allCultures = allLanguages.Select(l => l.CultureName); + + var newRelativePath = allCultures.Any(c => string.Equals(c, firstSegment, StringComparison.OrdinalIgnoreCase)) + ? newLanguage.CultureName + (slashIndex >= 0 ? relativePath.Substring(slashIndex) : string.Empty) + : newLanguage.CultureName + "/" + relativePath; + + navigationManager.NavigateTo(navigationManager.ToAbsoluteUri(newRelativePath).ToString(), forceLoad: true); + return Task.CompletedTask; + } +} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor index 266a943261..86a74a5929 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor @@ -2,12 +2,14 @@ @using System.Globalization @using System.Collections.Immutable @using Volo.Abp.AspNetCore.Components.Web +@using Volo.Abp.AspNetCore.Components.WebAssembly @using Volo.Abp.AspNetCore.Mvc.Client @inject ILanguageProvider LanguageProvider @inject IJSRuntime JsRuntime @inject ICookieService CookieService @inject NavigationManager NavigationManager @inject ICachedApplicationConfigurationClient ConfigurationClient +@inject IRouteBasedCultureNavigationHelper CultureNavigationHelper @if (_otherLanguages != null && _otherLanguages.Any()) { @@ -66,19 +68,8 @@ { if (_useRouteBasedCulture) { - var relativePath = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); - var slashIndex = relativePath.IndexOf('/'); - var firstSegment = slashIndex >= 0 ? relativePath[..slashIndex] : relativePath; - - var allCultures = _otherLanguages - .Select(l => l.CultureName) - .Append(_currentLanguage.CultureName); - - var newRelativePath = allCultures.Any(c => string.Equals(c, firstSegment, StringComparison.OrdinalIgnoreCase)) - ? language.CultureName + (slashIndex >= 0 ? relativePath[slashIndex..] : string.Empty) - : language.CultureName + "/" + relativePath; - - NavigationManager.NavigateTo(NavigationManager.ToAbsoluteUri(newRelativePath).ToString(), forceLoad: true); + await CultureNavigationHelper.NavigateToNewCultureAsync( + NavigationManager, language, _otherLanguages.Append(_currentLanguage)); return; }