Джанго makemessages javascript (xgettext)

Я хочу использовать поддержку django i18n для перевода моих файлов JavaScript. У меня есть следующий файл JavaScript:

var test_text = gettext('example');

@withStyles(styles)
export default class HomePage {
  static contextTypes = {
    i18n: PropTypes.object
  }

  constructor() {
    this.componentDidMount.bind(this);
    this.handleCitySearch.bind(this);
  }

  render() {
    return (
      <Grid className="HomePage">
        <Row className="HomePage-hero">
          <Col md={8} style={{ textAlign: 'center' }}>
            <Input ref="city" bsSize="large" type="text" />
            <Button bsSize="large" bsStyle="default" onClick={this.handleCitySearch}>{gettext('button text')}</Button>
          </Col>
          <Col md={4}>
            <ul>
              <li>{gettext('SOME TEXT')}</li>
              <li>{gettext('MORE TEXT')}</li>
            </ul>
          </Col>
        </Row>
      </Grid>
      );
  }
}

Теперь я запускаю команду djangos makemessages:

python manage.py makemessages -l de -d djangojs -v 3 -s

Я ожидаю, что созданный файл перевода имеет четыре записи ("пример", "текст кнопки", "НЕКОТОРЫЙ ТЕКСТ" и "БОЛЬШЕ ТЕКСТА"), потому что gettext появляется три раза в файле JS. Но созданный файл локали имеет только две записи для "примера":

#: ../HomePage.js:1
msgid "example"
msgstr ""

#: ../HomePage.js:25
msgid "MORE TEXT"
msgstr ""

Я также получил это предупреждение. Но понятия не имею, что это значит (файл имеет только 32 строки)

HomePage.js:33: warning: RegExp literal terminated too early

Кто-нибудь знает, почему django игнорирует другие записи? Может быть, это потому, что я использую синтаксис JSX или потому, что я использую классы ES6?

ОБНОВИТЬ:

Я узнал, что это не проблема Джанго, а xgettext, Джанго звонит xgettext с помощью следующей команды:

xgettext  --language=JavaScript --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 --output=- --from-code=UTF-8 --add-comments=Translators  ../HomePage.js

Так есть ли xgettext эксперт, кто может мне помочь?

4 ответа

Я попробовал это с последней версией Django (1.10.3). Казалось, работает просто отлично. Можете ли вы обновить версию Django?

Код, который работал для меня, находится здесь: https://github.com/guitarmanvt/stackru-question-32403632

Также имейте в виду, что ваша функция JavaScript gettext должно быть определено где-то. Когда я смотрел в последний раз, там было несколько библиотек JavaScript i18n, но немногие хорошо играли с xgettext и Django. Возможно, вам придется свернуть свой собственный.

Или посмотрите, как Sentry делает i18n с JSX. https://blog.sentry.io/2016/01/07/react-i18n.html

Удачного перевода!

Ранее я использовал версию django 1.5.6, она отлично извлекает ключевые слова из.js. Но после обновления до 1.11.15 выдает ошибки. Напримерwarning: unterminated string literal, warning: RegExp literal terminated too early

Спустя много времени я обнаружил факт: makemessages.py изменился после обновления. Файл находится в/usr/lib/python2.7/site-packages/django/core/management/commands/makemessages.py, как 1.5.6, так и 1.11.15.

В 1.5.6 поток makemessage: 1. использование prepare_js_for_gettext форма django.utils.jslex для предварительной обработки файлов js в содержимое, соответствующее синтаксису языка C 2. запись содержимого в файл.c 3. использование ключевых слов xgettext extract из файла.c и указание языка для C

Но в 1.11.15 это: 1. определить версию xgettext, если она выше 1.18.3, напрямую использовать js-файл процесса xgettext или обработать наподобие 1.5.6

Полученная мной ошибка вызвана ошибкой в ​​js-файлах обработки xgettext.

Так что я просто возвращаюсь True строка: 77 и все работает как раньше

    # django/core/management/commands/makemessages.py
    def is_templatized(self):
        if self.domain == 'djangojs':
            return True
            # return self.command.gettext_version < (0, 18, 3)
        elif self.domain == 'django':
            file_ext = os.path.splitext(self.translatable.file)[1]
            return file_ext != '.py'
        return False

Может стоит попробовать поставить эту галочку или переписать скрипт

Я опаздываю на вечеринку на несколько лет, но если кто-то сочтет это полезным ...

Ты прав, xgettext --language=JavaScript похоже, не любит ES6 / JSX.

Использование простой утилиты, такой как показанная в этой статье, вместо того, чтобы позволять makemessages/xgettext анализ ваших файлов ES6 / JSX напрямую может помочь.

В качестве альтернативы есть пакеты узлов, такие как gettext-extractor который можно использовать для написания .pot файл в msgmerge в ваш djangojs.po файлы ... Я запускаю скрипт узла, используя эту библиотеку (и gettext-extractor-vue для моего конкретного случая использования), чтобы написать frontend/messages.pot, то это:

      ./manage.py makemessages $LANGUAGE_FLAGS $IGNORE_FLAGS
./manage.py makemessages -d djangojs $LANGUAGE_FLAGS $IGNORE_FLAGS
for LANGUAGE in ${LANGUAGES[*]}
do
  PO_PATH=locale/${LANGUAGE}/LC_MESSAGES/djangojs.po
  touch $PO_PATH
  msgmerge -q --previous --update $PO_PATH frontend/messages.pot
done
./manage.py compilemessages

А также compilemessages затем генерирует соответствующий .mo файлы, включая строки, извлеченные из узлов, и Django правильно обслуживает их в /jsi18n/ каталог запросов.

Вам необходимо поместить код JavaScript в файл внутри статической папки, чтобыdjangojs.poбыть сгенерировано. Потому что Django по умолчанию просматривает это место назначения при работе с файлами JS.

Другие вопросы по тегам