6

首先,我希望--no-obsolete会注释掉msgidmsgstr如果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 ""

开发环境

Django = 1.11
操作系统 = Mac/Ubuntu 14.04

设置.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"),
)
4

3 回答 3

3

现在在 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>,这将使用and写入.po文件。 msgidmsgstr

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

  3. 现在下次makemessages再次运行时(不带 --no-obsolete),比较文件.po并在文件中注释.mo丢失/删除的文件。 gettext.po

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

E.g

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

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

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

于 2018-03-20T18:52:50.153 回答
1

--no-obsolete 所做的是在 po 文件的内容上运行带有 --no-obsolete 选项的名为 msgattrib 的命令。一个典型的例子是你用 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。这将删除带有#~ 标记的行。见https://linux.die.net/man/1/msgattrib

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

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

于 2018-03-19T21:50:56.280 回答
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每次使用它时都能正常工作

于 2018-03-20T07:01:00.500 回答