Django i18n模式

时间:2015-01-12 23:29:33

标签: python django internationalization django-i18n

我正在使用国际化。

因此,当我访问http://localhost:8000/en/http://localhost:8000/de/

时,每个人都可以正常工作

但是当我访问http://localhost:8000/时,即使上次访问的网页为http://localhost:8000/en/

,它也会将我重定向到http://localhost:8000/de/

基本上,我想根据所访问的页面保存语言代码,例如:如果我访问http://localhost:8000/de/那么语言就是德语。接下来,当我访问http://localhost:8000时,它应该指向http://localhost:8000/de/,而不是默认http://localhost:8000/en/

如何做到这一点?

3 个答案:

答案 0 :(得分:0)

为了使所描述的行为有效,当前语言必须保留在sessioncookie中。当使用Django的set_language重定向视图切换语言时,它需要注意:

使用set_language重定向视图

的语言切换器

此视图通过POST请求接收新语言,然后更新会话(或cookie),以便语言首选项保持不变。

来自docs的示例语言切换器:

django.core.context_processors.i18n中需要TEMPLATE_CONTEXT_PREPROCESSORS,而且i18n观看次数位于项目urls.py中。

<form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language">
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
                 {{ language.name_local }} ({{ language.code }})
            </option>
        {% endfor %}
    </select>
    <input type="submit" value="Go" />
</form>

在每个请求中明确保留所请求页面的语言

另一种选择是set it explicitly,尽管这必须在每个请求中完成(可能在自定义中间件中),以便保证在用户手动时可能会发生每次更改地址更改浏览器地址栏中的语言前缀。 (在比较普通的 Django Django CMS 设置时,我注意到Django CMS支持开箱即用的行为,所以看起来可能是一个想法在他们的回购中看看他们是如何做到的。)

答案 1 :(得分:0)

您所遇到的是您的语言选择并没有像现在这样坚持,所以要做的事情有一些需要检查。

我的猜测是,您在设置中将'en'作为LANGUAGE_CODE,这样您的后备将始终如此。通常,您无法坚持使用语言的原因是您的MIDDLEWARE_CLASSES设置中可能没有正确的中间件。

请尝试以下检查清单,看看您是否拥有所需的一切:

  • 在您的设置中将SessionMiddleware和LocaleMiddleware添加到您的中间件堆栈,确保SessionMiddleware位于LocaleMiddleware之前,因为它依赖于会话的使用,并且它负责通过url / session /从请求中获取所需的语言我认为,按照该顺序的cookie /请求标题,如果所有其他方法都失败,则使用您的后备语言。

  • 确保您要提供的所有语言都在设置的LANGUAGES列表中

这应该有希望做到这一点,所以希望有所帮助。

答案 2 :(得分:0)

问题是Django没有添加request.session [&#39; django_language&#39;] = lang_code

我只是扩展语言环境中间件并使用以下代码。

def process_request(self, request):

    if self.is_language_prefix_patterns_used():
        lang_code = (get_language_from_path(request.path_info) or
                     request.session.get('django_language', settings.LANGUAGE_CODE))

        activate(lang_code)
        request.session['django_language'] = lang_code
        request.LANGUAGE_CODE = get_language()

现在,我有以下问题。 我该怎么做呢 http://localhost:8000没有重定向(使用语言代码作为前缀)?

我找到了以下代码:

class NoPrefixLocaleRegexURLResolver(LocaleRegexURLResolver):

@property
def regex(self):
    language_code = get_language()
    if language_code not in self._regex_dict:
        regex_compiled = (re.compile('' % language_code, re.UNICODE)
                          if language_code == settings.LANGUAGE_CODE
                          else re.compile('^%s/' % language_code, re.UNICODE))

        self._regex_dict[language_code] = regex_compiled
    return self._regex_dict[language_code]

但是,检查language_code == settings.LANGUAGE_CODE是否存在代码问题。如果我输入http://localchost:8000,则不会重定向,而是提供包含settings.LANGUAGE_CODE而非request.session.get('django_language')翻译的网页。据我所知,我无法访问请求,所以应该做些什么?