【问题标题】:django-admin makemessages --no-obsolete doesn't seem to be workingdjango-admin makemessages --no-obsolete 似乎不起作用
【发布时间】:2018-08-26 14:47:08
【问题描述】:

首先,如果gettext 被删除,我希望--no-obsolete 会注释掉msgidmsgstr,对吧?

我的测试方式是:

  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

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

【问题讨论】:

  • 能否请您也添加您的环境设置?什么 Django 版本?您使用的是哪个操作系统?
  • @TarunLalwani 请查看更新
  • 你能不能也加你settings.py文件?
  • 设置文件中的具体内容是什么?我没有更改任何默认设置。
  • 所有与语言环境相关的东西

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


【解决方案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>,这将使用msgidmsgstr 写入.po 文件。

  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

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

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

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

【讨论】:

    【解决方案2】:

    --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 的情况。

    【讨论】:

    • 我需要做什么才能获得--no-obsolete 效果?
    • 你还需要在某个地方有一个 gettext
    • 我试图在另一个视图中的同一个文件中有另一个 gettext。没有影响
    • @JulienGrégoire,我只是在我的笔记本电脑上测试了这个,你的观察似乎不是真的。当我使用--no-obsolete 运行时,数据实际上已从po 文件中删除。如果没有--no-obsolete,它会被评论为#~,而使用--no-obsolete,它会从文件中删除字符串
    • @TarunLalwani 你能列出步骤/过程吗?
    【解决方案3】:

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

    【讨论】:

    • Tarun,你能写下步骤吗?或者确认一下,我在问题中提到的步骤是正确的。
    • 是的,LANGUAGES 在我的设置中。我忘了在这里添加。
    • 你是否像我在LANGUAGES 值中那样使用_
    • 是的。我愿意。但只有设置。在我仅使用gettext 的视图中
    • 请像这样运行python manage.py makemessages --no-obsolete --all,看看它是否有帮助。我已经对gettext_ 进行了测试,对我来说效果很好
    猜你喜欢
    • 2015-10-24
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多