在django中翻译模块(app)名称

时间:2011-09-01 09:45:46

标签: python django

我正在尝试翻译我的django项目中的应用程序名称,我在网上找到了这个代码:

init.py

from django.utils.translation import gettext_noop
gettext_noop("AppName")

模板

{% trans app.name %}

然而在django的当前版本中存在这个代码,所以我想在django 1.3中已经有了这样做的方法,(上面的代码是从2008开始)..请告知如何将名称转换为翻译文件< / p>

{% for app in app_list %}
{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}

这也告诉我,这应该已经可以了:

django / contrib / admin / sites.py第356行

            if app_label in app_dict:
                app_dict[app_label]['models'].append(model_dict)
            else:
                app_dict[app_label] = {
                    'name': app_label.title(),
                    'app_url': app_label + '/',
                    'has_module_perms': has_module_perms,
                    'models': [model_dict],
                }

1 个答案:

答案 0 :(得分:0)

关于blocktrans,你误解了传入的值是如何工作的。如果你有这样的话:

{% blocktrans with foo=bar %}-- {{ foo }} --{% endblocktrans %}

这大致相当于Python中的以下任何一种:

gettext('-- %(foo)s --') % {'foo': bar}
gettext('-- {foo} --').format(foo=bar)

重要的是app.name不会被翻译。它在翻译后逐字传递。翻译目录中的msgid将为"-- %(foo)s --"(因为它将其转换为Python格式以进行翻译查找)。

{% trans app.name %}可以使用,但它不会将应用名称带到manage.py makemessages的翻译目录中,因为后者只是扫描代码以静态地计算出那里的内容。如果你在Python代码中执行类似gettext(app.name)的操作,它将无法确定它应该放在目录中的内容,因为它没有评估代码,只是静态地分析它。

最后的总结是,使用gettext_noop是使消息显示在翻译目录中的正确方法。 makemessages并不是为了自己的利益而过于聪明,而是留给你。

与故障单3591相关的是ticket 1668,虽然已经过时,但如果你还没有,你的阅读可能是值得的(你可能已经完成了,因为你遇到了3591)。