django-admin makemessages --no-obsolete 似乎不起作用
django-admin makemessages --no-obsolete doesn't seem to be working
首先,如果删除gettext
,我预计--no-obsolete
会注释掉msgid
和msgstr
,对吗?
我的测试方式是:
- 我在视图
中写了gettext("some string here")
- 我运行
makemessages
命令
- 它按预期写了一个
.po
文件
- 然后我从视图中删除了
gettext()
行并保存了文件,验证 runserver
工作正常。
- 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
文件之前有 msgstr
和 msgid
的条目,那么它将不会删除这些条目,除非正在处理的文件至少有一个 gettext
。
Note: Above behavior is irrespective of --no-obsolete
现在要使 --no-obsolete
正常工作,我们需要执行以下步骤。
第一件事 运行 python manage.py makemessages -l <locale>
,这将用 msgid
和 msgstr
写入 .po
文件。
现在设置 msgstr
和 运行 python manage.py compilemessages -l <locale>
。此命令将 .mo
文件写入与 .po
文件相同的目录中。
下次当你再次运行 makemessages
时(没有--no-obsolete),.po
和 .mo
文件进行比较,missing/deleted gettext
在 .po
文件中进行注释。
- 当您 运行
makemessages --no-obsolete
时,注释条目将从 .po
文件中删除。
E.g
如果您有 3 个 gettext
条目,并且您是第一次 运行 makemessages
,它会在 [= 中写入 3 msgid
和 3 msgstr
13=] 文件。现在,如果您删除所有 gettext
条目,.po
文件将不会在您再次 运行 makemessages
后更新,但如果您保留至少 1 个 gettext
条目在同一个文件和 运行 makemessages
中,它将删除所有 msgid
和 msgstr
以删除 gettext
条目。
但是如果您在 makemessages
之后 运行 compilemessages
创建了 .mo
文件,然后对于后续的 makemessages
命令 .po
和 .mo
文件进行比较,然后在 .po
文件中注释 msgid
和 msgstr
以删除 gettext
条目。
最后,当您使用 --no-obsolete
选项 运行 makemessages
时,.po
文件中的评论消息将被永久删除。
首先,如果删除gettext
,我预计--no-obsolete
会注释掉msgid
和msgstr
,对吗?
我的测试方式是:
- 我在视图 中写了
- 我运行
makemessages
命令 - 它按预期写了一个
.po
文件 - 然后我从视图中删除了
gettext()
行并保存了文件,验证runserver
工作正常。 - I 运行
makemessages --no-obsolete
并且它没有对.po
文件进行任何更改。
gettext("some string here")
.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
文件之前有 msgstr
和 msgid
的条目,那么它将不会删除这些条目,除非正在处理的文件至少有一个 gettext
。
Note: Above behavior is irrespective of
--no-obsolete
现在要使 --no-obsolete
正常工作,我们需要执行以下步骤。
第一件事 运行
python manage.py makemessages -l <locale>
,这将用msgid
和msgstr
写入.po
文件。现在设置
msgstr
和 运行python manage.py compilemessages -l <locale>
。此命令将.mo
文件写入与.po
文件相同的目录中。下次当你再次运行
makemessages
时(没有--no-obsolete),.po
和.mo
文件进行比较,missing/deletedgettext
在.po
文件中进行注释。- 当您 运行
makemessages --no-obsolete
时,注释条目将从.po
文件中删除。
E.g
如果您有 3 个 gettext
条目,并且您是第一次 运行 makemessages
,它会在 [= 中写入 3 msgid
和 3 msgstr
13=] 文件。现在,如果您删除所有 gettext
条目,.po
文件将不会在您再次 运行 makemessages
后更新,但如果您保留至少 1 个 gettext
条目在同一个文件和 运行 makemessages
中,它将删除所有 msgid
和 msgstr
以删除 gettext
条目。
但是如果您在 makemessages
之后 运行 compilemessages
创建了 .mo
文件,然后对于后续的 makemessages
命令 .po
和 .mo
文件进行比较,然后在 .po
文件中注释 msgid
和 msgstr
以删除 gettext
条目。
最后,当您使用 --no-obsolete
选项 运行 makemessages
时,.po
文件中的评论消息将被永久删除。