【问题标题】:Django makemessages ignore switch doesn't work for meDjango makemessages ignore switch 对我不起作用
【发布时间】:2011-11-26 07:42:33
【问题描述】:

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

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

我在templates 目录和myapp 目录中有要本地化的字符串。 当我从项目目录运行python manage.py makemessages -l en --ignore django\* 时,它会爬过 all 项目的目录,包括 django,所以我得到了一个相当大的 po 文件。我模板中的字符串以及 django 目录中的所有字符串都在那里。

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

【问题讨论】:

    标签: django django-nonrel


    【解决方案1】:

    问题出在模式上——也许 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 - 是的,但有一个简单的解决方法。我会更新我的答案。
    • 这如何与多个忽略模式一起工作? i=['admin*', 'colorful*', 'css*'] 例如?
    • @gabn88 - 是的,就像命令行选项--ignore=PATTERN,可以多次指定,使用多个不同的模式来忽略。
    • 好的,谢谢。奇怪的是,我首先尝试了 i='excep1', i='excep2' 但这没有用(不能分配多次)。但是 i=['excep1', 'excep2'] 确实有效,谢谢! :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多