Django translation.activate() - где это сделать и как отладить?
У меня есть сайт с несколькими языками. Однако эти языки НИКОГДА не должны выбираться посетителем, вместо этого они либо а) определяются на основе доменного имени (один и тот же сайт работает под разными доменами, по одному для каждого языка), либо б) извлекаются из базы данных, в зависимости от того, какая именно страница была открыта.
Из manual я понимаю, что должен использовать функцию django.utils.translation.activate() для явной установки языка. Однако у меня ничего не получается.
Если я прав, вот код, который мне нужен (мне не нужно устанавливать cookies, поэтому я выделил именно это):
from django.utils import translation
translation.activate("fr")
Правильно ли это? Где именно я должен это разместить? Могу ли я использовать фреймворк сайтов для привязки языка к конкретному языку? Вот что я попробовал в своем файле views.py, но это не работает. Ошибки нет - просто нет перевода. Есть ли способ отладить это, чтобы понять, где происходит ошибка?
# views.py
from .models import *
from django.shortcuts import render
from django.utils import translation
from django.conf import settings
# I am trying to activate a default setting for the site, based on the domain of the site
if settings.SITE_ID == 1:
translation.activate("fr")
else:
translation.activate("en")
def homepage(request)
return render(request, "index.html")
def listing(request, id)
listing = Listing.objects.get(pk=id)
language = listing.language
translation.activate(language) # For particular pages, I need a different language, based on a value from the database. This is what I tried.
return render(request, "index.html")
Согласно вашему сценарию использования, лучшее место для использования translation.activate()
- это некоторое промежуточное ПО, поскольку язык зависит от сайта/домена.
Когда вы делаете:
# views.py
from .models import *
from django.shortcuts import render
from django.utils import translation
from django.conf import settings
# I am trying to activate a default setting for the site, based on the domain of the site
if settings.SITE_ID == 1:
translation.activate("fr")
else:
translation.activate("en")
Вызов осуществляется при разборе модуля, а не при выполнении и обработке HTTP-запроса.
С помощью промежуточного ПО можно выбрать нужную локаль следующим образом:
# middlewares.py
def site_locale_middleware(get_response):
def middleware(request):
if request.site.id == 1:
translation.activate("fr")
elif request.site.id == 2:
translation.activate("es")
else:
translation.activate("en")
response = get_response(request)
return response
return middleware
И добавьте это в настройках:
MIDDLEWARES = [
"django.contrib.sites.middleware.CurrentSiteMiddleware""",
# your middleware should be placed after CurrentSiteMiddleware
# so that request.site is available
"yourproject.middlewares.site_locale_middleware",
]
Это обеспечит правильную настройку языка для каждого сайта, и вы можете переопределить ее, когда это необходимо с помощью:
def listing(request, id)
listing = Listing.objects.get(pk=id)
language = listing.language
with translation.override(language):
# using override here is important, because it means it will only override
# the language when the response is rendered, and revert back to the previous language afterwards
return render(request, "index.html")