Django:使用gettext进行URL模式转换

Django:使用gettext进行URL模式转换,django,gettext,url-pattern,Django,Gettext,Url Pattern,在一些Django应用程序中,我遇到了使用gettext的URL模式,例如: from django.utils.translation import ugettext as _ urlpatterns = patterns('', ... url(r'^%s$' % _('about/'), about, name='about'), ... ) 起初,与项目的其他部分统一使用国际化URL似乎是个好主意,但我对此表示怀疑 另外,URL模式是在应用程序启动时加载的。因

在一些Django应用程序中,我遇到了使用gettext的URL模式,例如:

from django.utils.translation import ugettext as _

urlpatterns = patterns('',
    ...
    url(r'^%s$' % _('about/'), about, name='about'),
    ...
)
起初,与项目的其他部分统一使用国际化URL似乎是个好主意,但我对此表示怀疑

另外,URL模式是在应用程序启动时加载的。因此,我怀疑它们将根据向应用程序发出第一个请求的用户的语言偏好进行构建。当线程也在游戏中时,这可能变得更加不可预测

这种方法对于安装使用单一语言,但可能有其他语言的安装(如论坛应用程序)的情况可能是合理的


你认为这是个问题还是我的想象?这种方法可以用于多语言网站吗?
ugettext\u lazy
能否避免此问题

这种方法行不通。您的翻译在应用程序加载时进行。这意味着您的URL模式将使用单一语言,即应用程序的默认语言

只有当调用它们的上下文能够访问用户的语言首选项时,翻译才能工作


要使url具有多语言性,必须使用一些运行时url定义。这些将基于用户的当前语言加载。

关于ugettext,您是对的。在连接字符串时,将立即计算lazy

类似的东西:url(r'^contact/),include('contact.url')


但是你必须翻译可能出错的模式。

阅读一下django文档:


基本上,您可以使用ugettext_lazy来翻译您的模式,只要为每个请求设置了一种语言,它就可以工作。为了确保这一点,您应该使用localemidware

您可以这样做:

import six
from django.utils.functional import lazy


def lazy_url_pattern(pattern):
    return lazy(pattern, six.text_type)()
然后在调度程序中:

urlpatterns = [
    url(lazy_url_pattern(lambda: r'^{n}/$'.format(n=ugettext_lazy(u'foo'))), MyView.as_view(), name='...'),
但它仍然容易出错


Paul

例如,这种方法实际上适用于,但他们的假设是,我猜整个项目将使用一种语言。当站点语言与英语不同时,URL使用另一种语言,当然前提是它们有翻译。模型没有访问请求上下文的权限,但是使用
gettext\u lazy
字段名、help\u文本属性等可以很好地翻译。但是对于URL,我想这是不行的。关于模型,你是对的。但是,当您执行“/”+gettext_lazy('Label')时,会立即计算gettext_lazy()方法的结果。问题是,您是在首次计算应用程序代码还是在生成线程时进行翻译?在前一种情况下,您可能正在翻译应用程序。在后一种情况下,您可能正在运行时为用户选择的语言进行翻译。我正在寻找一些东西来检查它是否会出错。是否可以处理每个模式?