Django 显示 msgid 而不是 msgstring

Django showing msgid instead of msgstring

我在设置中正确设置了 LOCALE_PATHS

LANGUAGE_CODE 设置为 it.

作为测试,我将应用程序翻译成的唯一语言是 it

在我的一个观点中,我有 {% trans "MY_MESSAGE_ID" %},在 django.po 中,我有

msgid "MY_MESSAGE_ID"
msgstr "It is working"

如果使用 it 语言的访问者打开应用程序,他会看到 "It is working"

如果使用 en 语言的访问者打开应用程序,他会看到 "MY_MESSAGE_ID"

Django 应该从不 向最终用户显示msgid。 Django 应该提供第一个可用的翻译作为后备, 尤其是 如果我在 LANGUAGE_CODE 中定义它。有什么办法可以实现这种行为吗?


我读到,这个问题的解决方案是使用 "It is working" 作为消息 ID。由于以下原因,我认为此解决方案是不可接受的:

Django 和许多其他的一样在内部使用 gettext;同样,.mo.po 格式属于它们的实用程序并由它们生成。如果您不使用完整消息作为 msgid.

,则您没有使用 gettext 的全部功能

例如,请参阅 glibc 的文档:

SYNOPSIS

#include <libintl.h>

char * gettext (const char * msgid);
char * dgettext (const char * domainname, const char * msgid);
char * dcgettext (const char * domainname, const char * msgid,
                  int category);

DESCRIPTION

The gettext, dgettext and dcgettext functions attempt to translate a text string into the user's native language, by looking up the translation in a message catalog.

The msgid argument identifies the message to be translated. By convention, it is the English version of the message, with non-ASCII characters replaced by ASCII approximations. This choice allows the translators to work with message catalogs, called PO files, that contain both the English and the translated versions of each message, and can be installed using the msgfmt utility.

此外,GNU gettext 附带实用程序 msgen,即

Creates an English translation catalog. The input file is the last created English PO file, or a PO Template file (generally created by xgettext). Untranslated entries are assigned a translation that is identical to the msgid.

此外,gettext 实用程序可以为新消息找到模糊匹配,这将加快翻译工作,并且还会注意到翻译何时过时并将其标记为重新翻译。如果您在模板中使用无意义的消息 ID,这是不可能的。