Django:国际航线

时间:2015-08-01 08:31:51

标签: django django-urls django-i18n

我的路线是这样的:

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"

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

  • http://localhost:8000/en/produits/ - >确定
  • http://localhost:8000/en/products/ - >页面未找到

我做错了什么?

2 个答案:

答案 0 :(得分:0)

使用.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/"

答案 1 :(得分:-1)

尝试以这种方式思考:

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")
            )
        )