Команда 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
, что несколько менее агрессивно и просто настраивает любой синтаксис escape / regex при необходимости).
Если вы запустите 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 и т. Д. Вы можете использовать альтернативное решение, такое как Извлечение сообщений Бабеля
Или вы можете настроить 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.