python - django-admin makemessages : how does it work with txt, xml 和其他文件?

标签 python django vue.js internationalization gettext

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

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

文档说:

makemessages: Runs over the entire source tree of the current directory and pulls out all strings marked for translation.

此外,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

最佳答案

makemessages命令搜索要翻译的文件并调用 (x)gettext utility提取标记为翻译的字符串。它的行为会有所不同,具体取决于您是否告诉它使用 djangodjangojs --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 不会对文件执行任何此类预处理。 (对于早于 gettext0.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,3JavaScript )。 makemessages也会通过--from-code=UTF-8--add-comments=Translators论据。

然后就到了gettext根据这些规范进行解析,并根据--language自己对文件的理解指定。

因此,翻译 .txt 是您的最佳选择, .xml等带有 makemessages 的文件是使用djangojs域名,看看有什么 gettext根据 --language=JavaScript 拾取,因此您可以像 JavaScript 一样标记字符串。

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

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

对于你的 Vue 示例...

如果您的.vue文件包含对 gettext 的调用在 javascript 代码部分(默认解析似乎无法识别模板属性中的 gettext 调用等),您应该发现 makemessages将提取这些字符串进行翻译(并且 compilemessages 将在编辑 .po 文件后生成所需的二进制文件)。

然后,为了在代码运行时查看翻译,您需要使用 Django JavaScript Catalog ,因此请确保包含类似 <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 翻译机制当前激活的语言进行翻译。

关于python - django-admin makemessages : how does it work with txt, xml 和其他文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533125/

相关文章:

Django - 无法让时间函数(时区、日期时间)正常工作,获取 ErrorName 消息 : global name not defined

django - 通过HTTPS重新访问开发服务器报错 "You',但只支持HTTP”

django - 如何在序列化程序中获取字段值

javascript - 仅将新记录追加到表vue js

python - data.norm() < 1000 在 PyTorch 中做什么?

python - 使用逻辑表达式和 if 语句评估 pandas 系列值

javascript - Vue.js 如何在计算属性中设置观察者?

javascript - Vue.js 将函数传递给 Prop 不起作用

python - 计时由在 python 中调用的批处理文件启动的进程

python - 这是 Python 中的鸭子类型(duck typing)吗?