【问题标题】:Django: URL pattern translation with gettextDjango:使用 gettext 进行 URL 模式翻译
【发布时间】:2011-07-10 00:02:50
【问题描述】:

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

from django.utils.translation import ugettext as _

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

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

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

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

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

【问题讨论】:

    标签: django gettext url-pattern


    【解决方案1】:

    阅读 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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这种方法实际上适用于例如OSQA,但他们的假设是我猜整个项目将使用一种语言。当站点语言与英语不同时,URL 使用另一种语言,当然前提是它们具有翻译。模型无法访问请求的上下文,但具有gettext_lazy 字段名称、help_text 属性等的翻译效果很好。但对于 URL,我想这不会。
      • 您对模型的看法是正确的。但是当你执行 '/' + gettext_lazy('Label') 时,gettext_lazy() 方法的结果会立即被评估。
      • 问题是,您是在首次评估应用程序代码时还是在产生线程时进行翻译?在前一种情况下,您可能正在翻译应用程序。在后一种情况下,您可能在运行时翻译用户选择的语言。
      【解决方案3】:

      你说得对 ugettext_lazy 在连接字符串时立即被评估。

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

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

      【讨论】:

      • 我正在寻找一些东西来检查它不会出错。是否可以处理所有模式?
      【解决方案4】:

      你可以这样做:

      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='...'),
      

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

      保罗

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多