Джанго 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.