После того как вы подготовили перевод, или вы просто желаете использовать переводы, которые уже включены в Django, следует активировать механизм переводов для вашего приложения.
С точки зрения разработчика Django имеет очень гибкую модель принятия решения о том, какой язык следует использовать: для всего проекта, для отдельного пользователя или для обоих случаев.
Для определения языковой настройки на уровне всего проекта установите LANGUAGE_CODE в вашем файле настроек. Django использует эту настройку в случае, если никаких других переводов не найдено.
Если требуется запустить Django так, чтобы он использовал ваш родной язык и для этого языка есть файл переводов, просто установите LANGUAGE_CODE.
Если вы хотите позволить каждому отдельному пользователю указывать его собственные языковые настройки, используйте LocaleMiddleware. Пакет LocaleMiddleware позволяет осуществлять выбор языка, основываясь на данных из запроса. Он настраивает содержимое страницы для каждого пользователя.
Для использования LocaleMiddleware добавьте django.middleware.locale.LocaleMiddleware в параметр MIDDLEWARE_CLASSES. Так как порядок объявления пакетов в этом параметре имеет значение, вы должны руководствоваться следующими правилами:
Удостоверьтесь, что этот пакет находится среди главных пакетов.
Пакет должен идти после SessionMiddleware, потому что LocaleMiddleware использует данные из сессии.
Если вы используете CacheMiddleware, поместите LocaleMiddleware после него (иначе пользователи смогут получить закэшированные данные в неправильной локали).
Например, ваш параметр MIDDLEWARE_CLASSES может выглядеть так:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware'
)
Пакет LocaleMiddleware пытается определить языковую настройку пользователя по следующему алгоритму:
Сначала проверяется содержимое django_language из сессии пользователя.
Если не удалось, проверяется cookie django_language.
Если не удалось, проверяется HTTP заголовок Accept-Language. Этот заголовок отправляется браузером и указывает серверу какой именно язык вы предпочитаете, в порядке приоритета. Django перебирает все указанные в заголовки языки пока не найдёт первый для которого есть перевод.
Если не удалось, Django использует значение глобального параметра LANGUAGE_CODE.
В каждом из шагов ожидается, что языковая настройка будет указана в стандартном формате в виде строки. Например, бразильский вариант португальского языка имеет обозначение pt-br. Если базовый язык доступен, а вариант нет, Django использует базовый язык. Например, если пользователь указал de-at (австрийский вариант немецкого языка), но для Django доступен только немецкий, значит будет использован немецкий язык.
Могут быть выбраны только те языки, которые указаны в параметре LANGUAGES. Таким образом, с помощью этого параметра можно ограничивать набор языков, поддерживаемых приложением:
LANGUAGES = (
('de', _('German')),
('en', _('English')),
)
Данный пример ограничивает набор языков доступный для автоматического выбора немецким и английским языками (а также любыми их вариантами, такими как de-ch или en-us).
Если вы определяете свой LANGUAGES, можно
помечать названия языков в качестве строк подлежащих
переводу. Но в этом случае следует использовать функцию-заглушку
gettext(), а не из модуля
django.utils.translation. Нельзя
импортировать django.utils.translation в
конфигурационном файле, так как этот модуль сам зависит от файла
конфигурации, можем получить бесконечный цикл.
Решением этой проблемы будет использование функции-заглушки, например так:
_ = lambda s: s
LANGUAGES = (
('de', _('German')),
('en', _('English')),
)
Такой подход позволяет утилите
bin/make-messages.py находить такие строки
для перевода, но перевод не будет осуществляться налету. Таким
образом вам потребуется не забыть сменить язык в
настоящей функции
gettext() в любом коде, который использует
LANGUAGES.
Пакет LocaleMiddleware может только выбирать языки для которых Django предоставляет перевод. Если вы желаете предоставить перевод для вашего приложения, который ещё не входит в набор исходных текстов Django, вы пожелаете предоставить как минимум базовый перевод для данного языка. Например, Django использует технические идентификаторы сообщений для перевода форматов даты и времени — вам потребуются хотя бы этот перевод для того, чтобы система работала корректно.
Хорошей отправной точкой будет копирование .po файла для английского языка и перевод хотя бы технических сообщений, а может ещё и сообщений модуля проверки.
Технические идентификаторы сообщений хорошо распознаются, они написаны заглавными буквами. Не следует переводить идентификаторы сообщений, просто предоставьте корректный вариант для английского значения. Например, для DATETIME_FORMAT (или DATE_FORMAT или TIME_FORMAT, это будет форматированная строка, которую вы желаете использовать для вашего языка. Формат идентичен формату строки, используемому шаблонным тегом {{ now }}.
После того, как модуль LocaleMiddleware определит языковую настройку, он делает её доступной через request.LANGUAGE_CODE для каждого объекта запроса. Можно обращаться к его значению в коде ваших представлений. Простой пример:
def hello_world(request, count):
if request.LANGUAGE_CODE == 'de-at':
return HttpResponse("You prefer to read Austrian German.")
else:
return HttpResponse("You prefer to read another language.")
Следует отметить, что в случае статических переводов (т.е., без использования пакета) язык определён в settings.LANGUAGE_CODE, а при использовании динамического перевода (т.е., через пакет) — в request.LANGUAGE_CODE.
| Пред. | Уровень выше | След. |
| Создание файлов с переводами | Начало | Представление set_language |
0 комментариев | Оставьте комментарий