def test_translate_url_utility(self): with translation.override('en'): self.assertEqual(translate_url('/en/non-existent/', 'nl'), '/en/non-existent/') self.assertEqual(translate_url('/en/users/', 'nl'), '/nl/gebruikers/') # Namespaced URL self.assertEqual(translate_url('/en/account/register/', 'nl'), '/nl/profiel/registeren/') self.assertEqual(translation.get_language(), 'en') with translation.override('nl'): self.assertEqual(translate_url('/nl/gebruikers/', 'en'), '/en/users/') self.assertEqual(translation.get_language(), 'nl')
def set_language(request): """ Redirect to a given url while setting the chosen language in the session or cookie. The url and the language code need to be specified in the request parameters. Since this view changes how the user will see the rest of the site, it must only be accessed as a POST request. If called as a GET request, it will redirect to the page in the request (the 'next' parameter) without changing any state. """ next = request.POST.get('next', request.GET.get('next')) if not is_safe_url(url=next, host=request.get_host()): next = request.META.get('HTTP_REFERER') if not is_safe_url(url=next, host=request.get_host()): next = '/' response = http.HttpResponseRedirect(next) if request.method == 'POST': lang_code = request.POST.get('language', None) if lang_code and check_for_language(lang_code): next_trans = translate_url(next, lang_code) if next_trans != next: response = http.HttpResponseRedirect(next_trans) if hasattr(request, 'session'): request.session[LANGUAGE_SESSION_KEY] = lang_code else: response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code, max_age=settings.LANGUAGE_COOKIE_AGE, path=settings.LANGUAGE_COOKIE_PATH, domain=settings.LANGUAGE_COOKIE_DOMAIN) return response
def set_language(request): """ Redirect to a given url while setting the chosen language in the session or cookie. The url and the language code need to be specified in the request parameters. Since this view changes how the user will see the rest of the site, it must only be accessed as a POST request. If called as a GET request, it will redirect to the page in the request (the 'next' parameter) without changing any state. """ next = request.POST.get('next', request.GET.get('next')) if not is_safe_url(url=next, host=request.get_host()): next = request.META.get('HTTP_REFERER') if not is_safe_url(url=next, host=request.get_host()): next = '/' response = http.HttpResponseRedirect(next) if request.method == 'POST': lang_code = request.POST.get(LANGUAGE_QUERY_PARAMETER) if lang_code and check_for_language(lang_code): next_trans = translate_url(next, lang_code) if next_trans != next: response = http.HttpResponseRedirect(next_trans) if hasattr(request, 'session'): request.session[LANGUAGE_SESSION_KEY] = lang_code # Always set cookie response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code, max_age=settings.LANGUAGE_COOKIE_AGE, path=settings.LANGUAGE_COOKIE_PATH, domain=settings.LANGUAGE_COOKIE_DOMAIN) return response
def get(self, *args, **kwargs): lang = kwargs.pop('lang') next_url = self.request.GET.get('next') if (next_url or not self.request.is_ajax()) and not is_safe_url(url=next_url, host=self.request.get_host()): next_url = self.request.META.get('HTTP_REFERER') if next_url: next_url = urlunquote(next_url) # HTTP_REFERER may be encoded. if not is_safe_url(url=next_url, host=self.request.get_host()): next_url = '/' response = HttpResponseRedirect(next_url) if next_url else HttpResponse(status=204) if lang and check_for_language(lang): if next_url: if lang == 'ru': next_trans = re.sub("/en/", "/", next_url) else: next_trans = translate_url(next_url, lang) if next_trans != next_url: response = HttpResponseRedirect(next_trans) translation.activate(lang) if hasattr(self.request, 'session'): self.request.session[translation.LANGUAGE_SESSION_KEY] = lang else: response.set_cookie( settings.LANGUAGE_COOKIE_NAME, lang, max_age=settings.LANGUAGE_COOKIE_AGE, path=settings.LANGUAGE_COOKIE_PATH, domain=settings.LANGUAGE_COOKIE_DOMAIN, ) return response
def get(self, *args, **kwargs): """ This view is used for changing the language (i18n). :return: """ from django.conf import settings new_lang = self.request.GET.get('lang') response = HttpResponseRedirect(self.request.META.get('HTTP_REFERER')) translation.activate(new_lang) if new_lang and check_for_language(new_lang): next_trans = translate_url(self.request.META.get('HTTP_REFERER'), new_lang) response = HttpResponseRedirect(next_trans) if hasattr(self.request, 'session'): self.request.session[LANGUAGE_SESSION_KEY] = new_lang else: response.set_cookie(settings.LANGUAGE_COOKIE_NAME, new_lang, max_age=settings.LANGUAGE_COOKIE_AGE, path=settings.LANGUAGE_COOKIE_PATH, domain=settings.LANGUAGE_COOKIE_DOMAIN) return response
def update_language(request): """ This is a very lazy solution overwriting django.views.i18n.set_lang. We're basically just adding another option to save the selected language into the database, besides the session. This way we can retrieve the language preference across different devices and after a longer period of time, when the user was not logged in. It's possible, that there is a nifty trick on how to make this whole thing shorter and not having to copy the whole function. But this seems to work so far. """ next = request.POST.get('next', request.GET.get('next')) if not is_safe_url(url=next, host=request.get_host()): next = request.META.get('HTTP_REFERER') if not is_safe_url(url=next, host=request.get_host()): next = '/' response = http.HttpResponseRedirect(next) if request.method == 'POST': lang_code = request.POST.get(LANGUAGE_QUERY_PARAMETER) if lang_code and check_for_language(lang_code): next_trans = translate_url(next, lang_code) if next_trans != next: response = http.HttpResponseRedirect(next_trans) if hasattr(request, 'session'): obj, created = UserProfile.objects.get_or_create( user=request.user, defaults={'language': lang_code}, ) if not created: obj.language = lang_code obj.save() request.session[LANGUAGE_SESSION_KEY] = lang_code else: response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code, max_age=settings.LANGUAGE_COOKIE_AGE, path=settings.LANGUAGE_COOKIE_PATH, domain=settings.LANGUAGE_COOKIE_DOMAIN) return response
def change_language(context, lang=None, *args, **kwargs): path = context['request'].path return translate_url(path, lang)
import gettext as gettext_module