django-admin makemessages --no-obsolete似乎没有工作

时间:2018-03-17 16:37:17

标签: django django-admin django-management-command makemessages

首先,如果--no-obsolete被删除,我希望msgid会注明msgstrgettext,对吗?

我的测试方法是:

  1. 我在视图中写了gettext("some string here")
  2. 我跑了makemessages命令
  3. 它按预期编写了.po个文件
  4. 然后我从视图和已保存的文件中删除了gettext()行,验证了runserver正常工作。
  5. 我运行makemessages --no-obsolete并且没有对.po文件进行任何更改。
  6. .po文件内容提取。

    #. Translators: This message is a test of wrap line
    #: servers/views.py:31
    msgid "Do let me know if it works."
    msgstr ""
    

    开发环境

      

    Django = 1.11
      OS = Mac / Ubuntu 14.04

    settings.py

    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    LOCALE = (
          os.path.join(os.path.dirname(__file__), "locale"),
    )
    

3 个答案:

答案 0 :(得分:1)

--no-obsolete的作用是在po文件的内容上运行名为msgattrib的命令,并使用--no-obsolete选项。一个典型的例子是你用makemessages生成你的po文件,你得到这个:

#: servers/views.py:31
msgid "Do let me know if it works."
msgstr ""

然后你翻译:

#: servers/views.py:31
msgid "Do let me know if it works."
msgstr "translation"

然后你删除了gettext条目,默认情况下它仍然保留翻译,但是将其标记为过时。

#: servers/views.py:31
#~msgid "Do let me know if it works."
#~msgstr "translation"

如果你设置了--no-obsolete选项,那么一旦你的po文件完成,它就会运行带有no-obsolete选项的msgattr。这将删除标有#〜的行。见manually

但是,makemessages的构建方式是,一旦写入po文件就会调用它。但是如果正在处理的文件中没有gettext,那么它就不会写入po文件。它在到达这个msgattrib命令之前就停止了。您看到的po文件是由之前的makemessages命令生成的文件。所以没有过时的人不会做任何事情。

对此没有真正的解决方案。没有过时的选项不会处理你没有任何gettext要处理的情况。

答案 1 :(得分:1)

所以我认为@JulienGrégoire是正确的,如果没有处理翻译,那么--no-obsolete将无效。需要至少为--no-obsolete捕获一个翻译才能工作。

但解决这个问题非常简单。您可以更新settings.py以定义LANGUAGES,如下所示

from django.utils.translation import ugettext_lazy as _
LANGUAGES = (
    ('en', _('English')),
    ('fr', _('French')),
)

现在,您的settings将始终生成翻译。因此,每次使用时都会确保--no-obsolete正常工作

答案 2 :(得分:1)

现在在Julien和Tarun的帮助下,我发现了以下观察结果。

python manage.py makemessages -l <locale>

如果正在处理的文件中没有gettext,则上述命令不会write/update .po文件。这意味着如果之前相应的.po文件具有msgstrmsgid的条目,则除非正在处理的文件至少有一个gettext,否则它不会删除这些条目。

  

注意:以上行为与--no-obsolete

无关

现在,为了使--no-obsolete按预期工作,我们需要按照以下步骤操作。

  1. 首先运行python manage.py makemessages -l <locale>,这会写.po文件msgidmsgstr

  2. 现在设置msgstr并运行python manage.py compilemessages -l <locale>。此命令将.mo文件写入与.po文件相同的目录中。

  3. 现在,下次再次运行makemessages时(没有--no-obsolete ),.po.mo文件会被比较并丢失/ deleted gettext.po文件中发表了评论。

  4. 当您运行makemessages --no-obsolete时,评论的条目将从.po文件中删除。
  5. E.g

    如果您有3个gettext条目,并且第一次运行makemessages,则会在msgid文件中写入3 msgstr和3 .po。现在,如果删除所有gettext条目,则在再次运行.po之后将不会更新makemessages文件,但如果您在同一文件中保留至少1 gettext个条目,再次运行makemessages,它会删除已删除的msgid条目的所有msgstrgettext

    但如果您在compilemessages之后运行makemessages,则会创建.mo文件,然后为后续makemessages个命令.po.mo文件创建比较后,msgidmsgstr.po文件中对已删除的gettext条目进行了评论。

    最后,当您使用makemessages选项运行--no-obsolete时,.po文件中的评论消息将被永久删除。