【问题标题】:Django: i18n - change languageDjango:i18n - 更改语言
【发布时间】:2011-07-26 06:22:53
【问题描述】:

我正在安装 model_translation、rosetta、locale_url。但更改语言不起作用。

我的设置.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/语言切换,但切换到另一个页面时- 语言回到默认语言。 我该怎么办?

【问题讨论】:

    标签: django internationalization


    【解决方案1】:

    将 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' =(
    • 使用translation.LANGUAGE_SESSION_KEY 作为会话密钥。
    【解决方案2】:

    使用 Torsten 发布的代码,您的 URL 不会改变,因为“下一个”总是类似于 */ru/*other/urls。它永远不会是 None (实际上上面的两个 if 是没用的)。由于set_cookietranslation.activate,您的语言会发生变化。但是,当您点击网站中的任何其他英文链接时,该语言将变回 ru。

    您可以尝试来自 django 的 set_language 内置视图,就像 here 解释的那样,或者通过尝试一些替换或类似的方法来处理“下一个”字符串。

    【讨论】:

      【解决方案3】:

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

      要解决这个问题,如果您使用模板中的{{ request.path }}{{ request.get_full_path }}(或根本没有设置)重定向到相同的翻译版本,那么您必须指定下一个,对语言代码进行切片如下。其余的保持为the docs say

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

      我发布了answer 对此进行了更详细的解释并提供了两个功能示例。

      【讨论】:

        【解决方案4】:

        你可以试试这个。此代码将与获取请求一起使用

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-07
          • 2012-04-04
          • 1970-01-01
          • 2015-10-28
          相关资源
          最近更新 更多