Django:i18n - 改变语言

时间:2011-03-30 17:05:19

标签: 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')),
)

我对语言切换的看法:

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

在模板中:

<a href="{% url set_lang %}?lang=uk&next={{request.path}}">Ukranian</a>

我的中间件:

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',
)

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

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

要解决此问题,如果您正在使用模板中的{{ request.path }}{{ request.get_full_path }}(或根本不设置它)重定向到相同的翻译版本,那么您必须指定下一个,切片语言代码如下。其余的仍然是the docs say

<input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />

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

答案 2 :(得分:3)

使用Torsten发布的代码,您的网址不会更改,因为“下一个”将始终类似* / ru / *其他/网址。它永远不会是无(实际上,如果上面的两个是无用的)。由于set_cookietranslation.activate,您的语言会发生变化。但是当您用英语点击网站中的任何其他链接时,语言将返回到ru。

你可以尝试使用django中的set_language内置视图,就像解释here一样,或者通过尝试替换或类似的事情来处理'next'字符串。

答案 3 :(得分:0)

你可以试试这个。此代码适用于get request

def set_language(request):
    from django.utils.translation import activate
    lang_code = request.GET.get('language', 'en')
    lang = get_language()
    if not lang_code:
        lang_code = request.GET.get('lang_code', settings.LANGUAGE_CODE)
    next_url = request.META.get('HTTP_REFERER', '')
    if not is_safe_url(url=next_url, host=request.get_host()):
        next_url = '/'
    response = HttpResponseRedirect(next_url)
    if lang_code and check_for_language(lang_code):
        if hasattr(request, 'session'):
            request.session['django_language'] = lang_code
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
        activate(lang_code)
    return response

或者您可以使用构建的语言选项。这将适用于POST请求 https://docs.djangoproject.com/en/dev/topics/i18n/translation/#django.views.i18n.set_language