首先,如果--no-obsolete
被删除,我希望msgid
会注明msgstr
和gettext
,对吗?
我的测试方法是:
gettext("some string here")
makemessages
命令.po
个文件gettext()
行,验证了runserver
正常工作。 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"),
)
答案 0 :(得分:1)
--no-obsolete的作用是在po文件的内容上运行名为msgattrib的命令,并使用--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文件完成,它就会运行带有no-obsolete选项的msgattr。这将删除标有#〜的行。见manually
但是,makemessages的构建方式是,一旦写入po文件就会调用它。但是如果正在处理的文件中没有gettext,那么它就不会写入po文件。它在到达这个msgattrib命令之前就停止了。您看到的po文件是由之前的makemessages命令生成的文件。所以没有过时的人不会做任何事情。
对此没有真正的解决方案。没有过时的选项不会处理你没有任何gettext要处理的情况。
答案 1 :(得分: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
正常工作
答案 2 :(得分:1)
现在在Julien和Tarun的帮助下,我发现了以下观察结果。
python manage.py makemessages -l <locale>
如果正在处理的文件中没有gettext
,则上述命令不会write/update
.po
文件。这意味着如果之前相应的.po
文件具有msgstr
和msgid
的条目,则除非正在处理的文件至少有一个gettext
,否则它不会删除这些条目。
注意:以上行为与
无关--no-obsolete
现在,为了使--no-obsolete
按预期工作,我们需要按照以下步骤操作。
首先运行python manage.py makemessages -l <locale>
,这会写.po
文件msgid
和msgstr
。
现在设置msgstr
并运行python manage.py compilemessages -l <locale>
。此命令将.mo
文件写入与.po
文件相同的目录中。
现在,下次再次运行makemessages
时(没有--no-obsolete ),.po
和.mo
文件会被比较并丢失/ deleted gettext
在.po
文件中发表了评论。
makemessages --no-obsolete
时,评论的条目将从.po
文件中删除。 E.g
如果您有3个gettext
条目,并且第一次运行makemessages
,则会在msgid
文件中写入3 msgstr
和3 .po
。现在,如果删除所有gettext
条目,则在再次运行.po
之后将不会更新makemessages
文件,但如果您在同一文件中保留至少1 gettext
个条目,再次运行makemessages
,它会删除已删除的msgid
条目的所有msgstr
和gettext
。
但如果您在compilemessages
之后运行makemessages
,则会创建.mo
文件,然后为后续makemessages
个命令.po
和.mo
文件创建比较后,msgid
和msgstr
在.po
文件中对已删除的gettext
条目进行了评论。
最后,当您使用makemessages
选项运行--no-obsolete
时,.po
文件中的评论消息将被永久删除。