Django:i18n - 改变语言

Tar*_*ras 11 django internationalization

我正在安装model_translation,rosetta,locale_url.但是不起作用改变语言.

我的settings.py:

LANGUAGE_CODE = 'ru'
MODELTRANSLATION_TRANSLATION_REGISTRY = "project.translation"
TRANSLATION_REGISTRY = "project.translation"
ugettext = lambda s: s
LANGUAGES = (
    ('ru', ugettext(u'Russian')),
    ('uk', ugettext(u'Ukrainian')),
)
Run Code Online (Sandbox Code Playgroud)

我对语言切换的看法:

def set_language(request):
    next = request.REQUEST.get('next', None)
    if not next:
        next = request.META.get('HTTP_REFERER', None)
    if not next:
        next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'GET':
        lang_code = request.GET.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session['django_language'] = lang_code
            else:
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
    return response
Run Code Online (Sandbox Code Playgroud)

在模板中:

<a href="{% url set_lang %}?lang=uk&next={{request.path}}">Ukranian</a>
Run Code Online (Sandbox Code Playgroud)

我的中间件:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'localeurl.middleware.LocaleURLMiddleware',
    'django.middleware.common.CommonMiddleware',  
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
Run Code Online (Sandbox Code Playgroud)

但语言切换不起作用.如果我打开链接http:// localhost/uk / language开关,但切换到另一个页面时 - 语言又恢复为默认语言.我该怎么办?

Tor*_*cht 8

将translation.activate添加到您的代码中:

from django.utils import translation

def set_language(request):
    next = request.REQUEST.get('next', None)
    if not next:
        next = request.META.get('HTTP_REFERER', None)
    if not next:
        next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'GET':
        lang_code = request.GET.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session['django_language'] = lang_code
            else:
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
            translation.activate(lang_code)
    return response
Run Code Online (Sandbox Code Playgroud)


Cau*_*ons 6

我遇到了同样的问题,因为next参数前面加上旧的语言代码,这可以防止新的代码生效.(感谢@ Pedro的回答,为此提供了线索).

为了解决这个问题,如果你正在使用{{ request.path }}{{ request.get_full_path }}从你的模板(或不设置它在所有)重定向到同一个翻译,那么你必须指定下,切片的语言代码如下.剩下的就像博士所说:

<input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
Run Code Online (Sandbox Code Playgroud)

我发布了一个答案,更详细地解释了这一点并提供了两个功能示例.