fix #6157 - support changing language with LanguageSwitcher when not using content localization

This commit is contained in:
sbwalker
2026-04-06 13:40:06 -04:00
parent 6814a7bcdb
commit a110497967
2 changed files with 39 additions and 24 deletions

View File

@@ -48,7 +48,7 @@
{ {
MenuAlignment = DropdownAlignment.ToLower() == "right" ? "dropdown-menu-end" : string.Empty; 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)); _contentLocalization = PageState.Languages.Any(item => !string.IsNullOrEmpty(item.AliasName));
if (PageState.QueryString.ContainsKey("culture")) if (PageState.QueryString.ContainsKey("culture"))

View File

@@ -194,7 +194,7 @@
ManageScripts(resources, alias); ManageScripts(resources, alias);
AddBodyContent(site.BodyContent); AddBodyContent(site.BodyContent);
AddBodyContent(page.BodyContent); AddBodyContent(page.BodyContent);
ManageLocalization(site); _language = ManageLocalization(alias, site);
// PWA script // PWA script
if (site.PwaIsEnabled && site.PwaAppIconFileId != null && site.PwaSplashIconFileId != null) if (site.PwaIsEnabled && site.PwaAppIconFileId != null && site.PwaSplashIconFileId != null)
@@ -287,7 +287,7 @@
return; return;
} }
} }
// referrer will only be set if the link originated externally // referrer will only be set if the link originated externally
string referrer = (Context.Request.Headers[HeaderNames.Referer] != StringValues.Empty) ? Context.Request.Headers[HeaderNames.Referer] : ""; 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) // 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)) if (string.IsNullOrEmpty(uiCulture))
{ {
// get default language for site // if not using content localization
if (site.Languages.Any()) if (!contentLocalization)
{ {
// use default language if specified otherwise use first language in collection // use default language if specified otherwise use first language in collection
uiCulture = (site.Languages.Where(l => l.IsDefault).SingleOrDefault() ?? site.Languages.First()).Code; uiCulture = (site.Languages.Where(l => l.IsDefault).SingleOrDefault() ?? site.Languages.First()).Code;
} }
else else
{ {
// fallback language // use site culture
uiCulture = LocalizationManager.GetDefaultCulture(); uiCulture = culture;
} }
} }
else
// get site culture (content localization)
var culture = site?.CultureCode;
if (string.IsNullOrEmpty(culture))
{ {
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 // get culture cookie
string cultureCookie = Context.Request.Cookies[Shared.CookieRequestCultureProvider.DefaultCookieName]; 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); 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 // convert to culture cookie format (ie. "c=en|uic=en") and save cookie
cultureCookie = Shared.CookieRequestCultureProvider.MakeCookieValue(new Models.RequestCulture(culture, uiCulture)); cultureCookie = Shared.CookieRequestCultureProvider.MakeCookieValue(new Models.RequestCulture(culture, uiCulture));
SetLocalizationCookie(cultureCookie); SetLocalizationCookie(cultureCookie);
} }
} }
else
{ return culture; // html element language attribute for page
// convert to culture cookie format (ie. "c=en|uic=en") and save cookie
cultureCookie = Shared.CookieRequestCultureProvider.MakeCookieValue(new Models.RequestCulture(culture, uiCulture));
SetLocalizationCookie(cultureCookie);
}
} }
private void SetLocalizationCookie(string cookieValue) private void SetLocalizationCookie(string cookieValue)