Django:国际路线

Django: international routes

我的路线是这样的:

from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
]
urlpatterns += i18n_patterns(
    url(r'^{0}/'.format(_('produits')),
        include('produits.urls', namespace="produits")
        ),
)

我认为 format(_('produits')) 会自动适应,所以我制作了两个 .po 文件:

makemessages -l en
makemessages -l fr

在英文 .po 文件中,我已经更改了:

#: .\pyweb\urls.py:31
msgid "produits"
msgstr "products"

然后我重新启动了网络服务器,我仍然有:

我做错了什么?

试着这样想:

from django.conf import settings
from django.utils import translation
...    
for lng in settings.LANGUAGES:
    lng_code = lng[0]
    with translation.override(lng_code):
        urlpatterns += i18n_patterns(
            url(r'^{0}/'.format(_('produits')),
            include('produits.urls', namespace="produits")
            )
        )

当您使用 .format() 时,延迟翻译的字符串会在导入时立即计算。您想要一个带有延迟翻译字符串的单一模式作为正则表达式。这意味着您必须翻译整个正则表达式。

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
]
urlpatterns += i18n_patterns(
    url(_(r'^produits/'),
        include('produits.urls', namespace="produits")
        ),
)

这样,正则表达式模式将根据请求的当前语言而改变,因为惰性翻译仅在您使用 resolve()reverse().

时评估

您必须将完整的正则表达式添加到您的 .po 文件中:

#: .\pyweb\urls.py:31
msgid "^produits/"
msgstr "^products/"