From a110497967cb204976ec871d1e7023c3cde5e643 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 6 Apr 2026 13:40:06 -0400 Subject: [PATCH] fix #6157 - support changing language with LanguageSwitcher when not using content localization --- .../Controls/Theme/LanguageSwitcher.razor | 2 +- Oqtane.Server/Components/App.razor | 61 ++++++++++++------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/Theme/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/Theme/LanguageSwitcher.razor index 98420061..4fc415d2 100644 --- a/Oqtane.Client/Themes/Controls/Theme/LanguageSwitcher.razor +++ b/Oqtane.Client/Themes/Controls/Theme/LanguageSwitcher.razor @@ -48,7 +48,7 @@ { MenuAlignment = DropdownAlignment.ToLower() == "right" ? "dropdown-menu-end" : string.Empty; - // if AliasName is populated it means the site is using content localization + // determine if site is using content localization _contentLocalization = PageState.Languages.Any(item => !string.IsNullOrEmpty(item.AliasName)); if (PageState.QueryString.ContainsKey("culture")) diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 20d80d11..53ea0730 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -194,7 +194,7 @@ ManageScripts(resources, alias); AddBodyContent(site.BodyContent); AddBodyContent(page.BodyContent); - ManageLocalization(site); + _language = ManageLocalization(alias, site); // PWA script if (site.PwaIsEnabled && site.PwaAppIconFileId != null && site.PwaSplashIconFileId != null) @@ -287,7 +287,7 @@ return; } } - + // referrer will only be set if the link originated externally string referrer = (Context.Request.Headers[HeaderNames.Referer] != StringValues.Empty) ? Context.Request.Headers[HeaderNames.Referer] : ""; @@ -810,52 +810,67 @@ } } - private void ManageLocalization(Site site) + private string ManageLocalization(Alias alias, Site site) { + // get site culture (content localization) + var culture = site.CultureCode; + if (string.IsNullOrEmpty(culture)) + { + // use fallback language + culture = LocalizationManager.GetDefaultCulture(); + } + + // determine if site is using content localization + var contentLocalization = site.Languages.Any(item => !string.IsNullOrEmpty(item.AliasName)); + // get user culture (ui localization) - var uiCulture = site?.User?.CultureCode; + var uiCulture = site.User?.CultureCode; + // if user has not specified a UI culture if (string.IsNullOrEmpty(uiCulture)) { - // get default language for site - if (site.Languages.Any()) + // if not using content localization + if (!contentLocalization) { // use default language if specified otherwise use first language in collection uiCulture = (site.Languages.Where(l => l.IsDefault).SingleOrDefault() ?? site.Languages.First()).Code; } else { - // fallback language - uiCulture = LocalizationManager.GetDefaultCulture(); + // use site culture + uiCulture = culture; } } - - // get site culture (content localization) - var culture = site?.CultureCode; - if (string.IsNullOrEmpty(culture)) + else { - culture = uiCulture; + // if not using content localization and UI culture is not supported by site + if (!contentLocalization && !site.Languages.Any(item => item.Code == uiCulture)) + { + // use site culture + uiCulture = culture; + } } - _language = culture; // html element language attribute // get culture cookie string cultureCookie = Context.Request.Cookies[Shared.CookieRequestCultureProvider.DefaultCookieName]; - if (cultureCookie != null) + if (cultureCookie == null) { - // verify culture cookie (which could be inaccurate when using subfolders ie. domain.com/fr as cookies are based on domain) + // convert to culture cookie format (ie. "c=en|uic=en") and save cookie + cultureCookie = Shared.CookieRequestCultureProvider.MakeCookieValue(new Models.RequestCulture(culture, uiCulture)); + SetLocalizationCookie(cultureCookie); + } + else + { + // validate the culture cookie var requestCulture = Shared.CookieRequestCultureProvider.ParseCookieValue(cultureCookie); - if (culture != requestCulture.Culture.Name || uiCulture != requestCulture.UICulture.Name) + if (requestCulture.Culture.Name != culture || requestCulture.UICulture.Name != uiCulture) { // convert to culture cookie format (ie. "c=en|uic=en") and save cookie cultureCookie = Shared.CookieRequestCultureProvider.MakeCookieValue(new Models.RequestCulture(culture, uiCulture)); SetLocalizationCookie(cultureCookie); } } - else - { - // convert to culture cookie format (ie. "c=en|uic=en") and save cookie - cultureCookie = Shared.CookieRequestCultureProvider.MakeCookieValue(new Models.RequestCulture(culture, uiCulture)); - SetLocalizationCookie(cultureCookie); - } + + return culture; // html element language attribute for page } private void SetLocalizationCookie(string cookieValue)