django-admin makemessages --no-obsolete似乎不起作用

Kis*_*war 5 django django-admin django-management-command makemessages

首先,我期待--no-obsolete会注释掉msgid,msgstr如果gettext被删除,对吧?

我的测试方法是:

  1. gettext("some string here")在视野中 写道
  2. 我跑了makemessages命令
  3. .po按预期编写了一个文件
  4. 然后我gettext()从视图中删除了行并保存了文件,验证了runserver工作.
  5. 我跑了makemessages --no-obsolete,它没有对.po文件进行任何更改.

.po 文件内容提取.

#. Translators: This message is a test of wrap line
#: servers/views.py:31
msgid "Do let me know if it works."
msgstr ""
Run Code Online (Sandbox Code Playgroud)

开发环境

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"),
)
Run Code Online (Sandbox Code Playgroud)

Kis*_*war 3

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

python manage.py makemessages -l <locale>

gettext如果正在处理的文件中没有,则上述命令不会write/update .po归档。这意味着如果相应的.po文件之前有msgstr和 的条目msgid,那么它不会删除这些条目,除非正在处理的文件至少有一个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的文件。 .mogettext.po

  4. 当您运行时makemessages --no-obsolete,注释条目将从文件中删除.po

E.g

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

但是,如果您compilemessages在 后 运行makemessages.mo则会创建文件,然后对后续makemessages命令.po.mo文件进行比较,然后msgid在文件中对已删除的条目msgstr进行注释。.pogettext

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