Как изменить префикс языка на сохраненный пользователем предпочтительный язык

Я работаю над многоязычным проектом Django и использую i18n для этого, то, что я хочу сделать, это хранить предпочитаемый пользователем язык, я уже сделал это и добавил поле языка в модель User, поэтому мой подход к решению этой проблемы заключался в создании промежуточного ПО для изменения предпочитаемого пользователем языка:

from Django.utils import translation

class LanguageMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        if request.user.is_authenticated and request.user.language:
           translation.activate(request.user.language)
        else: 
            translation.activate(translation.get_language())
        
        
        response = self.get_response(request)
        return response

и я установил язык пользователя на 'ar', но если я пытаюсь войти с URL

 127.0.0.1:8000/en

это не работает, как ожидалось, и дает мне следующее

1.ar/
The current path, en/, didn’t match any of these.

но я хочу перенаправить его на этот 127.0.0.1:8000/ar либо с этого 127.0.0.1:8000 либо с этого 127.0.0.1:8000/en и, конечно, это будет основано на предпочитаемом языке, а если пользователь не аутентифицирован, это будет просто основано на данных о языке в запросе, как я могу это сделать, пожалуйста?

Судя по сообщению об ошибке, у вас нет шаблона в файле urls.py, поэтому вам нужно добавить интернализацию, как в примере в документации: https://docs.djangoproject.com/en/4.1/topics/i18n/translation/#django.conf.urls.i18n.i18n_patterns

Тогда все страницы, с разным языком префикса, но одинаковой частью после, будут "перенаправлены" на один и тот же вид.

Вам следует изменить язык в request.path_info и (опционально) перенаправить:

import re

from django.shortcuts import redirect
from django.utils import translation


class LanguageMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.user.is_authenticated and request.user.language:
            language = request.user.language
        else:
            language = translation.get_language()

        if not request.path_info.startswith(f'/{language}'):
            language_from_path = translation.get_language_from_path(request.path_info)
            if language_from_path:
                return redirect(re.sub(f'^/{language_from_path}', f'/{language}', request.path_info))
            return redirect(f'/{language}{request.path_info}')

        response = self.get_response(request)
        return response
Вернуться на верх