我正在翻译Django应用程序。在具有特定扩展名的文件(.vue文件,但这一点目前并不十分重要)中有可翻译的字符串。
我必须运行makemessages命令来解析这些字符串并生成.po文件。
文件上说:
makemessages:在当前目录的整个源树上运行,并取出标记为的所有字符串。
此外,文档声明默认文件扩展名为:html, txt, py,并给出了一个具有显式定义扩展名的示例:
django-admin makemessages --locale=de --extension=html,txt --extension xml我的问题是:makemessages应该如何处理像txt和xml这样的非编译文件?我将如何将字符串标记为在这样的文件中翻译?
我知道如何在模板或.py文件中这样做:
.html
{% trans "Text to be translated" %}.py
gettext("Text to be translated")
# or
_("Text to be translated")但是其他扩展呢?.txt,.xml?最终.vue
发布于 2019-07-01 23:11:31
makemessages命令搜索要翻译的文件,并调用实用程序提取标记为转换的字符串。根据您告诉它使用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不会对文件执行任何这样的预处理。(对于比0.18.3更早的版本,makemessages将调用django.utils.jslex.prepare_js_for_gettext,这在一定程度上不那么咄咄逼人,只需要修改任何转义/regex语法)。
如果运行makemessages -a -d djangojs -e "js,vue",Django将告诉xgettext使用--language=JavaScript解析.js和.vue文件,并使用一定数量的额外--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域翻译makemessages、.xml等文件的最佳方法是使用djangojs域,并查看gettext基于--language=JavaScript获取的内容,这样就可以将字符串标记为JavaScript。
或者对于Jinja2模板等,您可以使用另一种解决方案,如巴贝尔信息提取
或者您甚至可以根据您的需求将不同的参数传递给makemessages。
所以你的Vue例子..。
如果您的.vue文件在javascript代码部分中包含对gettext的调用(默认解析似乎不会在模板属性中获取gettext调用,等等),您应该会发现makemessages将提取这些字符串以进行翻译( compilemessages将在编辑.po文件之后生成所需的二进制文件)。
然后,为了在代码运行时看到翻译,您将需要使用Django JavaScript目录,因此确保在代码中包含类似<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>的内容,以便gettext等函数实际存在。(听起来好像你已经知道了,但为了完整起见包括在内。)
在您的.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的翻译机制中当前激活的语言进行翻译。
发布于 2019-04-05 13:23:55
如果您希望这些文件的任何内容是动态的,那么您需要让它们通过某种解析过程。
您完全没有理由不能将它们视为Django模板,并通过普通的Django模板来呈现它们;显然,如果不知道您对这些文件做了什么,就不可能给出具体的建议,但您可能需要使用render_to_string。就其本身而言,这与翻译或制造无关。
https://stackoverflow.com/questions/55533125
复制相似问题