From 7936e37ffd79416c2e04506c4f953dc83d606189 Mon Sep 17 00:00:00 2001 From: Erik Stein Date: Thu, 31 Jan 2019 18:11:21 +0100 Subject: [PATCH] switch_language_url. --- CHANGES | 3 +++ shared/utils/templatetags/translation_tags.py | 27 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 13251b3..7976e0f 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +0.2.19 2019-01-31 +- Added switch_language_url template tag. + 0.2.18 2019-01-28 - Added dispatch_slug_path. - Added AdminActionBase, TargetActionBase. diff --git a/shared/utils/templatetags/translation_tags.py b/shared/utils/templatetags/translation_tags.py index 02d78d7..366fd71 100644 --- a/shared/utils/templatetags/translation_tags.py +++ b/shared/utils/templatetags/translation_tags.py @@ -1,8 +1,8 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -# Erik Stein , 2014-2015 - from django import template +from django.urls.exceptions import NoReverseMatch +from django.urls import reverse +from django.utils.six.moves.urllib.parse import urlsplit, urlunsplit +from django.utils.translation import override from ..translation import get_translation, get_translated_field @@ -10,6 +10,25 @@ from ..translation import get_translation, get_translated_field register = template.Library() +@register.simple_tag(takes_context=True) +def switch_language_url(context, lang_code: str): + request = context['request'] + match = request.resolver_match + parsed_url = urlsplit(request.get_full_path()) + + to_be_reversed = "%s:%s" % (match.namespace, match.url_name) \ + if match.namespace else match.url_name + with override(lang_code): + try: + url = reverse(to_be_reversed, args=match.args, kwargs=match.kwargs) + except NoReverseMatch: + pass + else: + url = urlunsplit((parsed_url.scheme, parsed_url.netloc, + url, parsed_url.query, parsed_url.fragment)) + return url + + @register.filter def translation(obj): return get_translation(obj)