2016-12-21 30 views
1

Qtの翻訳システムを使用してenum(つまりQMetaEnum経由)の文字列表現を翻訳することはできますか?私は、私は必要だと思う何文字列値の変換文字列Qt

があれば、ファイルがLUPDATEによって処理されている場合にのみ、または動作を変更することにより、翻訳のために、いずれかのいくつかのQT_TR_NOOP()のコードを放出することにより、列挙型の文字列をピックアップしてlupdateを取得するいくつかの方法のためでありますlupdate/mocです。

たとえば、私のアプリケーションは、ダイアログボックスを介してユーザーに「設定」オプションを提示します。すべての設定はQ_PROPERTYと定義されています。 enumを使用するオプションはコンボボックスとして表示され、コンボボックスのテキストオプションには表示されるテキストとしてQMetaEnum::key()が使用されます。以下は、ポイントを取得するためのいくつかの擬似コードです。

のようなウィジェットが定義されているいくつかのenum性質を持っています:コンボウィジェットの作成は個別の設定マネージャによって行われ、このような何か進む

class SomeWidget : public QWidget 
{ 
    Q_OBJECT 
    Q_ENUMS(Configuration); 

    enum Configuration 
    { 
     Config_Blue = 0, 
     Config_Green, 
     Config_Invisible, 
     Config_Backwards 
    }; 

    Q_PROPERTY(Configuration READ Configuration WRITE SetConfiguration); 
}; 

QWidget* SettingsItem::CreateWidget() 
{ 
    const QMetaObject* pMetaObj = this->m_pWidget->metaObject(); 
    const QMetaProperty& rcProp = pMetaObj->property(this->m_iProp); 

    QMetaEnum cEnum = rcProp.enumerator(); 
    if(cEnum.isValid()) 
    { 
     QComboBox* pRetWidget = new QComboBox; 
     for(int i = 0; i < cEnum.keyCount(); ++i) 
     { 
      int iVal = cEnum.value(i); 
      QString strKey = cEnum.key(i); // Translate here? 
      pRetWidget->addItem(strKey, iVal); 
     } 
    } 

    ... 
    return pRetWidget; 
} 

設定でコンボボックスをダイアログで "Config_Blue"、 "Config_Green"などが表示されます。現在の言語が何であれ、 "Blue"、 "Green"などと言うだけです。

残りのコードでは、Qtの翻訳システムと、実際にはうまく動作するlinguistユーティリティを使用しています。文字列リテラルとtr()を手動でコードに追加することなく、enumのこのタイプの翻訳を有効にできることを期待していました。基本的に、翻訳者が必要とする情報はすべてコード内に既にあります。これらの列挙型の値を翻訳可能なものとして識別できるようにするには、linguistが必要です。コンボボックスに値が入力されると、tr()が呼び出されます。私は、私は必要だと思う何

があれば、ファイルがLUPDATEによって処理されている場合にのみ、または動作を変更することにより、翻訳のために、いずれかのいくつかのQT_TR_NOOP()のコードを放出することにより、列挙型の文字列をピックアップしてlupdateを取得するいくつかの方法のためでありますlupdate/mocです。

マクロが動作する可能性はありますが、可能ではない可能性があります。多分Qtコードを変更する必要がありますか?

+0

私は最初、返信を書いたかったが、私自身は以下からそれを読んだ:http://kalebpederson.com/index.php/2010/07/qmetaenum-magic-serializing-c-enums – AlexanderVX

+0

これはちょうどQMetaEnumを使用してキー値を文字列として取得します。私はこれが私がすでにやっていることだと信じています。私が本当に必要とするのは、enum文字列をlupdateでピックアップして翻訳できるようにすることです。多分私はこれをより明確にするために私の質問を修正するでしょう。 –

答えて

1

開始するには、enum識別子をユーザーが表示できません。これらは、ユーザーではなく開発者にとって意味のある識別子です。それらをユーザーに直接公開すると、コードの内部設計とユーザーに表示される動作の間に強力な結合が加わります。それは避けるのが最善です。

enum値とユーザーが参照可能な文字列の間をマップする必要があります。マップ内の値は翻訳の対象となり、再マップ時にはマップを再入力する必要があります。例:

class Object : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(Configuration); 
    Q_PROPERTY(Configuration READ Configuration WRITE SetConfiguration); 

    enum Configuration { 
     Config_Blue, Config_Green, Config_Invisible, Config_Backwards 
    }; 
public: 
    static QString toString(Configuration c) { 
     switch (c) { 
     case Config_Blue: return tr("Blue", "Configuration"); 
     case Config_Green: return tr("Green", "Configuration"); 
     case Config_Invisible: return tr("Invisible", "Configuration"); 
     case Config_Backwards: return tr("Backwards", "Configuration"); 
     } 
    } 
}; 

設定値を変換できるようになりました。

+0

私は様々な列挙型の形式で700のオプションを持っている場合、私はそれらのすべてのためにこのタイプのスイッチを書く必要があります –

+0

はい、あなたは、**それらのすべてが**文字列に直面しているので、する必要があります。 C++の識別子は、実際にユーザーにとって意味のあるものではありません。それらを適切に区切る方法はありません。あなたは、ユーザーが見ることのできる識別子に依存して、デザインをかなり乱してしまいます。あなたはあなた自身を見つけた混乱を修正しなければなりません。多分このすべてが、あなたが自分で作った仕事の量を実現させるでしょう。あなたは700の翻訳可能な文字列を持っています。あなたのコンフィギュレーションシステムは少し外れていませんか? –

+0

私は実際に700のオプションを持っていない、私は番号を選んだ。どのように私は台無しにこのデザインを修正するだろうか? –