#string #gettext #xgettext
Вопрос:
Существует проблема при извлечении строк (с помощью xgettext) из базы плагинов gst, где строка имеет разделители null —
static const gchar genres[] =
"Blues00Classic Rock00Country00Dance00Disco00Funk00Grunge00"
"Hip-Hop00Jazz00Metal00New Age00Oldies00Other00Pop00Ramp;B00"
"Rap00Reggae00Rock00Techno00Industrial00Alternative00Ska00"
"Death Metal00Pranks00Soundtrack00Euro-Techno00Ambient00Trip-Hop"
"00Vocal00Jazz Funk00Fusion00Trance00Classical00Instrumental00"
"Acid00House00Game00Sound Clip00Gospel00Noise00Alternative Rock"
"00Bass00Soul00Punk00Space00Meditative00Instrumental Pop00"
"Instrumental Rock00Ethnic00Gothic00Darkwave00Techno-Industrial00"
"Electronic00Pop-Folk00Eurodance00Dream00Southern Rock00Comedy"
"00Cult00Gangsta00Top 4000Christian Rap00Pop/Funk00Jungle00"
"Native American00Cabaret00New Wave00Psychedelic00Rave00Showtunes"
"00Trailer00Lo-Fi00Tribal00Acid Punk00Acid Jazz00Polka00"
"Retro00Musical00Rock amp; Roll00Hard Rock00Folk00Folk/Rock00"
"National Folk00Swing00Bebob00Latin00Revival00Celtic00Bluegrass"
"00Avantgarde00Gothic Rock00Progressive Rock00Psychedelic Rock00"
"Symphonic Rock00Slow Rock00Big Band00Chorus00Easy Listening00"
"Acoustic00Humour00Speech00Chanson00Opera00Chamber Music00"
"Sonata00Symphony00Booty Bass00Primus00Porn Groove00Satire00"
"Slow Jam00Club00Tango00Samba00Folklore00Ballad00Power Ballad00"
"Rhythmic Soul00Freestyle00Duet00Punk Rock00Drum Solo00A Capella"
"00Euro-House00Dance Hall00Goa00Drum amp; Bass00Club-House00"
"Hardcore00Terror00Indie00BritPop00Negerpunk00Polsk Punk00"
"Beat00Christian Gangsta Rap00Heavy Metal00Black Metal00"
"Crossover00Contemporary Christian00Christian Rock00Merengue00"
"Salsa00Thrash Metal00Anime00Jpop00Synthpop";
Я использую xgettext-0.21 для извлечения строк —
xgettext -a --no-wrap ./gst-libs/gst/tag/gstid3tag.c -o -
Я получаю только одну из ниточек —
#: gst-libs/gst/tag/gstid3tag.c:51
msgid "Blues"
msgstr ""
В то время как я должен получить также «Классический рок», «Кантри», «Танцы» и т. Д…
Есть ли какой-нибудь другой способ извлечь эти строки? Может быть, какой-то другой инструмент или с помощью определенных флагов с помощью команды xgettext?
Ответ №1:
Нет никакого способа извлечь эту строку с xgettext
помощью, и это сделано специально. И даже если бы был способ, нет доступных инструментов для редактирования файла po с записями, содержащими нулевые байты.
Решение состоит в том, чтобы собрать строку с нулевыми байтами во время выполнения или во время компиляции. Для последнего потребуется вспомогательный скрипт, который генерирует исходный файл, содержащий список жанров.
Пример в Perl:
#! /usr/bin/env perl
use strict;
# Stub gettext that just returns the argument.
sub gettext {
shift;
}
my $genres = join '\000', (
gettext('Blues'),
gettext('Classic Rock'),
gettext('Country'),
gettext('Dance'),
);
print <<EOF;
static const gchar genres[] = "$genres";
EOF
Запуск сценария приведет к созданию требуемого фрагмента кода на языке C. И отправка его в качестве дополнительного исходного файла xgettext
добавит все жанры в ваш файл po:
$ xgettext --omit-header -o - genres.pl
#: genres.pl:11
msgid "Blues"
msgstr ""
#: genres.pl:12
msgid "Classic Rock"
msgstr ""
#: genres.pl:13
msgid "Country"
msgstr ""
#: genres.pl:14
msgid "Dance"
msgstr ""
Вы можете сделать это, конечно, на любом другом языке, который xgettext
поддерживает, а не только на Perl. Выберите тот, который проще всего интегрировать в вашу систему сборки.
Простое использование другого разделителя (например, «Блюз:Классический рок:…») не только создает проблемы с экранированием, но и приведет к созданию файла po, который неудобно переводить.