diff --git a/mandelstudio/templates/oxyan/headers/partials/carbasa-user-bar.html b/mandelstudio/templates/oxyan/headers/partials/carbasa-user-bar.html index d071355..d1dce51 100644 --- a/mandelstudio/templates/oxyan/headers/partials/carbasa-user-bar.html +++ b/mandelstudio/templates/oxyan/headers/partials/carbasa-user-bar.html @@ -1,9 +1,9 @@ -{% load i18n i18n_helpers %} +{% load i18n mandelstudio_i18n %} {% get_current_language as LANGUAGE_CODE %}
{% csrf_token %} - + + {% for language in languages %} {% if language.code not in disabled_languages %}
  • diff --git a/mandelstudio/templatetags/mandelstudio_i18n.py b/mandelstudio/templatetags/mandelstudio_i18n.py index 5d6b1f9..dabfd29 100644 --- a/mandelstudio/templatetags/mandelstudio_i18n.py +++ b/mandelstudio/templatetags/mandelstudio_i18n.py @@ -1,6 +1,10 @@ from __future__ import annotations +import re +from urllib.parse import urlsplit, urlunsplit + from django import template +from django.conf import settings register = template.Library() @@ -21,3 +25,23 @@ def skip_to_content_text(context) -> str: request = context.get("request") language_code = getattr(request, "LANGUAGE_CODE", "nl") return SKIP_TO_CONTENT.get(language_code, SKIP_TO_CONTENT["en"]) + + +@register.filter(name="language_neutral_path") +def language_neutral_path(value: str | None) -> str: + """Normalize a path for set_language by removing any leading language prefix.""" + if not value: + return "/" + + parsed = urlsplit(str(value)) + path = parsed.path or "/" + if not path.startswith("/"): + path = f"/{path}" + + language_codes = [code for code, _ in settings.LANGUAGES] + if language_codes: + # Strip the first language segment, e.g. /en/manage -> /manage. + pattern = rf"^/(?:{'|'.join(re.escape(code) for code in language_codes)})(?=/|$)" + path = re.sub(pattern, "", path, count=1) or "/" + + return urlunsplit(("", "", path, parsed.query, "")) diff --git a/mandelstudio/tests/test_mandelstudio_i18n_templatetags.py b/mandelstudio/tests/test_mandelstudio_i18n_templatetags.py new file mode 100644 index 0000000..f430489 --- /dev/null +++ b/mandelstudio/tests/test_mandelstudio_i18n_templatetags.py @@ -0,0 +1,31 @@ +from django.test import SimpleTestCase, override_settings + +from mandelstudio.templatetags.mandelstudio_i18n import language_neutral_path + + +@override_settings( + LANGUAGES=( + ("nl", "Dutch"), + ("en", "English"), + ("de", "German"), + ("fr", "French"), + ("es", "Spanish"), + ("it", "Italian"), + ("pt", "Portuguese"), + ("ru", "Russian"), + ) +) +class LanguageNeutralPathFilterTests(SimpleTestCase): + def test_strips_language_prefix(self): + self.assertEqual(language_neutral_path("/en/manage/"), "/manage/") + self.assertEqual(language_neutral_path("/fr/manage/checkout/paymentmethod/"), "/manage/checkout/paymentmethod/") + + def test_keeps_unprefixed_path(self): + self.assertEqual(language_neutral_path("/manage/"), "/manage/") + self.assertEqual(language_neutral_path("/manage/checkout/paymentmethod/"), "/manage/checkout/paymentmethod/") + + def test_preserves_query_string(self): + self.assertEqual( + language_neutral_path("/de/manage/?next=/de/manage/checkout/paymentmethod/"), + "/manage/?next=/de/manage/checkout/paymentmethod/", + )