После долгой игры с gettext () и xgettext, я думаю, что сам нашел способ (извините, пока, но мне не понравился ваш подход. Должно быть сотни таких массивов, и мне придется импортировать все из них в main (), это много extern и много дополнительной работы: /).
В любом случае, я так думаю, теоретически это можно сделать (я еще не пытался на самом деле перевести, но не понимаю, почему это не сработает)
Два # определить:
#define _ gettext
#define __(x) x
Затем вы используете _ для фактического перевода и __, чтобы просто пометить строки как «для перевода»:
const char *Colors[] = {
{ __("Red") },
{ __("Blue") },
{ __("Yellow") },
....
};
void PrintColor(int id) {
cout << _("The color is: ") << _(Colors[id]);
}
Затем вы запускаете:
xgettext -k_ -k__ *.cpp
И вы получите следующий .po файл:
#: test.cpp:2
msgid "Red"
msgstr ""
#: test.cpp:3
msgid "Blue"
msgstr ""
#: test.cpp:4
msgid "Yellow"
msgstr ""
#: test.cpp:9
msgid "The color is: "
msgstr ""
Итак, вы используете __ (или любое другое имя, на самом деле не имеет значения) в качестве «фиктивной функции», чтобы просто дать xgettext понять, что строка должна быть переведена, и _ чтобы фактически вызвать Gettext ().
Если вы вызываете _ со строкой, строка также будет помечена как переводимая, если вы вызовете ее с помощью переменной, массива, что бы тогда ни выглядело просто игнорируемым xgettext.
Отлично! Теперь все, что мне нужно сделать, это просмотреть 5 триллионов файлов и добавить подчеркивания, как будто я обезьяна: /