Итак, я работаю над переводом своего приложения C++ на несколько языков. В настоящее время я использую что-то вроде:
#define TR(x) (lookupTranslatedString( currentLocale(), x ))
wcout << TR(L"This phrase is in English") << endl;
Переводы взяты из файла CSV, который сопоставляет английскую строку с переведенной строкой.
"This phrase is in English","Nasa Tagalog itong pagsabi"
Это упрощенно, но это основная идея.
Мой вопрос касается создания списка английских фраз, которые необходимо перевести. Мне просто нужен CSV со всеми английскими фразами и пустыми переведенными фразами. Я надеялся, что можно будет сгенерировать этот список либо во время компиляции, либо во время выполнения. Во время компиляции я думал примерно так:
#define TR(x) \
#warning x \
(lookupTranslatedString( currentLocale(), x ))
а затем, возможно, разобрать журнал компиляции или что-то в этом роде. Кажется, это не так хорошо работает.
Во время выполнения также было бы здорово. Я думал просто запустить приложение и иметь скрытую команду, которая выгружала бы английский CSV. Я видел похожие методы, используемые для регистрации команд в центральном списке с использованием глобальных переменных. Это может выглядеть примерно так:
class TrString
{
public:
static std::set< std::wstring > sEnglishPhrases;
TrString( std::wstring english_phrase ) { sEnglishPhrases.insert( english_phrase ); }
};
#define TR(x) do {static TrString trstr(x);} while( false ); (lookupTranslatedString( currentLocale(), x ));
Я знаю, что есть две проблемы с приведенным выше кодом. Я сомневаюсь, что он компилируется, но, что более важно, для создания списка всех английских фраз мне нужно будет пройти каждый путь кода, прежде чем обращаться к sEnglishPhrases.
Похоже, я закончу тем, что напишу небольшой синтаксический анализатор, который будет читать весь мой код и искать строки TR, что на самом деле не так уж сложно. Я просто надеялся узнать немного больше о С++ и узнать, есть ли лучший способ сделать это.