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

django-admin makemessages --no-obsolete doesn't seem to be working

首先,如果删除gettext,我预计--no-obsolete会注释掉msgidmsgstr,对吗?

我的测试方式是:

  1. 我在视图
  2. 中写了gettext("some string here")
  3. 我运行makemessages命令
  4. 它按预期写了一个 .po 文件
  5. 然后我从视图中删除了 gettext() 行并保存了文件,验证 runserver 工作正常。
  6. I 运行 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 ""

开发环境

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"),
)

--no-obsolete 所做的是 运行 一个名为 msgattrib 的命令,在 po 文件的内容上带有 --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 文件完成,它将 运行 msgattr 与 no-obsolete 选项。这将删除标有#~ 的行。参见 https://linux.die.net/man/1/msgattrib

但是,构建 makemessages 的方式是,一旦写入 po 文件就会调用它。但是如果正在处理的文件中没有gettext,那么它不会写入po文件。它会在到达此 msgattrib 命令之前停止。你看到的po文件就是前面makemessages命令生成的。所以 no-obsolete 不会做任何事情。

对此没有真正的解决方案。 no-obsolete 选项不处理您没有任何要处理的 gettext 的情况。

所以我认为@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 每次使用它时都能正常工作

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

python manage.py makemessages -l <locale>

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

Note: Above behavior is irrespective of --no-obsolete

现在要使 --no-obsolete 正常工作,我们需要执行以下步骤。

  1. 第一件事 运行 python manage.py makemessages -l <locale>,这将用 msgidmsgstr 写入 .po 文件。

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

  3. 下次当你再次运行 makemessages时(没有--no-obsolete),.po.mo 文件进行比较,missing/deleted gettext.po 文件中进行注释。

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

E.g

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

但是如果您在 makemessages 之后 运行 compilemessages 创建了 .mo 文件,然后对于后续的 makemessages 命令 .po.mo 文件进行比较,然后在 .po 文件中注释 msgidmsgstr 以删除 gettext 条目。

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