【问题标题】:django translated urls and accept-language headerdjango 翻译的 url 和接受语言头
【发布时间】:2012-06-29 05:56:37
【问题描述】:

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

如果您请求页面 /registration/ 使用 nl-NL 作为 Accept-Language 标题,我得到一个 404。 我没想到会有这样的行为。相反,我希望我会 重定向到 /registratie/ ,对应我的翻译后的 url 接受语言标题。 当然 /registratie/ 带有 nl-Nl Accept-Language 标头,有效 很好,给了我预期的 200。

我猜这很正常吗?

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

如果用户的语言设置不受支持会怎样? 将使用 django 默认 LANGUAGE_CODE,在我的情况下是 en-US 吗?

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

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

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

【问题讨论】:

  • 最好不要翻译网址。

标签: django localization translation


【解决方案1】:

我假设 _ 是 ugettext_lazy。

如果用户的语言设置不受支持会怎样?将使用 django 默认 LANGUAGE_CODE,在我的情况下为 en-US 吗?

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

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

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

嗯,是的,我认为这应该是一个受支持的功能,但快速查看源代码后,似乎必须对 URL 解析进行一些更改以适应这一点。

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

在你的 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 中的覆盖上下文管理器。但如果没有,还有更长的方法可以做到这一点。

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2014-07-05
    • 2012-02-15
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    相关资源
    最近更新 更多