我正在翻译Django应用。我在特定扩展名的文件(.vue文件中有可翻译的字符串),但是现在还不很重要。
我必须运行makemessages
命令来解析这些字符串并生成.po文件。
文档说:
makemessages :在当前目录的整个源代码树上运行并提取 删除所有标记为要翻译的字符串。
此外,docs指出默认文件扩展名是:html, txt, py
并给出了一个示例,该文件具有明确定义的扩展名:
django-admin makemessages --locale=de --extension=html,txt --extension xml
我的问题是:makemessages
应该如何与txt
和xml
这样的非编译文件一起使用?我该如何在这样的文件中标记要翻译的字符串?
我知道如何在模板或.py文件中执行此操作:
{% trans "Text to be translated" %}
gettext("Text to be translated")
# or
_("Text to be translated")
但是其他扩展呢? .txt , .xml ? ...最后是 .vue ?
答案 0 :(得分:1)
makemessages
命令搜索要翻译的文件,然后调用(x)gettext
utility提取标记为翻译的字符串。取决于您告诉它使用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
的{{1}}的版本,0.18.3
会调用makemessages
,它的攻击性较小,并且在必要时仅调整任何转义/正则表达式语法)。
如果您运行django.utils.jslex.prepare_js_for_gettext
,则Django会告诉makemessages -a -d djangojs -e "js,vue"
使用--language=JavaScript
和一定数量的额外{{1来解析您的xgettext
和.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
等文件的最佳选择是使用.xml
域,并根据makemessages
看一下在djangojs
上,因此您可以像对JavaScript一样标记字符串。
或者对于Jinja2模板等,您可以使用其他解决方案,例如Babel's Message Extraction
或者您甚至可以customize makemessages
根据您的要求将不同的参数传递给gettext
。
因此,以您的Vue示例为例...
如果您的--language=JavaScript
文件在javascript代码段中包含对gettext
的调用(模板属性内的.vue
调用似乎没有进行默认解析等),您应该发现gettext
将提取这些字符串以进行翻译(gettext
将在编辑makemessages
文件后生成所需的二进制文件。)
然后,为了在代码运行时查看翻译,您需要使用Django JavaScript Catalog,因此请确保在代码中包含类似compilemessages
的内容,以便.po
等功能实际上存在。 (听起来您已经知道了,但出于完整性考虑,将其包括在内。)
在您的<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
文件中,您可以使用类似以下内容的文件:
gettext
-应该根据Django翻译机制当前激活的语言礼貌来翻译字符串。
答案 1 :(得分:0)
如果您希望这些文件的内容是动态的,那么您需要对它们进行某种形式的解析过程。
您绝对没有理由不将其视为Django模板,无法通过常规的Django模板渲染过程进行渲染。显然,不知道您对这些文件的处理方式是不可能的,不能为您提供具体建议,但是您可能要使用render_to_string
。就其本身而言,这与翻译或消息无关。