2

我已经为某些语言设置了翻译的网址。django 的默认语言已设置为 en-US。

如果您请求使用 nl-NL 作为 Accept-Language 标头的页面 /registration/,我会收到 404。我没想到会出现这种行为。相反,我希望我会被重定向到 /registratie/ ,这是与我的 Accept-Language 标头相对应的翻译后的 url。当然 /registratie/ 带有 nl-Nl Accept-Language 标头,可以正常工作并给我预期的 200。

我猜这和它一样正常吗?

用户是否有可能从某个网站获得链接并且该链接是为英语构建的,但是有问题的用户具有不同的受支持语言设置 Accept-Language 标头?在这种情况下,他会看到一个 404。如果支持,他应该看到英语(默认)内容,或者重定向到他的语言的正确 url。

如果用户的语言设置不受支持,还会发生什么?在我的情况下会使用 django 默认值LANGUAGE_CODE吗?

有没有办法解决这个问题或以不同的更好的方式处理它?

来自我的 urls.py 文件的摘录,显示了我如何设置翻译后的 url:

url(_(r'^step1/$'), AccountTypeSelectionView.as_view(), name="registration_step1"),
4

1 回答 1

2

我在做一个疯狂的假设,即 _ 是 ugettext_lazy。

如果用户的语言设置不受支持,还会发生什么?在我的情况下会使用 django 默认 LANGUAGE_CODE 吗?

是的,如果未设置特定值,则 ugettext 将使用默认值。您可以在 django.utils.translation.trans_real 的 do_translate 中看到这种行为。

ugettext_lazy 发生的情况是,在查找 URL 之前,将其翻译为用户的语言,然后根据所有这些检查 URL 的一部分。(Django 使用每个线程的语言设置,该设置已更改以反映用户的选择。)

用户是否有可能从某个网站获得链接并且该链接是为英语构建的,但是有问题的用户具有不同的受支持语言设置 Accept-Language 标头?在这种情况下,他会看到一个 404。如果支持,他应该看到英语(默认)内容,或者重定向到他的语言的正确 url。

嗯,是的,我认为这应该是一个受支持的功能,但快速查看源代码后发现 URL 解析必须稍作更改以适应这一点。

您可以做的是使用自定义 404 页面(如在自定义错误视图下简要提到的)

在你的 urls.py 中:

handler404 = 'mysite.views.i18n_retry'

并且在一个视图中

from django.utils.translation import override
from django.core.urlresolvers import resolve
def i18n_retry(request):
    for language in settings.LANGUAGES:
        with override(language, deactivate=True):
           try:
              result = resolve(request.path)
              #here you will know what language the url is in
              #if it is a supported format
              #and can do something smart about it
           except Http404:
              #Http404 is thrown whenever resolving fails
              pass
     #here you should probably return a real 404

我使用了 Django 1.4 中的覆盖上下文管理器。但是如果没有,还有更长的方法可以做到这一点。

于 2012-07-09T17:37:32.847 回答