在一些Django应用程序中,我遇到了带有gettext的URL模式,例如:
from django.utils.translation import ugettext as _
urlpatterns = patterns('',
...
url(r'^%s$' % _('about/'), about, name='about'),
...
)
首先,与项目的其余部分以统一的方式拥有国际化的URL似乎是一个好主意,但我有疑问。
AFAIK,URL模式在应用程序启动时加载。因此我怀疑它们将根据向应用程序发出第一个请求的用户的语言首选项进行构建。当线程也在游戏中时,这可能变得更加难以预测。
对于安装将使用单一语言但可能还有其他语言的其他安装(如论坛应用程序)的情况,此方法可能是合理的。
你认为这是一个问题还是我的想象力?这种方法可以用于多语言网站吗? ugettext_lazy
可以避免这个问题吗?
答案 0 :(得分: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
答案 1 :(得分:1)
这种方法不起作用。您的翻译在应用程序加载时发生。这意味着您的网址格式将采用单一语言,即您应用的默认语言。
翻译仅在调用它们的上下文可以访问用户的语言首选项时才有效。
要使您的网址更加多语言,您必须使用一些运行时网址定义。这些将根据用户当前的语言加载。
答案 2 :(得分:0)
你是对的,在连接字符串时会立即评估ugettext_lazy。
这样的作品:url(_(r'^ contact /'),include('contact.urls')),
但你必须翻译可能存在错误的模式。
答案 3 :(得分: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='...'),
但它仍然容易出错......
保