Fix setlang redirect normalization for locale variants

This commit is contained in:
2026-04-11 20:48:55 +02:00
parent 58139b08ff
commit 605f1e8276
3 changed files with 33 additions and 6 deletions

View File

@@ -21,11 +21,17 @@ def normalize_set_language_next(value: str | None) -> str:
if not path.startswith("/"):
path = f"/{path}"
language_codes = [code for code, _ in settings.LANGUAGES]
if language_codes:
pattern = (
rf"^/(?:{'|'.join(re.escape(code) for code in language_codes)})(?=/|$)"
)
path = re.sub(pattern, "", path, count=1) or "/"
configured_codes = {
str(code).lower().replace("_", "-") for code, _ in settings.LANGUAGES
}
first_segment, _, remainder = path.lstrip("/").partition("/")
normalized_segment = first_segment.lower().replace("_", "-")
looks_like_language_code = bool(
re.fullmatch(r"[a-z]{2}(?:-[a-z]{2})?", normalized_segment)
)
should_strip = normalized_segment in configured_codes or looks_like_language_code
if should_strip:
path = f"/{remainder}" if remainder else "/"
return urlunsplit(("", "", path, parsed.query, ""))