Извлечение сообщений Javascript gettext с помощью экстрактора Babel CLI

здесь указано, что Babel может извлекать сообщения gettext для файлов Python и Javascript.

Babel поставляется с несколькими встроенными экстракторами: python (который извлекает сообщения из исходных файлов Python), javascript и ignore (который ничего не извлекает).

Экстрактор командной строки задокументирован здесь, но без примеров использования.

Также в приведенном выше том же указателе упоминается файл конфигурации, используется с добычей, но не сильно расширена.

Когда я запускаю базовую команду для экстрактора в каталоге с файлами js, я получаю только сгенерированный заголовок .PO, но не сообщения.

$ pybabel extract   /path/to/js-dir

# Translations template for PROJECT.
# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2012-04-22 19:39+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"

$ 

Вот пример сегмента из файла js, для которого я пытаюсь извлечь сообщения:

else if(data.status == "1"){
    var follow_html = gettext('Follow');
    object.attr("class", 'button follow');
    object.html(follow_html);
    var fav = getFavoriteNumber();
    fav.removeClass("my-favorite-number");
    if(data.count === 0){
        data.count = '';
        fav.text('');
    }else{
        var fmts = ngettext('%s follower', '%s followers', data.count);
        fav.text(interpolate(fmts, [data.count]));
    }
}

Я был бы признателен, если бы кто-то мог предоставить точные параметры CLI и настройки конфигурации, чтобы извлечение работало, или указатель на него.


person Basel Shishani    schedule 22.04.2012    source источник
comment
Какие функции gettext/ngettext вы используете в своих js? Я сейчас на том же этапе - у меня есть Babel, работающий для html и python, но не для js.   -  person fastmultiplication    schedule 16.05.2012
comment
На самом деле это проект ОС (Askbot) — вы можете проверить его здесь github.com/ASKBOT/askbot-devel< /а>   -  person Basel Shishani    schedule 19.05.2012


Ответы (4)


Создайте файл (babel.cfg) со следующим контентом:

[javascript:*.js]
encoding = utf-8

Затем выполните:

pybabel extract -F babel.cfg /path/to/js-dir

Это должно быть достаточно для вас, чтобы иметь некоторые ссылки сообщения.

Кстати, вы можете проконсультироваться с помощью команды extract, делая:

pybabel extract --help
person ubik    schedule 16.05.2012
comment
Извините за опоздание с ответом. Я делаю именно то, что вы описали, и получаю тот же результат, что и в моем вопросе. Вы испытали команду на значительных примерах. - person Basel Shishani; 23.05.2012
comment
У меня такая же проблема. Затем я создал файл babel.cfg, содержащий следующее: ``` [javascript: **.js] extract_messages = _ ````, и теперь он работает! - person Sebastian Hoitz; 07.11.2012
comment
И как в сторону определить ключевое слово множественное число: -k "ngettext:1,2". - person Rune Kaagaard; 26.01.2017

У меня была похожая проблема, и я смог обойти ее, отключив ключевые слова по умолчанию с помощью babel.

pybabel extract -k __ -F babel.cfg --no-default-keywords /path/to/js-dir 

Вы должны указать хотя бы одно ключевое слово в команде при отключении значений по умолчанию (-k [ключевое слово]). Я выбрал -k __ потому что "__" был узором, который я искал.

Просто используйте эту команду и замените «__» после -k на один из вашего файла babel.cfg.

Изменить: это позволяет вам использовать свои собственные ключевые слова, а не gettext()

person AssHat_    schedule 15.06.2012

Вы можете создать объект в качестве глобальной фляги и перевести его с помощью gettext

g.i18n = {
    'Casa' : lazy_gettext('Home'),
    'Auto' : lazy_gettext('Car'),
    'Persona' : lazy_gettext('Person')
}

Затем добавьте его как переменную

<script>
    var i18n = {{ g.i18n | tojson }}
</script>

и использовать его в JS:

var labelTranslate = {
                    Casa: i18n.Casa,
                    Persona: i18n.Persona,
                    Auto: i18n.Auto
                };
person Anatolii Bivol    schedule 11.07.2016

Вы можете использовать gettext непосредственно в JavaScript.

См.: jsgettext. Это позволяет вам использовать стандартные функции *gettext, в том числе те, которые используют контексты и/или формы множественного числа.

Он может читать файлы PO/MO или вместо этого вы можете импортировать файлы JSON, созданные на заказ.

См. этот файл этот проект для полного примера.

person ZeWaren    schedule 14.07.2016