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")
Вернуться на верх