1

我正在使用国际化。

所以,当我访问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/

如何做到这一点?

4

3 回答 3

0

为了使所描述的行为起作用,当前语言必须以sessioncookie. 当使用 Django 的set_language重定向视图来切换语言时,它会注意:

set_language带有重定向视图的语言切换器

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

文档中的示例语言切换器:

要求django.core.context_processors.i18ninTEMPLATE_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>

在每个请求上显式保留请求页面的语言

另一种选择是显式设置它,尽管这必须在每个请求中完成(可能在自定义中间件中),以便保证获取用户手动更改语言前缀时可能发生的每个地址更改浏览器的地址栏。(在比较普通DjangoDjango CMS设置时,我注意到 Django CMS 支持开箱即用的行为,因此查看他们的 repo 以了解他们是如何做到的可能是一个想法。)

于 2015-01-13T00:42:55.393 回答
0

您遇到的是您的语言选择没有按照应有的方式进行,因此要执行此操作需要检查一些事项。

我的猜测是您在设置中将“en”作为您的 LANGUAGE_CODE,因此这将永远是您的后备。很多时候,你不能让你的语言坚持下去的原因是你的设置 MIDDLEWARE_CLASSES 中可能没有正确的中间件。

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

  • 在您的设置中将 SessionMiddleware 和 LocaleMiddleware 添加到您的中间件堆栈,确保 SessionMiddleware 位于 LocaleMiddleware 之前,因为它依赖于会话的使用,并且它负责通过 url/session/cookie/request 标头从请求中获取您想要的语言我相信,如果一切都失败了,那么使用你的后备语言。

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

这应该有望解决问题,因此希望有所帮助。

于 2015-01-13T02:08:11.497 回答
0

问题是 Django 没有添加 request.session['django_language'] = 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]

但是,该代码在检查 if 时存在问题language_code == settings.LANGUAGE_CODE。如果我输入http://localchost:8000,它不会重定向,而是提供一个带有翻译的页面settings.LANGUAGE_CODE而不是request.session.get('django_language'). 据我了解,我无法访问请求,那该怎么办?

于 2015-01-13T20:17:06.830 回答