Django REST Framework
  • Overview
    • Django REST framework
    • Быстрый старт
      • Сериализация
      • Запросы-ответы
      • Представления-классы
      • Аутентификация/права доступа
      • Отношения и связи
      • Наборы представлений и роутеры
    • Навигация по API:
      • Запросы
      • Ответы
      • Представления
      • Общие представления
      • Viewsets
      • Маршрутизаторы
      • Парсеры
      • Рендереры
      • Сериализаторы
      • Поля сериализатора
      • Отношения сериализаторов
      • Валидаторы
      • Аутентификация
      • Разрешения
      • Кэширование
      • Дросселирование
      • Фильтрация
      • Пагинация
      • Версионирование
      • Согласование контента
      • Метаданные
      • Schemas
      • Cуффиксы формата
      • Возвращение URL-адресов
      • Исключения
      • Коды состояния
      • Тестирование
      • Настройки
  • Статьи
    • Статьи
      • AJAX, CSRF & CORS
      • The Browsable API
      • Улучшения в браузере
      • Документирование вашего API
      • HTML и формы
      • Интернационализация
      • REST, гипермедиа и HATEOAS
      • Вложенные сериализаторы с возможностью записи
Powered by GitBook
On this page
  • Включение интернационализированных API
  • Добавление новых переводов
  • Как определяется язык

Was this helpful?

  1. Статьи
  2. Статьи

Интернационализация

PreviousHTML и формыNextREST, гипермедиа и HATEOAS

Last updated 2 years ago

Was this helpful?

Поддержка интернационализации не является необязательной. Она должна быть основной функцией.

  • .

DRF поставляется с переводимыми сообщениями об ошибках. Вы можете сделать так, чтобы они отображались на вашем языке, используя .

Это позволит вам:

  • Выбрать язык по умолчанию, отличный от английского, используя стандартную настройку Django LANGUAGE_CODE.

  • Позволить клиентам самим выбирать язык, используя LocaleMiddleware, включенный в Django. Типичное использование для клиентов API - включение заголовка запроса Accept-Language.

Включение интернационализированных API

Вы можете изменить язык по умолчанию с помощью стандартной настройки Django LANGUAGE_CODE:

LANGUAGE_CODE = "es-es"

Вы можете включить языковые запросы на каждый запрос, добавив LocaleMiddleware в настройку MIDDLEWARE:

MIDDLEWARE = [
    ...
    'django.middleware.locale.LocaleMiddleware'
]

Когда интернационализация по каждому запросу включена, клиентские запросы будут учитывать заголовок Accept-Language, где это возможно. Например, давайте сделаем запрос для неподдерживаемого типа медиа:

Запрос

GET /api/users HTTP/1.1
Accept: application/xml
Accept-Language: es-es
Host: example.org

Ответ

HTTP/1.0 406 NOT ACCEPTABLE

{"detail": "No se ha podido satisfacer la solicitud de cabecera de Accept."}

DRF включает эти встроенные переводы как для стандартных случаев исключений, так и для ошибок валидации сериализатора.

Обратите внимание, что переводы относятся только к самим строкам ошибок. Формат сообщений об ошибках и ключи имен полей останутся неизменными. Пример тела ответа 400 Bad Request может выглядеть следующим образом:

{"detail": {"username": ["Esse campo deve ser único."]}}

Указание набора поддерживаемых языков.

По умолчанию поддерживаются все доступные языки.

Если вы хотите поддерживать только часть доступных языков, используйте стандартную настройку Django LANGUAGES:

LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]

Добавление новых переводов

Иногда вам может понадобиться добавить строки перевода в ваш проект локально. Это может понадобиться, если:

  • Вы хотите использовать DRF на языке, который еще не переведен на Transifex.

  • Ваш проект включает пользовательские сообщения об ошибках, которые не входят в строки перевода DRF по умолчанию.

Локальный перевод на новый язык

Если вы делаете перевод на новый язык, вам нужно будет перевести существующие сообщения об ошибках DRF:

  1. Отредактируйте только что скопированный файл django.po, переведя все сообщения об ошибках.

  2. Запустите manage.py compilemessages -l pt_BR, чтобы сделать переводы доступными для использования Django. Вы должны увидеть сообщение типа processing file django.po in <...>/locale/pt_BR/LC_MESSAGES.

  3. Перезапустите ваш сервер разработки, чтобы увидеть, что изменения вступили в силу.

Если вы переводите только пользовательские сообщения об ошибках, которые существуют в кодовой базе вашего проекта, вам не нужно копировать исходный файл DRF django.po в папку LOCALE_PATHS, а можно просто запустить стандартный процесс Django makemessages.

Как определяется язык

Если вы хотите разрешить языковые предпочтения для каждого запроса, вам нужно включить django.middleware.locale.LocaleMiddleware в настройку MIDDLEWARE.

  1. Во-первых, он ищет префикс языка в запрашиваемом URL.

  2. Если это не удается, он ищет ключ LANGUAGE_SESSION_KEY в текущей сессии пользователя.

  3. Если это не удается, выполняется поиск cookie.

  4. Если это не удается, просматривается HTTP-заголовок Accept-Language.

  5. Если это не удается, используется глобальная настройка LANGUAGE_CODE.

Для клиентов API наиболее подходящим из них обычно является использование заголовка Accept-Language; сеансы и cookies будут недоступны, если не используется аутентификация сеанса, и вообще лучше предпочесть заголовок Accept-Language для клиентов API, а не использовать языковые префиксы URL.

Если вы хотите использовать разные строки для таких частей ответа, как detail и non_field_errors, вы можете изменить это поведение, используя .

Управление переводами DRF осуществляется в режиме онлайн с помощью . Вы можете использовать сервис Transifex для добавления новых языков перевода. Команда сопровождения обеспечит включение этих строк перевода в пакет DRF.

Это руководство предполагает, что вы уже знакомы с тем, как перевести приложение Django. Если это не так, начните с чтения .

Создайте новую папку, в которой вы хотите хранить ресурсы интернационализации. Добавьте этот путь в настройку .

Теперь создайте подпапку для языка, на который вы хотите перевести. Папка должна быть названа с использованием нотации . Например: de, pt_BR, es_AR.

Теперь скопируйте файл из исходного кода DRF в папку translations.

Более подробную информацию о том, как определяется предпочтение языка, вы можете найти в . Для справки, метод следующий:

Яннис Лейдель, выступая на Django Under the Hood, 2015
стандартные механизмы перевода Django
Transifex
Django's translation docs
LOCALE_PATHS
имя локали
base translations file
документации Django
пользовательский обработчик исключений