Django: i18n - сменить язык - PullRequest
       2

Django: i18n - сменить язык

11 голосов
/ 30 марта 2011

Я устанавливаю model_translation, rosetta, locale_url.Но не работает смена языка.

Мои settings.py:

LANGUAGE_CODE = 'ru'
MODELTRANSLATION_TRANSLATION_REGISTRY = "project.translation"
TRANSLATION_REGISTRY = "project.translation"
ugettext = lambda s: s
LANGUAGES = (
    ('ru', ugettext(u'Russian')),
    ('uk', ugettext(u'Ukrainian')),
)

Мой взгляд на переключение языка:

def set_language(request):
    next = request.REQUEST.get('next', None)
    if not next:
        next = request.META.get('HTTP_REFERER', None)
    if not next:
        next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'GET':
        lang_code = request.GET.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session['django_language'] = lang_code
            else:
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
    return response

В шаблонах:

<a href="{% url set_lang %}?lang=uk&next={{request.path}}">Ukranian</a>

Мое промежуточное ПО:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'localeurl.middleware.LocaleURLMiddleware',
    'django.middleware.common.CommonMiddleware',  
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

Но переключение языков не работает.Если я включаю ссылку http://localhost/uk/ переключение языка, но при переходе на другую страницу - язык обратно на язык по умолчанию.Что мне делать?

Ответы [ 4 ]

8 голосов
/ 31 марта 2011

добавить перевод.активировать в свой код:

from django.utils import translation

def set_language(request):
    next = request.REQUEST.get('next', None)
    if not next:
        next = request.META.get('HTTP_REFERER', None)
    if not next:
        next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'GET':
        lang_code = request.GET.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session['django_language'] = lang_code
            else:
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
            translation.activate(lang_code)
    return response
6 голосов
/ 23 августа 2013

Я столкнулся с той же проблемой, и это потому, что к параметру next добавляется старый код языка, и это не позволяет новому вступить в силу.(Спасибо ответу @ Pedro за подсказку).

Чтобы решить эту проблему, если вы используете {{ request.path }} или {{ request.get_full_path }} из вашего шаблона (или не устанавливаете его вообще) для перенаправления натот же самый переведенный, затем вы должны указать следующий, разрезая код языка следующим образом.Остальные остаются как в документах говорится :

<input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />

Я отправил ответ , объясняющий это более подробно и предоставляющий два функциональных примера.

3 голосов
/ 17 июня 2012

Используя код, опубликованный Torsten, ваш URL не изменится, потому что «next» всегда будет что-то вроде * / ru / * other / urls.Это никогда не будет None (на самом деле два, если выше, бесполезны).Ваш язык меняется из-за set_cookie и translation.activate.Но когда вы нажимаете любую другую ссылку на вашем сайте на английском языке, язык возвращается к ru.

Вы можете попробовать встроенный просмотр set_language из django, как объяснено здесь , илиобработайте «следующую» строку, попробовав заменить или что-то в этом роде.

0 голосов
/ 23 октября 2017

Вы можете попробовать это.этот код будет работать с запросом get

def set_language(request):
    from django.utils.translation import activate
    lang_code = request.GET.get('language', 'en')
    lang = get_language()
    if not lang_code:
        lang_code = request.GET.get('lang_code', settings.LANGUAGE_CODE)
    next_url = request.META.get('HTTP_REFERER', '')
    if not is_safe_url(url=next_url, host=request.get_host()):
        next_url = '/'
    response = HttpResponseRedirect(next_url)
    if lang_code and check_for_language(lang_code):
        if hasattr(request, 'session'):
            request.session['django_language'] = lang_code
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
        activate(lang_code)
    return response

или вы можете использовать опцию встроенного языка.это будет работать с запросом POST https://docs.djangoproject.com/en/dev/topics/i18n/translation/#django.views.i18n.set_language

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...