Djangoadmin makemessages:它如何处理txt、xml和其他文件?

2024-04-23 09:08:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在翻译一个Django应用程序。我在特定扩展名(.vue文件)的文件中有可翻译字符串,但现在这不是很重要。在

我必须运行makemessages命令来解析这些字符串并生成.po文件。在

文件上说:

makemessages: Runs over the entire source tree of the current directory and pulls out all strings marked for translation.

另外,docs声明默认文件扩展名为:html, txt, py,并给出了一个显式定义扩展名的示例:

django-admin makemessages --locale=de --extension=html,txt --extension xml

我的问题是:makemessages应该如何处理非编译文件,比如txt和{}?如何在这样的文件中标记要翻译的字符串?在

我知道如何在模板或.py文件中执行此操作:

.html

^{pr2}$

.py

gettext("Text to be translated")
# or
_("Text to be translated")

但是其他的扩展呢?.txt.xml。。。最终.vue?在


Tags: 文件thetodjango字符串textpytxt
2条回答

如果您希望这些文件的任何内容都是动态的,那么您需要对它们进行某种解析。在

绝对没有理由不能将它们视为Django模板,并通过正常的Django模板呈现过程呈现它们;显然,如果不知道如何处理这些文件,就不可能给出具体的建议,但您可能需要使用render_to_string。就其本身而言,这与翻译或生成消息没有任何关系。在

makemessages命令搜索要翻译的文件,并调用^{} utility来提取标记为要翻译的字符串。根据您告诉它使用django还是djangojs domain,它的行为会有所不同。在

当使用django域时,它通过django.utils.translation.templatize运行非.py文件来“将Django模板转换成xgettext可以理解的东西”)。它基本上将整个文件转换为XXXXX,lexer确定与gettext相关的部分除外,这样可以保持行号不变,等等

>>> from django.utils.translation import templatize
>>> content = """This is a {% trans "test" %}!
... {# Translators: these comments remain intact for translators #}
... {% blocktrans %}Only applies to  domain=django and non-.py files {% endblocktrans %}
... 
... Everything else is {# ignored #}
... {% trans "EOM" %}
... :)"""
>>> print(templatize(content))
XXXX XX X  gettext(u'test') X
# Translators: these comments remain intact for translators
 gettext(u'Only applies to  domain=django and non-.py files ') SSSS SSSSSSS SS SSSSSSSSSSSSSSS SSS SSSSSSS SSSSS 

XXXXXXXXXX XXXX XX 
 gettext(u'EOM') 
XX
>>> 

因此,对于大多数非Python、非Django模板文件,这将删除您的可翻译内容。在

使用djangojs域时,Django不会对文件执行任何此类预处理。(对于gettext0.18.3旧的版本,makemessages将调用django.utils.jslex.prepare_js_for_gettext,这有点不那么激进,如果需要,只会调整任何转义/regex语法)。在

如果运行makemessages -a -d djangojs -e "js,vue",Django将告诉xgettext使用^{}和一定数量的额外 keyword配置来解析你的.js和{}文件,以支持gettext_noopgettext_lazy等(gettext默认为_, gettext, dgettext:2, dcgettext:2, ngettext:1,2, dngettext:2,3, pgettext:1c,2, dpgettext:2c,3的{}对于JavaScript)。makemessages还将传递 from-code=UTF-8 add-comments=Translators参数。在

然后由gettext根据这些规范进行解析,并根据指定的 language来理解文件。在

因此,用makemessages翻译.txt.xml等文件的最佳方法是使用djangojs域,并查看gettext基于{}得到什么,这样就可以像JavaScript一样标记字符串了。在

或者对于Jinja2模板等,您可以使用另一种解决方案,例如Babel's Message Extraction

或者您甚至可以customize ^{}根据您的需求将不同的参数传递给gettext。在

对于你的Vue例子。。。在

如果您的.vue文件包含在javascript代码部分中对gettext的调用(默认解析似乎不适用于模板属性中的gettext调用),您应该发现makemessages将提取这些字符串进行翻译(并且compilemessages将在编辑.po文件后生成所需的二进制文件)。在

然后为了在代码运行时查看翻译,您需要使用Django JavaScript Catalog,因此请确保在代码中包含类似<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>的内容,以便gettextetc函数实际存在。(听起来您已经有了这个,但为了完整起见,还包括在内。)

在您的.vue文件中,您可以使用如下内容:

^{pr2}$

字符串应该根据Django翻译机制当前激活的语言规范进行翻译。在

相关问题 更多 >