Django的makemessages忽略开关对我无效

22

我有一个部署在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)之后,我尝试添加djangodjango/*,但没有任何变化。任何想法?
2个回答

35

./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执行中删除翻译行。


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*'])

这样可以节省您的打字时间,并为项目提供一个通用的消息扫描入口(您的翻译同事不会因漏掉某些参数而破坏翻译)。
一旦您从完全不需要的消息中清除了旧的 .po 文件(即来自“django”目录的消息),请勿删除它。这允许gettext回收旧的未使用的消息,一旦它们再次被使用(或类似的消息,将被标记为#,fuzzy)。 编辑 - 如mt4x所指出的那样 - 上面的包装器不允许传递选项到包装的命令。这很容易修复:
from django.core.management import call_command
from django.core.management.commands.makemessages import (
    Command as MakeMessagesCommand
)

class Command(MakeMessagesCommand):
    help = "Scan i18n messages without going into externals."
    
    def handle(self, *args, **options):
        options['all'] = True
        options['extensions'] = ['html', 'inc']

        if 'ignore_patterns' not in options:
            options['ignore_patterns'] = []

        options['ignore_patterns'] += ['externals*']
        call_command('makemessages', **options)

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

这样做不允许使用标准的 makemessages 选项,例如 --domain--locale 和其他选项,除非创建更多的包装器或手动添加选项。我说得对吗? - m4tx
@m4tx - 是的,但是这个问题有一个简单的解决方法。我会更新我的答案。 - Tomasz Gandor
这个在多个忽略模式下如何工作?例如:i=['admin*', 'colorful*', 'css*']。 - gabn88
@gabn88 - 是的,就像命令行选项 --ignore=PATTERN 一样,可以指定多次使用多个不同的模式来忽略。 - Tomasz Gandor
好的,谢谢。奇怪的是,我最初尝试了i='excep1',i='excep2',但那样不起作用(无法多次分配)。但是i=['excep1','excep2']确实有效,谢谢! :) - gabn88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接