【问题标题】:Django translation.activate() - where to do so and how to debug?Django translation.activate() - 在哪里这样做以及如何调试?
【发布时间】:2021-10-09 17:30:41
【问题描述】:

我有一个包含多种语言的网站。但是,这些语言绝不应该由访问者选择,而是 a) 根据域名决定(同一站点在不同域下运行,每种语言一个),或 b) 从数据库中检索,具体取决于确切的页面打开了。

manual 我了解到我应该使用 django.utils.translation.activate() 函数来明确设置语言。但是,我没有运气。

如果我是正确的,这就是我需要的代码(我不需要设置cookie,所以这是我隔离的):

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")

【问题讨论】:

    标签: django internationalization


    【解决方案1】:

    根据您的用例,使用 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多