Как настроить динамическое переключение языков в ответах API с помощью i18n_паттернов в Django?
Я работаю над проектом Django, и мне нужно реализовать многоязыковую поддержку для моего REST API. Я хочу, чтобы API возвращало ответы на выбранном языке на основе префикса URL (например, /en/
, /ml/
), используя i18n_patterns
.
Я сделал следующее:
В
settings.py
я определил доступные языки:LANGUAGES = [ ('en', 'English'), ('ml', 'Malayalam'), ] LANGUAGE_CODE = 'en'
Я добавил
'django.middleware.locale.LocaleMiddleware'
к настройкамMIDDLEWARE
:MIDDLEWARE = [ ... # other middlewares 'django.middleware.locale.LocaleMiddleware', ]
В
urls.py
проекта я использовалi18n_patterns
для обеспечения префикса URL-адресов с кодом языка:from django.conf.urls.i18n import i18n_patterns urlpatterns = [ path('admin/', admin.site.urls), path('auth/', include('accounts.urls')), path('app/', include('app.urls')) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns = i18n_patterns(*urlpatterns)
Проблема:
Хотя я могу указать язык через URL (например,
./ml/
для Malayalam), ответы API не переводятся автоматически на выбранный язык. Ответы остаются на английском языке, даже если в заголовкеAccept-Language
или префиксе языка указан другой язык (например, малаялам)Что я ожидаю:
- Я ожидаю, что ответы API будут автоматически переводиться на выбранный язык (например, малаялам) на основе префикса URL или заголовка
Accept-Language
.
Что я пробовал:
Я подтвердил, что
LocaleMiddleware
активен вMIDDLEWARE
.Я убедился, что в URL включен правильный языковой префикс (например,
/ml/
)
Мои вопросы:
Требуется ли дополнительная настройка для автоматического перевода ответов API в зависимости от выбранного языка?
Как обеспечить динамический перевод ответов API на нужный язык (например, малаялам) на основе префикса URL или заголовков
Accept-Language
?
- Я ожидаю, что ответы API будут автоматически переводиться на выбранный язык (например, малаялам) на основе префикса URL или заголовка
1. Требуется ли дополнительная настройка для автоматического перевода ответов API в зависимости от выбранного языка?
Да, есть несколько дополнительных шагов, которые необходимо предпринять, чтобы обеспечить автоматический перевод ответов API:
- Пометьте строки для перевода: Используйте
gettext
илиgettext_lazy
в представлениях, сериализаторах и моделях, чтобы пометить строки, которые нуждаются в переводе. - Генерируйте и компилируйте файлы перевода: Используйте
django-admin makemessages
иdjango-admin compilemessages
для создания и компиляции.po
и.mo
файлов для каждого языка. - Убедитесь, что
LocaleMiddleware
правильно настроен: он должен быть расположен послеSessionMiddleware
иCommonMiddleware
в настройкахMIDDLEWARE
. - Установите
LOCALE_PATHS
: Убедитесь, что Django знает, где найти ваши файлы перевода, установивLOCALE_PATHS
вsettings.py
.
2. Как обеспечить динамический перевод ответов API на нужный язык (например, малаялам) на основе префикса URL или заголовков Accept-Language?
Для динамического перевода ответов API на основе префикса URL или заголовка Accept-Language
:
Используйте
i18n_patterns
вurls.py
: Оберните шаблоны URL с помощьюi18n_patterns
, чтобы включить языковые префиксы (например,/ml/
,/en/
).from django.conf.urls.i18n import i18n_patterns from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('auth/', include('accounts.urls')), path('app/', include('app.urls')) ] urlpatterns = i18n_patterns(*urlpatterns)
Убедитесь, что
.LocaleMiddleware
активен :LocaleMiddleware
автоматически активирует язык на основе префикса URL или заголовкаAccept-Language
. Убедитесь, что он находится в вашемMIDDLEWARE
:MIDDLEWARE = [ ... 'django.middleware.locale.LocaleMiddleware', # After SessionMiddleware and CommonMiddleware ... ]
Отметьте строки для перевода в ваших представлениях: Используйте
gettext
илиgettext_lazy
, чтобы отметить строки, которые нуждаются в переводе. Например:from django.utils.translation import gettext as _ def my_view(request): output = _("Hello, world!") return Response({"message": output})
Генерировать и компилировать файлы перевода:
- Запустите
django-admin makemessages -l ml
для генерации.po
файлов для малаялам. - Отредактируйте
.po
файлы, чтобы добавить переводы. - Запустите
django-admin compilemessages
для компиляции.po
файлов в.mo
файлы.
- Запустите
Вот и все, я думаю!