django-admin makemessages:如何与txt,xml和其他文件一起使用?

时间:2019-04-05 10:12:40

标签: python django internationalization

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

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

文档说:

  

makemessages :在当前目录的整个源代码树上运行并提取   删除所有标记为要翻译的字符串

此外,docs指出默认文件扩展名是:html, txt, py并给出了一个示例,该文件具有明确定义的扩展名:

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

我的问题是:makemessages应该如何与txtxml这样的非编译文件一起使用?我该如何在这样的文件中标记要翻译的字符串

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

.html

{% trans "Text to be translated" %}

.py

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

但是其他扩展呢? .txt .xml ? ...最后是 .vue

2 个答案:

答案 0 :(得分:1)

makemessages命令搜索要翻译的文件,然后调用(x)gettext utility提取标记为翻译的字符串。取决于您告诉它使用django还是djangojs --domain,它的行为会有所不同。

使用django域时,它将通过.py运行非django.utils.translation.templatize文件,以“将Django模板转换为xgettext可以理解的东西”)。基本上,除了词法分析器确定与XXXXX相关的部分之外,整个文件都变成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不会对文件执行任何此类预处理。 (对于早于gettext的{​​{1}}的版本,0.18.3会调用makemessages,它的攻击性较小,并且在必要时仅调整任何转义/正则表达式语法)。

如果您运行django.utils.jslex.prepare_js_for_gettext,则Django会告诉makemessages -a -d djangojs -e "js,vue"使用--language=JavaScript和一定数量的额外{{1来解析您的xgettext.js文件}}配置以支持.vue--keyword等(对于gettext_noopgettext_lazy默认为gettext中的keywordspec)。 _, gettext, dgettext:2, dcgettext:2, ngettext:1,2, dngettext:2,3, pgettext:1c,2, dpgettext:2c,3还将传递JavaScriptmakemessages参数。

然后要根据这些规范以及自己对基于指定的--from-code=UTF-8的文件的理解,--add-comments=Translators进行解析。

因此,使用gettext翻译--language.txt等文件的最佳选择是使用.xml域,并根据makemessages看一下在djangojs上,因此您可以像对JavaScript一样标记字符串。

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

或者您甚至可以customize makemessages根据您的要求将不同的参数传递给gettext

因此,以您的Vue示例为例...

如果您的--language=JavaScript文件在javascript代码段中包含对gettext的调用(模板属性内的.vue调用似乎没有进行默认解析等),您应该发现gettext将提取这些字符串以进行翻译(gettext将在编辑makemessages文件后生成所需的二进制文件。)

然后,为了在代码运行时查看翻译,您需要使用Django JavaScript Catalog,因此请确保在代码中包含类似compilemessages的内容,以便.po等功能实际上存在。 (听起来您已经知道了,但出于完整性考虑,将其包括在内。)

在您的<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>文件中,您可以使用类似以下内容的文件:

gettext

-应该根据Django翻译机制当前激活的语言礼貌来翻译字符串。

答案 1 :(得分:0)

如果您希望这些文件的内容是动态的,那么您需要对它们进行某种形式的解析过程。

您绝对没有理由不将其视为Django模板,无法通过常规的Django模板渲染过程进行渲染。显然,不知道您对这些文件的处理方式是不可能的,不能为您提供具体建议,但是您可能要使用render_to_string。就其本身而言,这与翻译或消息无关。