为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2021-12-29 20:31:09
我正在翻译 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" %}.pygettext("Text to be translated")# or_("Text to be translated")但是其他扩展呢?.txt,.xml?...最终.vue?
查看完整描述

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 翻译机制当前激活的语言礼貌来翻译字符串。


查看完整回答
反对 回复 2021-12-29
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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

绝对没有理由不能将它们视为 Django 模板并通过正常的 Django 模板渲染过程来渲染它们;显然,在不知道您对这些文件做了什么的情况下,不可能给您具体的建议,但您可能想要使用render_to_string. 就其本身而言,这与翻译或生成消息没有任何关系。


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 366 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信