我为某些语言设置了翻译的网址。默认语言 对于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"),
答案 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的覆盖上下文管理器。但没有更长的方法可以做同样的事情。