Интернационализация и локализация django
Table of Contents
На примере русского языка.
-
В файл settings.py вписываем:
123456789101112131415LANGUAGE_CODE = 'ru'LANGUAGES = (('ru', 'Russian'),('en', 'English'),)MIDDLEWARE_CLASSES = ('django.middleware.common.CommonMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.locale.LocaleMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware',) -
Подготавливаем все фразы к переводу.
Для этого в .py-файлах:
123from django.utils.translation import ugettext as _...jsonDict["message"] = _("no data received")
а в шаблонах есть теги для перевода фраз и многострочного перевода:
12345{% load i18n %}{% trans "Login" %}{% blocktrans count object.sets as sets %}{{ sets }} set{% plural %}{{ sets }} sets{% endblocktrans %}
Лучше обходиться без начальных и оконечных пробелов, т.к. в противном случае перевод может не подцепиться.К сожалению, в каждом шаблоне нужно добавлять загрузку i18n, сразу после тега {% extends «layout.html» %}, почему-то разработчики джанго считают это фичей, видимо, потому что не пользуются).
Перевод полей модели:
123from django.utils.translation import ugettext_lazy as _...birthday = models.DateField(blank = True, null = True, verbose_name = _('Birthday'))Перевод полей форм:
123from django.utils.translation import ugettext as _...pass1 = forms.CharField(widget = forms.PasswordInput, label = _("Password"), min_length = 6, max_length = 30) - В корне проекта создаём папку locale
-
Из корня проекта запускаем команду
1django-admin makemessages -l ru -a
Команда генерирует файл django.po.
Сначала идёт заголовок, в котором нет ничего интересного, за исключением следующих строк:12"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n""%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"По этому правилу образовываются формы слов русского языка во множественном числе.
Дальше следуют пачки вида123#: main/views.py:341msgid "no data received"msgstr "данные не переданы"где первая строка — место, где встретилась фраза, помеченная для перевода, вторая строка — фраза, а третья — перевод, который надо вписать.
Особый случай — переводы, зависящие от числа, к примеру, подходов:123456#: templates/.../list.html:17msgid "%(sets)s set"msgid_plural "%(sets)s sets"msgstr[0] "%(sets)s подход"msgstr[1] "%(sets)s подхода"msgstr[2] "%(sets)s подходов"здесь для русского языка нужно задать три фразы — для значения переменной 1, 2 и 5.
-
Скомплировать переводы
1django-admin.py compilemessages
По необходимости пункты 4-5 можно повторять, при этом уже введённые переводы не будут потеряны, если фразы, помеченные к переводу, не были удалены.
Джанго определяет язык пользователя так (если не нашёл, то идёт дальше):
- Ищет ключ django_language в сессии пользователя
- Ищет в cookies
- Ищет в cookies
- Ищет Accept-Language в HTTP-заголовках, и пытается отыскать разрешённые в приложении (в переменной LANGUAGES) языки
- Использует значение переменной LANGUAGE_CODE
Для смены локали нужно следующее:
-
В urls.py прописать url
1url(r'^i18n/', include('django.conf.urls.i18n')),
смена локали будет доступна по адресу /i18n/setlang/ -
Где-нибудь в шаблоне определить форму:
1234567891011{% trans 'Change your locale' %}:<form action="/i18n/setlang/" method="POST">{% csrf_token %}<input name="next" type="hidden" value="/accounts/profile/" /><br/><select name="language">{% for lang in LANGUAGES %}<option value="{{ lang.0 }}">{{ lang.1 }}</option>{% endfor %}</select><br/><input type="submit" value="{% trans 'change' %}" /></form>
Ссылка на официальную документацию по интернационализации django.
Локализация javascript в django
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.
Этот подход может помочь со склонением месяца при выводе даты?
Если кто посоветует — буду благодарен.
Из банального — фразы для перевода писать с суффиксами, и переводить их и на английский тоже (чтобы убрать суффикс).
Ну или выложите здесь часть кода, которая не работает.
У меня такого вроде не было
LOCALE_PATHS = (
‘полный путь к каталогу locale проекта’,
)
‘django.core.context_processors.i18n’.
у меня тут есть еще одна апликация (3rd party), у которой тоже есть своя локализация ru…
тогда вопрос меняется ;)
как «склеивать» мою и 3rd party локализации?
Можете сделать видео как это все настроить правильно самого начала
Хороший язык, была возможность.
Почему бы и нет.
Он ещё и быстрый и простой.