2

我在 django 做一个项目。该应用程序必须根据子域显示不同的图像和语言。例如:www.mysite.com 将是英文的默认页面,但如果子域是 mx.mysite.com,则语言必须是西班牙语。

有了 django-hosts,我可以使每个子域重定向到不同的 django-app,并且效果很好。问题是我只想为所有不同的子域制作一个应用程序,只更改语言。

我认为可以在视图中获取子域并根据子域使用语言呈现模板。但是我不知道该怎么做,请帮忙。

这是我的 DJANGO HOSTS.PY,其中主机“www”和“mx”重定向到同一个应用程序“mysite”,但必须使用不同的语言。

from django.conf import settings
from django_hosts import patterns, host

host_patterns = patterns('',
    host(r'www', 'mysite.urls', name='www'),
    host(r'help', 'help.urls', name='help'),
    host(r'mx', 'mysite.urls', name='mx'),
)
4

1 回答 1

1

一般解决方案

这是一个通用解决方案,它适用于任何受支持的语言代码并且没有 django-hosts 包。

编写一个自定义中间件,它检查子域,然后使用子域中的语言设置会话变量 LANGUAGE_SESSION_KEY(或由 LANGUAGE_COOKIE_NAME 在 settings.py 中定义的 cookie。默认名称是 django_language。)。

自定义中间件:(您可以将其保存为与 settings.py 相同的文件夹中的 middleware.py)

from django.conf import settings
from django.utils.translation import LANGUAGE_SESSION_KEY


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

    def __call__(self, request):
        host = request.get_host()

        # Parse language code from the host
        lang = host.split('.')[0]

        if lang == 'www':
           lang = 'en'

        # If requested language is in the languages supported by django,
        # language_session_key session variable is populated with the
        # supported language code.
        for django_language in settings.LANGUAGES:
            if django_language[0] == lang or django_language[0].endswith('-%s' % lang):
                request.session[LANGUAGE_SESSION_KEY] = django_language[0]
                break

        response = self.get_response(request)
        return response

在 settings.py 中的 session 和 locale 中间件之间安装这个中间件

    'django.contrib.sessions.middleware.SessionMiddleware',
    #...
    # put the middleware here (change projectname to your project's name)
    'projectname.middleware.SetLanguageFromSubdomain',
    #...
    'django.middleware.locale.LocaleMiddleware',

有关 django 如何发现语言偏好的更多信息:https ://docs.djangoproject.com/en/2.2/topics/i18n/translation/#how-django-discovers-language-preference

django 支持的语言:https ://github.com/django/django/blob/master/django/conf/global_settings.py

有关如何使 Django 项目可翻译的更多信息:https ://docs.djangoproject.com/en/2.2/topics/i18n/translation/

有关编写自定义中间件的更多信息:https ://docs.djangoproject.com/en/2.2/topics/http/middleware/

于 2019-02-12T10:26:39.963 回答