2 回答
TA贡献1816条经验 获得超6个赞
该makemessages命令搜索要翻译的文件并调用(x)gettext实用程序来提取标记为翻译的字符串。根据您是否告诉它使用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比 更早的版本0.18.3,makemessages会调用django.utils.jslex.prepare_js_for_gettext,这有点不那么激进,并且在必要时只调整任何转义/正则表达式语法)。
如果你运行makemessages -a -d djangojs -e "js,vue",Django会告诉xgettext解析您.js和.vue处理文件--language=JavaScript和额外一定数量的--keyword配置来支持gettext_noop,gettext_lazy等(gettext默认为一keywordspec的_, 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指定的文件对文件进行自己的理解。
因此,翻译.txt、.xml等文件的最佳选择makemessages是使用djangojs域并查看gettext基于 的内容--language=JavaScript,因此您可以像对 JavaScript 一样标记字符串。
或者对于 Jinja2 模板等,您可以使用替代解决方案,例如Babel's Message Extraction
或者您甚至可以自定义makemessages以gettext根据您的要求传递不同的参数。
所以对于你的 Vue 例子......
如果你的.vue文件中包含的调用gettextJavaScript代码段(默认解析似乎没有拿起gettext模板属性中调用等),你会发现,makemessages将提取这些字符串翻译(和compilemessages将生成后所需的二进制文件.po文件编辑)。
然后,为了在代码运行时查看翻译,您需要使用Django JavaScript Catalog,因此请确保<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>在代码中包含类似的内容,以便gettextetc 函数实际存在。(听起来您已经有了这个,但为了完整起见,将其包括在内。)
在您的.vue文件中,您可以使用以下内容:
<script> // trick to ensure xgettext doesn't omit the code below: </closetag>
data(){
const _ = gettext;
// gettext default JavaScript keywordspec includes "_" shortcut
// and should extract the strings below by default
// -- or you could just use gettext('my string') directly
return {
heading: _('This is my translatable heading'),
button_text: _('Click here'),
}
}
</script>
<template>
<h1>{{ heading }}</h1>
<button type="button">{{ button_text }}</button>
</template>
-- 应根据 Django 翻译机制当前激活的语言礼貌来翻译字符串。
TA贡献1898条经验 获得超8个赞
如果您希望这些文件的任何内容是动态的,那么您需要对它们进行某种解析过程。
绝对没有理由不能将它们视为 Django 模板并通过正常的 Django 模板渲染过程来渲染它们;显然,在不知道您对这些文件做了什么的情况下,不可能给您具体的建议,但您可能想要使用render_to_string
. 就其本身而言,这与翻译或生成消息没有任何关系。
添加回答
举报