Как настроить динамическое переключение языков в ответах 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файлы.
- Запустите
Вот и все, я думаю!