Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django显示msgid而不是msgstring_Python_Django_Gettext - Fatal编程技术网

Python Django显示msgid而不是msgstring

Python Django显示msgid而不是msgstring,python,django,gettext,Python,Django,Gettext,我已在设置中正确设置了LOCALE\u路径 LANGUAGE\u code设置为it 作为测试,我将应用程序翻译成的唯一语言是it 在我的一个视图中,我有{%trans“my_MESSAGE_ID”%},在django.po中,我有 msgid "MY_MESSAGE_ID" msgstr "It is working" 如果使用it语言的访问者打开应用程序,他会看到“它正在工作” 如果使用en语言的访问者打开应用程序,他会看到“我的消息ID” Django应从不向最终用户显示msgid。D

我已在设置中正确设置了
LOCALE\u路径

LANGUAGE\u code
设置为
it

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

在我的一个视图中,我有
{%trans“my_MESSAGE_ID”%}
,在
django.po
中,我有

msgid "MY_MESSAGE_ID"
msgstr "It is working"

如果使用
it
语言的访问者打开应用程序,他会看到
“它正在工作”

如果使用
en
语言的访问者打开应用程序,他会看到
“我的消息ID”

Django应从不向最终用户显示
msgid
。Django应该将第一个可用的翻译作为后备翻译,特别是如果我用
LANGUAGE\u code
定义它的话。有什么方法可以实现这种行为吗


我了解到,这个问题的解决方案是使用
“It is working”
作为消息id。出于以下原因,我认为这个解决方案是不可接受的:

  • 进行
    en
    翻译是没有用的,因为消息ID是 翻译本身已经完成了

  • 某些消息ID将非常长

  • “消息id”指的是必须与语言无关的东西

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


  • 与其他许多人一样,Django在内部使用
    gettext
    ;类似地,
    .mo
    .po
    格式属于它们的实用程序,并由它们产生。如果未将完整消息用作
    msgid
    ,则未使用
    gettext
    的全部功能

    例如,参见glibc的文档:

    提要
    #包括
    char*gettext(const char*msgid);
    char*dgettext(const char*domainname,const char*msgid);
    char*dcgettext(const char*domainname,const char*msgid,
    国际贸易类别);
    
    描述 gettext、dgettext和dcgettext函数试图通过查找将文本字符串翻译成用户的母语 邮件目录中的翻译

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

    此外,GNUgetText还提供了实用工具
    msgen
    ,该工具

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


    此外,
    gettext
    实用程序可以为新消息找到模糊匹配,这将加快翻译速度,还可以在翻译过期时通知并标记为重新翻译。如果在模板中使用无意义的消息ID,这是不可能的

    您是否已将default.po编译成具有正确路径的英文译本?否。有意提供的英文译本不可用。我想看看Django在用户语言的翻译不可用时的行为。它应该始终提供翻译,而不是消息ID。我编译的唯一翻译是“It”。我还可以编译“en”。如果德国用户打开网站怎么办?根据当前行为,它将显示消息ID,而不是退回到默认语言。的可能重复项
    #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);