Перевод django rest framework не работает для меня

Я попробовал интернационализацию django rest framework.

doc drf internationalization

Из официальной документации drf установите этот код в settings.py

from django.utils.translation import gettext_lazy as _

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

LANGUAGE_CODE = "it"

LANGUAGES = (
    ('en', _('English')),
    ('it', _('Italian')),
    ('fr', _('French')),
    ('es', _('Spanish')),
)

TIME_ZONE = 'UTC'

USE_I18N = True

но когда я пробую POST api rest

curl -X 'POST' \
  'http://172.18.0.1:7000/appjud/api/v1/reset-password/' \
  -H 'accept: application/json' \
  -H 'Authorization: Token 014cb7982f31767a8ce07c9f216653d4674baeaf' \
  -H 'Content-Type: application/json' \
  -d '{
  "new_password": "",
  "confirm_password": ""
}'

Response body
[
  {
    "newpassword": [
      "This field is required."
    ],
    "confirmpassword": [
      "This field is required."
    ]
  }
]

Response headers
allow: POST,OPTIONS  
content-language: en  
content-length: 91  
content-type: application/json  
cross-origin-opener-policy: same-origin  
date: Sat,03 Dec 2022 16:14:16 GMT  
referrer-policy: same-origin  
server: WSGIServer/0.2 CPython/3.9.15  
vary: Accept,Accept-Language,Origin  
x-content-type-options: nosniff  
x-frame-options: DENY

Как мы видим, он выводит "This field is required.", но я бы хотел "Questo campo è obbligatorio.". Что мне не хватает в файле config settings.py?

Похоже, что вы добавили LocaleMiddleware в конец списка middlewares. Но порядок здесь имеет значение. Из docs:

Поскольку порядок установки промежуточного ПО имеет значение, следуйте следующим рекомендациям:

Убедитесь, что это одно из первых установленных промежуточных программ. Оно должно быть после SessionMiddleware, потому что LocaleMiddleware использует данные сессии. И оно должно быть установлено до CommonMiddleware потому что CommonMiddleware требует активированного языка для того, чтобы разрешить запрошенный URL. Если вы используете CacheMiddleware, поместите LocaleMiddleware после него.

.

Попробуйте изменить порядок в соответствии с этим примечанием.

Вернуться на верх