私は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文字列を探すための小さなパーサを作成することになりますが、これは本当に難しいものではありません。私はちょうどC++についてもう少し学びたいと思っていましたが、これを行う良い方法があれば。
これは最善の解決策であると思われます。つまり、本当にクリーンなソリューションはありません。gettextからQtにいたるまで私が見てきた誰もがちょっとしたパーサを実装するだけなので、意味があると思います。 – tfinniga