Django: i18n - сменить язык
Я устанавливаю 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/ language switch, но при переходе на другую страницу - язык возвращается к языку по умолчанию. Что я должен делать?
5 ответов
Добавьте translation.activate в ваш код:
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
Я столкнулся с той же проблемой, и это было потому, что next
к параметру добавляется старый код языка, и это не позволяет новому вступить в силу. (Спасибо ответу @Pedro за подсказку).
Чтобы решить эту проблему, если вы используете {{ request.path }}
или же {{ request.get_full_path }}
из вашего шаблона (или вообще не устанавливая его) для перенаправления на тот же переведенный, тогда вам нужно указать следующий, разрезая код языка следующим образом. Остальные остаются, как говорят доктора:
<input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
Я разместил ответ, объясняющий это более подробно и предоставляющий два функциональных примера.
Используя код, размещенный Torsten, ваш URL не изменится, потому что "next" всегда будет выглядеть как */ ru /* other / urls. Это никогда не будет None (на самом деле два, если выше, бесполезны). Ваш язык меняется из-за set_cookie
а также translation.activate
, Но когда вы нажмете любую другую ссылку на вашем сайте на английском языке, язык вернется к ru.
Вы можете попробовать set_language
встроенный вид из django, как описано здесь, или обработайте "следующую" строку, попробовав какую-то замену или что-то в этом роде.
Вы можете попробовать это. этот код будет работать с запросом 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/
Вы можете легко создать переключатель i18n, следуя представлению перенаправления set_language , поэтому вам не нужно создавать его самостоятельно. Вы можете увидеть мой ответ и мой ответ , объясняющий, как создать переключатель i18n для Django и Django Admin соответственно.