make-сообщения django-admin: как это работает с txt, xml и другими файлами? - PullRequest
1 голос
/ 05 апреля 2019

Я нахожусь в процессе перевода приложения Django.У меня есть переводимые строки в файлах с определенными расширениями (файлы .vue, но это пока не очень важно).

Мне нужно запустить команду makemessages, чтобы проанализировать эти строки и сгенерировать файлы .po.

Документация гласит:

makemessages : работает по всему исходному дереву текущего каталога и извлекает все строки , помеченные для перевода .

Кроме того, в документах указано, что расширения файлов по умолчанию: html, txt, py, и приведен пример с явно определенными расширениями:

django-admin makemessages --locale=de --extension=html,txt --extension xml

MyВопрос в том, как makemessages должен работать с не скомпилированными файлами, такими как txt и xml?Как бы я пометил строку для перевода в таких файлах?

Я знаю, как это сделать в шаблоне или в файле .py:

.html

{% trans "Text to be translated" %}

.py

gettext("Text to be translated")
# or
_("Text to be translated")

Но как насчет других расширений? .txt , .xml ?... и в итоге .vue ?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Команда 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.

0 голосов
/ 05 апреля 2019

Если вы хотите, чтобы любое содержимого этих файлов было динамическим, вам нужно провести их через какой-то процесс синтаксического анализа.

Нет абсолютно никаких причин, по которым вы не могли быt рассматривать их как шаблоны Django и обрабатывать их с помощью обычного процесса отрисовки шаблонов Django;очевидно, не зная, что вы делаете с этими файлами, невозможно дать вам конкретный совет, но вы можете использовать render_to_string.Само по себе это не имеет ничего общего с переводом или makemessages.

...