Exemple #1
0
    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')
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
    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
Exemple #5
0
 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
Exemple #6
0
 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
Exemple #7
0
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
Exemple #8
0
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
Exemple #9
0
def change_language(context, lang=None, *args, **kwargs):
    path = context['request'].path
    return translate_url(path, lang)
Exemple #10
0
import gettext as gettext_module