gettext: извлечь строки dgettext () в файлы domain.po

У меня есть программа с несколькими доменами, некоторые исходные файлы содержат вызовы dgettext () с разными текстовыми доменами.

Как извлечь строки gettext в несколько файлов .po? Например, вызов dgettext('one', 'Hello') должен идти на one.po, а dgettext('two', 'Bye') - на two.po. xgettext просто игнорирует текстовый домен и помещает все в один файл.


person Sergey Stolyarov    schedule 19.10.2009    source источник
comment
Я нашел предложение о том, как анализировать каждый домен отдельно. Однако это обходной путь.   -  person Shef    schedule 31.03.2012


Ответы (2)


Сначала вам нужен способ разделения доменов.

Например, предположим, что у вас есть домен для lib и один для app, а затем создайте ярлык для вызова dgettext();

_app(msg) -> dgettext("app", msg);

и один для домена lib:

_lib(msg) -> dgettext("lib", msg);

Добавьте эти вызовы по всему вашему коду, например:

show_message(_app("Choose a directory to save your work."));
show_message(_lib("No space left on device."));

Помните, что вам нужно вызвать bindtextdomain() для обоих доменов при инициализации вашего приложения.

Чтобы извлечь их, вам нужно указать разные ключевые слова для xgettext для всех имен файлов в исходном дереве, которое содержит эти маркеры:

xgettext --keyword=_app -d domain1 filenames...
xgettext --keyword=_lib -d domain2 filenames...

Наконец, скомпилируйте оба файла .po в их двоичный вариант .mo и скопируйте / установите их в нужное место.

person Johan Dahlin    schedule 04.04.2012
comment
Я уже знал это решение, как упоминалось в комментариях к вопросу, но спасибо за усилия. - person Shef; 05.04.2012
comment
Если вы думаете, что это обходной путь, я не думаю, что найдутся решения проблемы, которые не являются обходными путями. Альтернативой было бы написать свою собственную программу, которая извлекает вызовы dgettext (), но тогда вы в значительной степени дублируете всю логику xgettext. - person Johan Dahlin; 06.04.2012
comment
Это не решение, но я собираюсь наградить вас наградой, потому что в противном случае она будет потрачена впустую. - person Shef; 07.04.2012

Если вы используете Linux, используйте программу gtranslator для управления * .po и тестирования ваших * .po файлов.

person PersianGulf    schedule 25.12.2011