Django makemessages忽略开关对我不起作用

时间:2011-09-27 18:58:08

标签: django django-nonrel

我在部署到GAE的django-nonrel项目时遇到了问题。由于GAE,我必须将所有内容放入我的项目文件夹中,所以它看起来像这样

project
  + django
  + dbindexer
  + registration
  + myapp
  ...
  + locale
  + templates

我有templates目录和myapp目录中的字符串。 当我从项目目录运行python manage.py makemessages -l en --ignore django\*时,它会爬过所有项目的目录,包括django,所以我得到了一个非常大的po文件。我从模板中找到了我的字符串,以及来自django目录的所有字符串。

在--ignore(或者只是-i)之后我尝试了pu django django/*,但没有任何改变。 有任何想法吗?

2 个答案:

答案 0 :(得分:17)

./ manage.py help makemessages

-i PATTERN, --ignore=PATTERN
                        Ignore files or directories matching this glob-style
                        pattern. Use multiple times to ignore more.

我刚测试过,这个命令成功地忽略了我的应用程序:

./ manage.py makemessages -l da -i“django *”

但要注意,在测试之前,你应该删除旧的.po文件,因为我认为它不会自动删除你以前的makemessages执行中的翻译行。

答案 1 :(得分:2)

问题在于模式 - 也许shell正在为你扩展它。

一般情况下 - 最好避免模式中的路径分隔符(无论是/或\)。

如果您需要始终将特定选项传递给makemessages命令,您可以考虑使用自己的包装器,就像我自己使用的那样:

from django.conf import settings
from django.core.management.base import BaseCommand
from django.core.management import call_command

class Command(BaseCommand):
    help = "Scan i18n messages without going into externals."

    def handle(self, *args, **options):
        call_command('makemessages',
            all=True,
            extensions=['html', 'inc'],
            ignore_patterns=['externals*'])

这可以节省您的输入,并为整个项目扫描消息提供了一个通用的入口点(您的翻译同事不会通过遗漏某些参数来破坏翻译)。

一旦您从完全不需要的邮件(即来自'django'目录的邮件)中清除了它,就不要删除旧的.po文件。这允许gettext重新使用旧的未使用的消息(或类似的消息,将被标记为#, fuzzy

编辑 - 正如mt4x所说 - 上面的包装器不允许将选项传递给包装命令。这很容易解决:

from django.conf import settings
from django.core.management.base import BaseCommand
from django.core.management import call_command
from django.core.management.commands.makemessages import Command as MakeMessagesCommand

class Command(BaseCommand):
    help = "Scan i18n messages without going into externals."
    option_list = MakeMessagesCommand.option_list

    def handle(self, *args, **options):
        options['all'] = True
        options['extensions'] = ['html', 'inc']
        options['ignore_patterns'] = ['externals*']
        call_command('makemessages', **options)

因此 - 您可以修复需要修复的内容,并对其余部分进行修改。 这不需要像上面那样盲目覆盖,而且还需要对传递给命令的参数进行一些条件编辑 - 将某些内容附加到列表中或仅在缺少时添加它。