Как изменить префикс языка на сохраненный пользователем предпочтительный язык
Я работаю над многоязычным проектом 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