Как настроить динамическое переключение языков в ответах API с помощью i18n_паттернов в Django?

Я работаю над проектом Django, и мне нужно реализовать многоязыковую поддержку для моего REST API. Я хочу, чтобы API возвращало ответы на выбранном языке на основе префикса URL (например, /en/, /ml/), используя i18n_patterns.

Я сделал следующее:

  1. В settings.py я определил доступные языки:

    LANGUAGES = [
        ('en', 'English'),
        ('ml', 'Malayalam'),
    ]
    LANGUAGE_CODE = 'en'  
    
  2. Я добавил 'django.middleware.locale.LocaleMiddleware' к настройкам MIDDLEWARE:

    MIDDLEWARE = [
        ...  # other middlewares
        'django.middleware.locale.LocaleMiddleware',
    ]
    
    
  3. В 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/)

    Мои вопросы:

    1. Требуется ли дополнительная настройка для автоматического перевода ответов API в зависимости от выбранного языка?

    2. Как обеспечить динамический перевод ответов API на нужный язык (например, малаялам) на основе префикса URL или заголовков Accept-Language?

    <<<61

>

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:

  1. Используйте 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)
    
  2. Убедитесь, что LocaleMiddleware активен : LocaleMiddleware автоматически активирует язык на основе префикса URL или заголовка Accept-Language. Убедитесь, что он находится в вашем MIDDLEWARE:

    .
    MIDDLEWARE = [
        ...
        'django.middleware.locale.LocaleMiddleware',  # After SessionMiddleware and CommonMiddleware
        ...
    ]
    
  3. Отметьте строки для перевода в ваших представлениях: Используйте gettext или gettext_lazy, чтобы отметить строки, которые нуждаются в переводе. Например:

    from django.utils.translation import gettext as _
    
    def my_view(request):
        output = _("Hello, world!")
        return Response({"message": output})
    
  4. Генерировать и компилировать файлы перевода:

    • Запустите django-admin makemessages -l ml для генерации .po файлов для малаялам.
    • Отредактируйте .po файлы, чтобы добавить переводы.
    • Запустите django-admin compilemessages для компиляции .po файлов в .mo файлы.

Вот и все, я думаю!

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