Django 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?

ОБНОВИТЬ:

Я выяснил, что это проблема не django, а xgettext. Django вызывает 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 эксперт, который может мне помочь?


person ilse2005    schedule 04.09.2015    source источник
comment
Удалось ли вам это решить?   -  person Sassan    schedule 15.07.2016


Ответы (2)


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

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

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

В качестве альтернативы посмотрите, как Sentry работает с i18n с JSX. https://blog.sentry.io/2016/01/07/react-i18n.html

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

person John Anderson    schedule 23.11.2016
comment
У меня такая же проблема с django 1.10.6 - поэтому обновления версии django недостаточно ... - person bruno desthuilliers; 18.04.2018

Я использовал версию 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 form 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

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

person user10475870    schedule 18.10.2019