Django国际化/翻译不适用于动态生成的URL

时间:2015-09-29 23:37:11

标签: python django internationalization translation django-urls

我遇到了双语网站的问题,我无法在任何其他问题中找到答案。所以,我已经连接了一个表单和显示系统,它严重依赖于给每个模型的详细名称。详细的名称已被翻译,因此我们的想法是,所有内容都可以在该基础上运行。所以,例如,我的产品/ models.py中有一个模型:

from django.utils.translation import ugettext_lazy as _

class ProductType(models.Model):
    description = models.CharField(max_length=250)
    ...

    class Meta:
        verbose_name = _('Ürün Tipi')
        verbose_name_plural = _('Ürün Tipleri')

从那里,我创建基于类的表单和视图。然后,我通过导入视图并在urls.py中循环遍历来创建URL(我将只关注此示例中的一个URL):

from django.conf.urls import patterns, url
from .views import editing_views

editing_patterns = []
for view in editing_views:
    list_view = view['list']
    slug = slugify(list_view.model._meta.verbose_name)
    editing_patterns.append(
        url(_(r'{0}/list/$').format(slug), list_view.as_view(), name='{0}-list'.format(slug))
    )
    ...

urlpatterns = patterns('products.views',
    *editing_patterns
)

正如您所看到的,url和url名称都来自模型的详细版本的详细名称,该名称已被翻译。当网站设置为英语时,一切正常。但是当它设置为土耳其语时,系统找不到翻译的网址:

Reverse for 'urun-tipi-list' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

现在奇怪的是,当我将此文件中的url模式导入django shell时,无论网站设置的语言是什么,我都会获得土耳其语名称:

<RegexURLPattern urun-tipi-list urun-tipi/list/$>

现在,也许这只是Django shell的一些奇怪,但我也在urls.py文件的末尾将模式打印到控制台,主要问题似乎是运行时的url是英文的,无论网站设置为什么:

product-type/list/$

但很明显,verbose_name转换工作正常,因为这是我们将urun-tipi-list打印在模板的{%url%}标签中的位置。

如果它有用,我会提供一些关于国际化设置的更一般的信息。

在settings.py中

TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.i18n',
...
)

MIDDLEWARE_CLASSES = (
...
'django.middleware.locale.LocaleMiddleware',
...
)

USE_I18N = True

LANGUAGES = [
  ('tr', _('Turkish')),
  ('en', _('English')),
]

LOCALE_PATHS = (
    'locale',
)

在运行命令行之后,生成的.po文件对于这个特定的详细名称具有以下内容:

/ EN

#: products/models.py:14
msgid "Ürün Tipi"
msgstr "Product Type"

/ TR

#: products/models.py:14
msgid "Ürün Tipi"
msgstr "Ürün Tipi"

如果你问我很神秘,但任何帮助都会受到赞赏。

0 个答案:

没有答案