2

私は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++についてもう少し学びたいと思っていましたが、これを行う良い方法があれば。

答えて

1

あなたはほとんどそこにいると思います。最後のアイデア撮影:

class TrString 
{ 
public: 
    static std::set<std::string> sEnglishPhrases; 
    std::string phrase; 
    TrString(const std::string& english_phrase):phrase(english_phrase) 
    { sEnglishPhrases.insert(english_phrase); } 
    friend ostream &operator<<(ostream &stream, const TrString& o); 
}; 

ostream &operator<<(ostream &stream, const TrString& o) 
{ 
    stream << lookupTranslatedString(currentLocale(), o.phrase); 
    return stream; 
} 

#define TR(x) (TrString(x)) 
// ... 
std::cout << TR("This phrase is in English") << std::endl; 

をそして、あなたが言うように、あなたはすべてのTR()書上のコードを実行する必要がありますが、あなたがこれを行うためのユニットテストフレームワークを設定することができます。

私の選択肢は、各モジュールの静的変数を作るために上記TrStringクラスを使用することです:

// unnamed namespace gives static instances 
namespace 
{ 
    TrString InEnglish("This phrase is in English"); 
    // ... 
} 

今、あなただけのTrStringをプリントアウトするために、代替main()にリンクする必要がある:: sEnglishPhrases

+0

これは最善の解決策であると思われます。つまり、本当にクリーンなソリューションはありません。gettextからQtにいたるまで私が見てきた誰もがちょっとしたパーサを実装するだけなので、意味があると思います。 – tfinniga

2

ファイルを解析して必要なものを削除するクイックスクリプトを作成するだけで済みます。

awk '/TR\(L"[^"]*")/ {print}' plop.c 

あなたは少し複雑な気にいらが必要な場合は、Perlがあなたの友達です。

+0

はい、これは私がやっているように見えます。よりよい方法があるかどうかは疑問だった。 – tfinniga

0

あなたが探しているものは、GNU gettextと非常によく似ています。具体的には、xgettextツールをご覧ください。

関連する問題