Перезаписать имя выходного файла xgettext

Я использую xgettext со стандартным вводом, потому что ввод недоступен в файле. Однако я бы хотел, чтобы он выводил имя файла, которое я указываю в качестве комментария над каждой строкой.

Текущее поведение

#: Standardinput:13
msgid "User"
msgstr ""

#: Standardinput:13
msgid "Invite"
msgstr ""

#: Standardinput:14
msgid "Group"
msgstr ""

Ожидаемое поведение

Если бы я мог установить имя файла на path/to/file.txt, вместо этого он должен был бы вывести это:

#: path/to/file.txt:13
msgid "User"
msgstr ""

#: path/to/file.txt:13
msgid "Invite"
msgstr ""

#: path/to/file.txt:14
msgid "Group"
msgstr ""

Я прочитал все параметры, которые можно установить в документах и ничего не нашел по этому поводу.


person narrowtux    schedule 08.06.2017    source источник


Ответы (1)


Текст #: path/to/file.txt:14 называется «местоположением», и больше всего вы можете его контролировать с помощью флагов --no-location и --add-location. См. xgettext.c:xgettext_open () по причине исходного кода.

Между тем, очевидная вещь, которую нужно сделать, это взять ввод из стандартного ввода, передать вывод в стандартный вывод, заменить вручную, а затем сохранить в целевом PO-файле. Пример:

xgettext -k_ -Lc -o- - < hello.c \
    | sed 's@#: standard input:@#: path/to/file.c:@g' \
    > messages.po

Очевидно, измените шаблоны внутри вызова sed, чтобы они соответствовали вашему формату xgettext и файлу, который вы хотите представить.

Менее очевидным является стандартная символическая ссылка на имя файла, похожее на вашу цель. Пример:

$ ln -s /dev/stdin file.c
$ echo 'int main() { printf(gettext("Hello World\n")); return 0; }' \
      | xgettext --omit-header -o- file.c
#: file.c:1
#, c-format
msgid "Hello World\n"
msgstr ""

Возможность присвоить имя файлу для целей вывода, когда ввод является стандартным, кажется разумной функцией. Я предлагаю открыть запрос в GNU.

person bishop    schedule 08.06.2017
comment
Да, замена вывода - это то, что я хочу попробовать, если нет встроенного решения. На самом деле я вызываю это из загрузчика веб-пакетов, поэтому мне не нужно использовать sed, но спасибо за пример :) - person narrowtux; 08.06.2017
comment
Копнул немного дальше в источнике и подтвердил, что нет опции CLI. Однако при условии, что замена регулярных выражений не является вашей чашкой чая. - person bishop; 08.06.2017
comment
Спасибо за просмотр исходного кода для меня! Похоже, что решение с символической ссылкой может работать немного лучше в моей ситуации, поскольку я также использую параметр --join-existing, чтобы все сообщения находились в одном и том же файле .po. Замена вывода вручную впоследствии будет означать, что мне придется вручную объединять выходные данные для каждого исходного файла. Я также отправлю запрос функции. - person narrowtux; 08.06.2017