xgettext не распознает строки, определенные как макросы

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

Я использую инструмент xgettext версии 0.10.35, и оказалось, что он не распознает строки, определенные как макросы, во время синтаксического анализа.

Например, у нас есть файл test_xgettext.c со следующим содержимым:

#include <stdio.h>

#define    _(str)         str

#define    STRING_1       _("string 1")

int main(void)
{
    printf(STRING_1);
    printf(_("string 2"));
    return 0;
}

Если мы бежим

xgettext.exe test_xgettext.c -o test_xgettext.pot -k_

у нас будет файл test_xgettext.pot со следующим содержимым:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2016-09-01 12:39+0300\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=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"

#: test_xgettext.c:10
msgid "string 2"
msgstr ""

Здесь у нас есть только «строка 2» в файле POT, и моя цель - собрать как «строку 1», так и «строку 2».

Заранее благодарю за помощь.


person yurko    schedule 01.09.2016    source источник
comment
Работает для меня. (xgettext 0.19.2 в Linux)   -  person michalsrb    schedule 01.09.2016
comment
@michalsrb Я использую свою версию на Windows 7 Professional. Не уверен, что могу изменить используемую в настоящее время версию xgettext.   -  person yurko    schedule 01.09.2016
comment
Возможно, он неправильно распознает язык. Попробуйте добавить параметр -L C. (Например, в режиме Python строка 1 пропускается.)   -  person michalsrb    schedule 01.09.2016
comment
@michalsrb -LC не помогает, похоже, что в моей версии xgettext есть ошибка, или я что-то пропустил.   -  person yurko    schedule 01.09.2016


Ответы (1)


Оказалось, что это работает для xgettext 0.10.35, если мы используем массив вместо макроса.

Измененный исходный файл:

#include <stdio.h>

#define    _(str)         str

char    STRING_1[]  =       _("string 1");

int main(void)
{
    printf(STRING_1);
    printf(_("string 2"));
    return 0;
}

В этом случае у нас есть следующий вывод в POT-файле (я пропустил не важные строки):

#: test_xgettext.c:5
msgid "string 1"
msgstr ""

#: test_xgettext.c:10
msgid "string 2"
msgstr ""

Также оказалось, что он работает, как и предполагалось изначально, с xgettext версии 0.19.8.1 (Windows 7 Professional). Исходный файл:

#include <stdio.h>

#define    _(str)         str

#define    STRING_1       _("string 1")

int main(void)
{
    printf(STRING_1);
    printf(_("string 2"));
    return 0;
}

Созданный файл POT:

#: test_xgettext.c:5
msgid "string 1"
msgstr ""

#: test_xgettext.c:10
#, c-format
msgid "string 2"
msgstr ""
person yurko    schedule 15.01.2017