Django显示msgid而不是msgstring

时间:2015-03-05 20:01:03

标签: python django gettext

我已在我的设置中正确设置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。我认为这个解决方案由于以下原因是不可接受的:

  • 制作en翻译将毫无用处,因为消息ID是 已经是翻译本身。

  • 有些邮件ID会非常长。

  • “消息ID”指的是必须与语言无关的内容。

  • 如果我想更改默认语言,我必须重新编写整个应用程序文本内容。

1 个答案:

答案 0 :(得分:2)

Django和许多其他人一样在内部使用gettext;同样,.mo.po格式属于并由其实用程序生成。如果您未将完整邮件用作gettext,则未充分使用msgid的强大功能。

参见glibc的文档:

  

概要

#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);
     

说明

     

gettext,dgettext和dcgettext函数尝试通过查找将文本字符串转换为用户的母语   消息目录中的翻译。

     

msgid参数标识要翻译的消息。 按照惯例,它是消息的英文版本   非ASCII字符替换为ASCII近似值。此选项允许翻译人员使用包含每个消息的英语和翻译版本的消息目录(称为PO文件),并且可以   使用msgfmt实用程序安装。

此外,使用GNU gettext来实用程序msgen,即

  

创建英语翻译目录。输入文件是最后创建的英文PO文件,或PO模板文件(通常由xgettext创建)。未翻译的条目被分配了与msgid相同的翻译。

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