Язык хранится в поле Useprofile.language, которое применяется при входе пользователя в систему. - PullRequest
1 голос
/ 06 ноября 2011

Мне нужно установить язык для пользователя в 2 случаях:

  1. Пользователь входит в систему (django проверяет его поле UserProfile на наличие значения поля языка и устанавливает правильный язык)
  2. Пользователи изменяютсяlang на странице "Пользовательские настройки".

Я пробовал с приемником сигнала "user_logged_in"

from django.utils import translation
from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in

@receiver(user_logged_in)
def setlang(sender, **kwargs):
    translation.activate(kwargs['user'].get_profile().language)
    kwargs['request'].session['django_language'] = translation.get_language()

Это работает нормально, пока я не перезапущу свой экземпляр django.Несмотря на то, что сессия жива (не нужно снова входить в систему), веб-сайт отображается на языке, указанном в настройках.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2018

После ответа Тимми вы можете найти уже опубликованное промежуточное ПО, которое выполнит эту работу за вас!

Перевод приложения Django с предпочитаемым языком, выбранным зарегистрированным пользователем, можно выполнить с помощью промежуточного ПО Джанго-пользователем языка промежуточного слоя .Это позволяет легко переводить ваше приложение Django, посмотрев на выбранный язык в поле user.language.

Использование:

  1. Добавьте поле языка в вашу модель пользователя:

    class User(auth_base.AbstractBaseUser, auth.PermissionsMixin):
        # ...
        language = models.CharField(max_length=10,
                                    choices=settings.LANGUAGES,
                                    default=settings.LANGUAGE_CODE)
    
  2. Установите промежуточное ПО из pip:

    pip install django-user-language-middleware

  3. Добавьте его в свой список классов промежуточного программного обеспечения внастройки для прослушивания запросов:

    MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
        ...
        'user_language_middleware.UserLanguageMiddleware',
        ...
    ]
    

Я надеюсь, что это может помочь людям в этом вопросе в будущем.

1 голос
/ 06 ноября 2011

Я думаю, что лучше, если вы используете промежуточное ПО для достижения этой .Django предоставляет способ добавления хуков в разных местах запроса, чтобы вы могли добавить собственный код.

В вашем случае: при каждом запросе проверяйте, есть ли в сеансе языковая переменная, если нет, извлекайте языковые предпочтения пользователя из базы данных и сохраняйте в переменную сеанса.Проверьте по сигналу сохранения, изменил ли пользователь свои предпочтения;если это так, обновите переменную сеанса (у вас могут возникнуть проблемы с получением доступа к запросу на уровне модели, поэтому лучше сделать это в представлении).

0 голосов
/ 12 января 2016

Я использовал этот фрагмент, но он конфликтует с Regular LocaleMiddleware, и поэтому я не могу добавить многоязычную ферму контента.http://django -hotclub.googlecode.com / СВН-история / r708 / багажник / pinax / профили / middleware.py

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