diff --git a/apps/web-client-base-net/src/WebClientBase.Client/Components/LanguageSwitcher.razor b/apps/web-client-base-net/src/WebClientBase.Client/Components/LanguageSwitcher.razor index f6e30ad4..1325ee47 100644 --- a/apps/web-client-base-net/src/WebClientBase.Client/Components/LanguageSwitcher.razor +++ b/apps/web-client-base-net/src/WebClientBase.Client/Components/LanguageSwitcher.razor @@ -5,7 +5,7 @@ - @(CultureInfo.CurrentCulture.Name.StartsWith("vi") ? "VI" : "EN") + @GetCurrentLabel() @@ -27,13 +27,24 @@ @code { + private string GetCurrentLabel() + { + var uri = new Uri(Navigation.Uri); + var path = uri.PathAndQuery; + + // Simple heuristic: if path starts with /vi-VN or /vi, show VI. Default EN. + if (path.StartsWith("/vi", StringComparison.OrdinalIgnoreCase)) + { + return "VI"; + } + return "EN"; + } + private void SwitchLanguage(string targetCulture) { var uri = new Uri(Navigation.Uri); var path = uri.PathAndQuery; - - // Simple logic to replace or prepend culture segment - // Check if path starts with a supported culture + var segments = path.Split('/', StringSplitOptions.RemoveEmptyEntries); string newPath; @@ -42,13 +53,11 @@ segments[0].Equals("vi", StringComparison.OrdinalIgnoreCase) || segments[0].Equals("en", StringComparison.OrdinalIgnoreCase))) { - // Replace first segment segments[0] = targetCulture; newPath = "/" + string.Join('/', segments); } else { - // Prepend if (path == "/") path = ""; newPath = $"/{targetCulture}{path}"; } diff --git a/apps/web-client-base-net/src/WebClientBase.Client/Localization/LocalizationCache.cs b/apps/web-client-base-net/src/WebClientBase.Client/Localization/LocalizationCache.cs index 22824c24..0356c970 100644 --- a/apps/web-client-base-net/src/WebClientBase.Client/Localization/LocalizationCache.cs +++ b/apps/web-client-base-net/src/WebClientBase.Client/Localization/LocalizationCache.cs @@ -35,7 +35,7 @@ public class LocalizationCache if (cultureName == "vi") cultureName = "vi-VN"; if (cultureName == "en") cultureName = "en-US"; - var loaded = await _httpClient.GetFromJsonAsync>($"/locales/{cultureName}.json"); + var loaded = await _httpClient.GetFromJsonAsync>($"/locales/{cultureName}.json?v={DateTime.Now.Ticks}"); if (loaded != null) { _strings = loaded; diff --git a/apps/web-client-base-net/src/WebClientBase.Client/Program.cs b/apps/web-client-base-net/src/WebClientBase.Client/Program.cs index 4258f835..a2992730 100644 --- a/apps/web-client-base-net/src/WebClientBase.Client/Program.cs +++ b/apps/web-client-base-net/src/WebClientBase.Client/Program.cs @@ -27,8 +27,26 @@ builder.Services.AddSingleton(); -await cache.LoadAsync(CultureInfo.CurrentCulture); + +// Detect culture from BaseAddress (which is set by from Server) +var baseAddress = builder.HostEnvironment.BaseAddress; +var culture = new CultureInfo("en-US"); // Default + +if (baseAddress.Contains("/vi-VN/", StringComparison.OrdinalIgnoreCase)) +{ + culture = new CultureInfo("vi-VN"); +} +else if (baseAddress.Contains("/vi/", StringComparison.OrdinalIgnoreCase)) +{ + culture = new CultureInfo("vi-VN"); +} + +CultureInfo.DefaultThreadCurrentCulture = culture; +CultureInfo.DefaultThreadCurrentUICulture = culture; + +await cache.LoadAsync(culture); await host.RunAsync(); diff --git a/apps/web-client-base-net/src/WebClientBase.Client/WebClientBase.Client.csproj b/apps/web-client-base-net/src/WebClientBase.Client/WebClientBase.Client.csproj index b02c1f37..a7961cd7 100644 --- a/apps/web-client-base-net/src/WebClientBase.Client/WebClientBase.Client.csproj +++ b/apps/web-client-base-net/src/WebClientBase.Client/WebClientBase.Client.csproj @@ -5,6 +5,7 @@ enable enable true + true