2017-11-27 32 views
0

ダミーダイアログのボタンを翻訳するように私のQtアプリを納得させようとしています。不明な理由により、最初のダイアログはドイツ語に変換されますが、ラムダスロットで実行されるダイアログは変換されません。ラムダ式が問題であるかどうかを確認するために古い信号構文を使用しようとしましたが、結果は変わりませんでした。 RTWindowコンストラクタが終了すると、アプリケーションコンストラクタが完了し、main()app.exec()を呼び出します。翻訳者に代わって私が制御できるコードはありません。ラムダスロットでQtトランスレータが動作しない

このコードでは、メニュー項目をクリックしてコールバックすると、変換されていないダイアログが作成されます。コンストラクタで作成されたダイアログが翻訳されます。

私はそれらの線で

RTWindow::RTWindow(QWidget *parent) : QMainWindow(parent) 
{ 
ui.setupUi(this); 



this->setWindowTitle("RodeTracker 2"); 

auto fileMenu  = new QMenu("Datei"); 
auto configMenu  = new QMenu("Bearbeiten"); 
auto clientAction = new QAction("Kunden ..."); 

configMenu->addAction(clientAction); 

ui.menuBar->addMenu(fileMenu); 
ui.menuBar->addMenu(configMenu); 

// translates fine: 
QMessageBox msgBox; 
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); 
msgBox.setDefaultButton(QMessageBox::Cancel); 
msgBox.exec(); 

connect(clientAction, &QAction::triggered, [=]() 
{ 
    // doesn't translate: 
    QMessageBox msgBox; 
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); 
    msgBox.setDefaultButton(QMessageBox::Cancel); 
    msgBox.exec(); 
}); 

} 

翻訳がインストールされているが表示されない:(はQApplication派生コンストラクタ)

QLocale::setDefault(QLocale(QLocale::German, QLocale::Germany)); 

QTranslator qtBaseTranslator; 
if (qtBaseTranslator.load(QLocale::German, "qtbase", "_", "")) 
{ 
    installTranslator(&qtBaseTranslator); 
    qDebug() << "Base Translator loaded"; 
} 

は、私は、出力 "ロードベース翻訳" を取得します。誰が知っている、何が翻訳を混乱させるかもしれない?

+0

あなたは[=]() '')([&] ''と交換してみてもらえますか?これは、スロットに必要なシンボルをコピーするのではなく、参照でキャプチャします。したがって、RTWindowの構築後に翻訳を変更する場合は、幸運かもしれません。 –

+0

それは私の最初の本能でしたが、ラムダは本当に全体の状況に影響を与えません。同じ結果を試してみました。 –

+0

私はあなたが問題がラムダではないということを知っています。翻訳プロセスの仕組みを理解していることを確認してください。まず、tr関数内のコードに文字列をラップします( 'auto clientAction = new QAction(tr(" Clients ... "));')。プロジェクトでlupdateを実行すると、tr( "...")が検索され、 "Clients ..."のような文字列を "Kunden ..."に手動で翻訳するtsファイルが作成されます。次に、tsでlreleaseを実行し、QTranslatorでロードするqmファイルを取得します。あなたのコードでtr/QT_TRANSLATE_NOOPが見えたら、私は言及しません。 [docs](http://doc.qt.io/qt-5/internationalization.html) –

答えて

0

QTranslatorオブジェクトは、QApplicationの完全な存続期間中に存在する必要があります。上記の例では、QAppDerivのコンストラクタでローカル変数としてトランスレータを生成することは、構築中は問題ありませんが、それ以降は正しくありません。正しい方法は、ヒープ上にQTranslatorを作成することです。

QAppDeriv::QAppDeriv(int &argc, char **argv, int flags) 
    : QApplication(argc, argv, flags) 

{ 
    // set default local 
    QLocale::setDefault(QLocale(QLocale::German, QLocale::Germany)); 

    // create translator objects on heap 
    QTranslator *qtTranslator = new QTranslator(); 
    if (qtTranslator->load(QLocale::German, "qt", "_", "")) 
    { 
     installTranslator(qtTranslator); 
    } 

    QTranslator *qtBaseTranslator = new QTranslator(); 
    if (qtBaseTranslator->load(QLocale::German, "qtbase", "_", "")) 
    { 
     installTranslator(qtBaseTranslator); 
    } 

    // create the main window 
    window = std::make_shared<RTWindow>(); 
    window->show(); 

} 
関連する問題