2017-02-08 20 views
1

私はフランス語で私の英語UIを翻訳するのに必要なので、私は.TSと.qmファイルで必要なすべてのでした、QTranslatorクラスでそれをロードし、そしてはQApplicationにそれをインストールします。私のC++ Qt UIは私のプログラムに翻訳されていますが、私のQStringは翻訳されませんでしたか?

//in the InterfaceWidget constructor: 
QTranslator myappTranslator; 
bool loaded = myappTranslator.load("myApp_" + QLocale::system().name()); 
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE 
QApplication::installTranslator(&myappTranslator); 
ui.setupUi(this); 
ui.retranslateUi(this); //works, it translates the UI 

その後 、私が作成しConfigurationTabUI呼ばInterfaceWidget(タブで)別のウィジェットにアタッチ:

m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab); 

対応するUIも正しく、フランス語に翻訳されています。

そしてここでは私の問題です:

void ConfigurationTabUI::on_ValidButton_clicked(){ 

    QString msg(ConfigurationTabUI::tr("message to translate")); 
    qDebug() << "translated string: " << msg; // NOT TRANSLATED 
} 

私は本当に何の手掛かりなぜ... ありがとうを持っていない:私は簡単なのQStringを翻訳しようとすると、ConfigurationTabUIの方法で、それは動作しません。あなたの助け。

注:Qt5.2を使用して、.tsファイルに正しい翻訳文字列が含まれているかどうかを2回確認しました。

+2

あなたが印刷している何が翻訳された文字列を格納し、同じ変数ではありません。 "msg"に翻訳を保存しましたが、 "l_sMsg"と表示されました。これはどこにも定義されておらず、何が設定されているのかわかりません。タイプミスであれば、問題を解決してからもう一度見てください。 – goug

+0

ああ、申し訳ありませんでした...それを見ていただきありがとうございます – toussa

+0

'ConfigurationTabUI'クラスに' Q_OBJECT'マクロがありますか? 'ConfigurationTabUI :: tr'の代わりに' QObject :: tr'を使うとどうなりますか? – Mike

答えて

0

[OK]を、私は、問題は、それだけでダム監督だが見つかりました:

QTranslatorはスタック上に作成されていない動的(ヒープ上)、そのオブジェクトは、メソッドの最後に破壊されています。 その結果、オブジェクトはまだ存在しますが、後でスロットが呼び出されると何も翻訳されないため、UIが変換されます。ここで

は私のコードです:

//in the InterfaceWidget constructor: 
QTranslator* myappTranslator = new QTranslator(QApplication::instance()); 
bool loaded = myappTranslator->load("myApp_" + QLocale::system().name()); 
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE 
QApplication::installTranslator(myappTranslator); 
ui.setupUi(this); 

と(QWidgetから継承)ConfigurationTabUI中:

void ConfigurationTabUI::changeEvent(QEvent *e) 
{ 
    if (e->type() == QEvent::LanguageChange) { 
     ui.retranslateUi(this); 
     reset(); //my method to reload some data in UI 
    } else 
     QWidget::changeEvent(e); 
} 
+0

QApplicationの子としてトランスレータを作成する方が安全だと思います。私は 'QApplication'オブジェクトを作成した後、' main.cpp'で直接それを行うでしょう。 – smerlin

+0

私のコードはフレームワークのプラグインなので、私はmain.cppにアクセスできない。InterfaceWidgetクラスは、私のプラグインの「メイン」クラスです。 'QTranslator * myappTranslator = new QTranslator(QApplication :: instance());'良いでしょうか?その場合 ? – toussa

+0

QApplicationはトランスレータオブジェクトを参照するため、QApplicationオブジェクトが破棄される前にQTranslatorオブジェクトの有効期間が終了しないようにする必要があります。 Qtでは、QTranslatorをQApplicationの子にすることでそれを行います。 – smerlin

関連する問題