Browse Source

GET language switcher code generalized.

master
Erik Stein 6 years ago
parent
commit
b04e11225e
  1. 2
      shared/utils/templates/utils/_language_switcher_get.html
  2. 50
      shared/utils/translation.py

2
shared/utils/templates/utils/_language_switcher_get.html

@ -1,4 +1,4 @@
{% load i18n translations %} {% load i18n %}
{% get_language_info_list for LANGUAGES as languages %} {% get_language_info_list for LANGUAGES as languages %}

50
shared/utils/translation.py

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
# Erik Stein <code@classlibrary.net>, 2015
from copy import copy
import os import os
from collections import OrderedDict from collections import OrderedDict
from contextlib import contextmanager from contextlib import contextmanager
@ -16,7 +16,7 @@ from django.utils.http import is_safe_url
from django.utils.six.moves.urllib.parse import urlsplit, urlunsplit from django.utils.six.moves.urllib.parse import urlsplit, urlunsplit
from django.utils.translation import check_for_language, LANGUAGE_SESSION_KEY from django.utils.translation import check_for_language, LANGUAGE_SESSION_KEY
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.views.i18n import LANGUAGE_QUERY_PARAMETER from django.views.i18n import LANGUAGE_QUERY_PARAMETER, set_language
FALLBACK_LANGUAGE_CODE = getattr(settings, 'FALLBACK_LANGUAGE_CODE', 'en') FALLBACK_LANGUAGE_CODE = getattr(settings, 'FALLBACK_LANGUAGE_CODE', 'en')
@ -166,26 +166,28 @@ def active_language(lang='de'):
def set_language_get(request): def set_language_get(request):
""" """
set_language per GET request, set_language per GET request,
modified copy from django.views.i18n (django 1.9.x)
""" """
next = request.POST.get('next', request.GET.get('next')) request = copy(request)
if not is_safe_url(url=next, host=request.get_host()): request.POST = request.GET
next = request.META.get('HTTP_REFERER') request.method = 'POST'
if not is_safe_url(url=next, host=request.get_host()): return set_language(request)
next = '/'
response = http.HttpResponseRedirect(next)
if request.method == 'GET': class I18nUrlMixin(object):
lang_code = request.GET.get(LANGUAGE_QUERY_PARAMETER, None) """
if lang_code and check_for_language(lang_code): View Mixin.
next_trans = translate_url(next, lang_code) Makes the url pattern name available in the template context.
if next_trans != next:
response = http.HttpResponseRedirect(next_trans) Usage:
class ViewClass(I18nUrlMixin, TemplateView):
if hasattr(request, 'session'): ...
request.session[LANGUAGE_SESSION_KEY] = lang_code
else: url(r'<your_pattern>', ViewClass.as_view(view_name='my-wonderful-view', name='my-wonderful-view'),
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code, """
max_age=settings.LANGUAGE_COOKIE_AGE, view_name = None
path=settings.LANGUAGE_COOKIE_PATH,
domain=settings.LANGUAGE_COOKIE_DOMAIN) def get_context_data(self, **kwargs):
return response if 'view_name' not in kwargs and self.view_name:
kwargs['view_name'] = self.view_name
context = super().get_context_data(**kwargs)
return context

Loading…
Cancel
Save