4

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

from django.utils.translation import ugettext as _

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

起初,将国际化 URL 与项目的其他部分统一起来似乎是一个好主意,但我对此表示怀疑。

AFAIK,URL 模式在应用程序启动时加载。所以我怀疑它们将根据向应用程序发出第一个请求的用户的语言偏好来构建。当线程也在起作用时,这可能会变得更加不可预测。

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

你认为这是一个问题还是只是我的想象?这种方法可以用于多语言网站吗?能ugettext_lazy避免这个问题吗?

4

4 回答 4

3

阅读 django 文档:https ://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

基本上,您可以使用 ugettext_lazy 来翻译您的模式,并且只要为每个请求都设置了语言,它就会起作用。为确保这一点,您应该使用 LocaleMiddleware。https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware

于 2014-03-01T01:55:54.110 回答
1

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

仅当调用它们的上下文可以访问用户的语言首选项时,翻译才起作用。

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

于 2011-03-06T23:26:02.043 回答
0

连接字符串时立即评估 ugettext_lazy 是对的。

像这样的作品: url(_(r'^contact/'), include('contact.urls')),

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

于 2012-10-26T14:29:23.290 回答
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='...'),

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

保罗

于 2017-07-24T14:39:19.663 回答