首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-admin makemessages:它如何处理txt、xml和其他文件?

django-admin makemessages:它如何处理txt、xml和其他文件?
EN

Stack Overflow用户
提问于 2019-04-05 10:12:39
回答 2查看 2.3K关注 0票数 4

我正在翻译Django应用程序。在具有特定扩展名的文件(.vue文件,但这一点目前并不十分重要)中有可翻译的字符串。

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

文件上说:

makemessages:在当前目录的整个源树上运行,并取出标记为的所有字符串

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

代码语言:javascript
复制
django-admin makemessages --locale=de --extension=html,txt --extension xml

我的问题是:makemessages应该如何处理像txtxml这样的非编译文件?我将如何将字符串标记为在这样的文件中翻译?

我知道如何在模板或.py文件中这样做:

.html

代码语言:javascript
复制
{% trans "Text to be translated" %}

.py

代码语言:javascript
复制
gettext("Text to be translated")
# or
_("Text to be translated")

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

EN

回答 2

Stack Overflow用户

发布于 2019-07-01 23:11:31

makemessages命令搜索要翻译的文件,并调用实用程序提取标记为转换的字符串。根据您告诉它使用django还是djangojs --domain,它的行为将有所不同。

在使用django域时,它通过django.utils.translation.templatize运行非.py文件,以“将Django模板转换为xgettext理解的内容”)。它基本上将整个文件转换为XXXXX,而不依赖于lexer确定的与gettext相关的部分,这使得行号保持不变,等等。

代码语言:javascript
复制
>>> 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_noopgettext_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文件中,您可以使用以下内容:

代码语言:javascript
复制
<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的翻译机制中当前激活的语言进行翻译。

票数 8
EN

Stack Overflow用户

发布于 2019-04-05 13:23:55

如果您希望这些文件的任何内容是动态的,那么您需要让它们通过某种解析过程。

您完全没有理由不能将它们视为Django模板,并通过普通的Django模板来呈现它们;显然,如果不知道您对这些文件做了什么,就不可能给出具体的建议,但您可能需要使用render_to_string。就其本身而言,这与翻译或制造无关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55533125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档