Django: i18n - 更改语言

13
我安装了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/ 进行语言切换,但在切换到另一个页面时,语言会回到默认语言。 我应该怎么办?

5个回答

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

好的,语言改变了,但是URL始终为“ru”,并且不会更改为“uk” =( - Taras
请使用 translation.LANGUAGE_SESSION_KEY 作为会话密钥。 - Shih-Wen Su

6

我曾经遇到过同样的问题,原因是next参数前缀带有旧语言代码,这会阻止新语言生效。(感谢@Pedro的答案提供了线索)。

为了解决这个问题,如果你在模板中使用{{ request.path }}{{ request.get_full_path }}(或者根本没有设置),以便重定向到相同的翻译版本,则必须指定下一个参数,并按以下方式切割语言代码。其余部分保持不变,如文档所述

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

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


3

使用Torsten发布的代码,您的URL不会更改,因为“next”始终是类似于*/ru/*other/urls的内容。它永远不会是None(实际上上面的两个if是无用的)。您的语言更改是由于set_cookietranslation.activate。但是,当您在英文站点中单击任何其他链接时,语言将返回到ru。

您可以尝试Django中的set_language内置视图,如此处所述,或通过尝试一些替换或类似的方法来处理“next”字符串。


0
你可以尝试这个。这段代码将使用GET请求运行。
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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接