Django:使用gettext翻译URL模式

4

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

from django.utils.translation import ugettext as _

urlpatterns = patterns('',
    ...
    url(r'^%s$' % _('about/'), about, name='about'),
    ...
)

起初,似乎以与项目的其余部分采用统一的方式国际化URL是一个好主意,但我有疑虑。
据我所知,URL模式是在应用程序启动时加载的。因此,我怀疑它们将根据首次请求应用程序的用户的语言偏好进行构建。当线程也加入进来时,这可能会变得更加不可预测。
这种方法对于安装在单一语言中的情况可能是合理的,但可能会有其他安装在其他语言中的情况,例如论坛应用程序。
你认为这是一个问题还是只是我的想象?这种方法可以用于多语言站点吗?ugettext_lazy能避免这个问题吗?
4个回答

3

1

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

只有当调用它们的上下文可以访问用户的语言偏好设置时,翻译才能起作用。

为了使您的URL支持多语言,您必须使用一些运行时URL定义。这些将根据用户当前的语言加载。


这种方法在例如OSQA中实际可行,但他们的假设是整个项目将使用单一语言。当站点语言不是英语时,URL将使用其他语言,当然要提供翻译。模型无法访问请求的上下文,但使用gettext_lazy字段名称、help_text属性等进行翻译可以正常工作。但对于URL来说,我想这样做不行。 - onurmatik
你对模型的理解是正确的。但是当你执行'/' + gettext_lazy('Label')时,gettext_lazy()方法的结果会立即被评估。 - Dimitry
问题是,当应用程序代码首次评估或线程被生成时,您是否进行翻译?在前一种情况下,您可能正在翻译应用程序。在后一种情况下,您可能会根据用户选择的语言在运行时进行翻译。 - Dimitry

0
你可以这样做:
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='...'),

但是它仍然容易出错....

保罗


0

当连接字符串时,ugettext_lazy 会立即进行评估,您是正确的。

类似这样的东西可以工作:url(_(r'^contact/'),include('contact.urls'))

但是,您必须翻译可能有误的模式。


我正在寻找一些东西来检查它是否会出错。是否可能处理每个模式? - Natim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接