Замена дефолтного перевода слова в Django Admin
Если вы не удовлетворены тем, как приложение перевело какое-нибудь слово, вы можете легко заменить его на свой вариант. В этой статье мы рассмотрим, как сделать это в Django.
Как Django ищет переводы
Когда Django ищет перевод слова, он сначала проверяет папку locale
на самом верхнем уровне проекта. Если перевод не найден там, он начинает искать его последовательно по приложениям, объявленным в INSTALLED_APPS
. Как только он находит перевод слова (в скомпилированном файле django.mo
необходимого языка), он возвращает его, заканчивая поиск.
Подготовка проекта к интернационализации
Отредактируйте файл settings.py
вашего проекта и добавьте следующие настройки LANGUAGES
рядом с параметром LANGUAGE_CODE
и LOCALE_PATHS
:
# settings.py
LANGUAGE_CODE = 'ru'
TIME_ZONE = 'Europe/Moscow'
USE_I18N = True
USE_TZ = True
LANGUAGES = (
("ru", _("Russian")),
("en", _("English")),
)
LOCALE_PATHS = [
BASE_DIR / "locale/",
]
LOCALE_PATHS
- Этот параметр указывает каталоги, в которых Django должен искать файлы перевода. Пути языка, которые появляются первыми, имеют наивысший приоритет.
LANGUAGES
- Этот параметр указывает, что наш проект будет доступен только на английском и испанском языках.LANGUAGE_CODE
- Это установит русский язык в качестве языка по умолчанию.
Добавление промежуточного программного обеспечения
Добавьте 'django.middleware.locale.LocaleMiddleware'
в настройки MIDDLEWARE_CLASSES
. Убедитесь, что эта строка вставлена после SessionMiddleware
, потому что LocaleMiddleware
необходимо использовать данные сессии. Она также должна быть помещена перед CommonMiddleware
, поскольку для разрешения запрошенного URL-адреса требуется активный язык.
# settings.py
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
# ...
)
Теперь наш проект готов к интернационализации. Мы можем использовать команду makemessages
для создания файлов сообщений в каталогах locale
.
Вызовите следующую команду для добавления русского языка
django-admin makemessages -l ru
Добавление перевода
В файле project/locale/ru/django.po
добавьте следующую строку:
# django.po
msgid "Filters"
msgstr "Фильтр"
Эта строка указывает, что слово "Filters" должно быть переведено как "Фильтр" на русском языке.
Проблема с автоматическим обновлением
Когда вы вызываете команду django-admin makemessages -a
, Django может посчитать, что слова в вашем коде нигде нет и закомментирует их. Чтобы избежать этой проблемы, вы можете добавить в свой код специальную строку, которая будет указывать Django, что эти слова должны быть переведены.
Решение
Вы можете создать отдельный файл, например translations.py
, и добавить в него следующий код:
from django.utils.translation import gettext_lazy as _
translations = [_('Filters'), _('By %(filter_title)s'), _('To')]
Этот код указывает Django, что слово "Filters" должно быть переведено. Вы можете добавить в список translations
несколько слов, которые нужно перевести.
Почему это работает
Когда Django обрабатывает файл translations.py
, он видит, что слово "Filters" используется в коде и не закомментирует его в файле django.po
. Это позволяет вам сохранить переводы в файле django.po
и избежать проблем с автоматическим обновлением. После того, как вы добавили переводы в файл django.po
, вам нужно скомпилировать их в файл django.mo
. Для этого вы можете использовать команду django-admin compilemessages
.
django-admin compilemessages --ignore=env
Эта команда скомпилирует все сообщения в файле django.po
и игнорирует ошибки, связанные с окружением. После выполнения команды вы увидите сообщение о том, что сообщения были успешно скомпилированы. Файл django.mo
будет создан в том же каталоге, где находится файл django.po
.
Зачем нужна компиляция
Компиляция сообщений необходима для того, чтобы Django мог использовать переводы в вашем приложении. Без компиляции сообщений Django не сможет найти переводы и будет использовать исходные строки.
Совет
После того, как вы добавили новые переводы или изменили существующие, не забудьте скомпилировать сообщения снова, чтобы изменения вступили в силу.
После выполнения этих шагов, Django будет использовать ваш перевод вместо дефолтного.