django翻译了网址和接受语言标题

时间:2012-06-29 05:56:37

标签: django localization translation

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

如果您请求页面/注册/使用nl-NL作为Accept-Language 标题,我得到404。 我没想到会有这样的行为。相反,我希望我会 重定向到/ registratie /,与我对应的翻译网址 Accept-Language标头。 Ofcourse / registratie /使用nl-Nl Accept-Language标题,有效 很好,给了我预期的200。

我猜这是正常的吗?

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

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

有没有办法解决这个问题或以更好的方式处理它?<​​/ p>

我的urls.py文件中的摘录,显示了我如何设置已翻译的网址:

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

1 个答案:

答案 0 :(得分:2)

我在假设_是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的覆盖上下文管理器。但没有更长的方法可以做同样的事情。