2016-09-10 17 views
4

英語とアラビア語の2つの言語のプログラムがapp_enとapp_arというファイルにあります。 QApplicationのinstallTranslatorを使用して、メインのプログラムを最初に翻訳することができます。私の質問は、QActionを押してプログラムの言語を変更するにはどうすればいいですか?私は私の言語QActionは、その後、選択したユーザの言語を取得し、それを保存し、翻訳をインストールするには、別の関数に行くのスロットに接続されているqtアプリケーションを動的に翻訳する方法は?

は、ここに私の試みです。これはすべてQMainWindowの外で発生します。

void MainCore::GetAndSaveLanguage(bool){ 
    //Getting the language the users wants. 
    bool OKPressed; 
    QString Language = QInputDialog::getItem(NULL, InputDialogString, InputDialogString + ":", Languages, 0, false, &OKPressed) 
         .remove(QRegExp("*(", Qt::CaseSensitive, QRegExp::Wildcard)).remove(')'); 

    //Checking if ok button was pressed. 
    if(OKPressed){ 
     //Saving the languages. 
     Settings->beginGroup("Settings"); 
     Settings->setValue("Language", Language); 
     Settings->endGroup(); 

     //Update language. 
     UpdateTranslations(Language); 
    } 
} 

void MainCore::UpdateTranslations(QString Language){ 
    //Setting the translation for the qt widgets. 
    QTranslator QtTranslator; 
    QtTranslator.load("qt_" + Language, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); 
    QApplication::instance()->installTranslator(&QtTranslator); 

    //Setting the translation for the program. 
    QTranslator AppTranslator; 
    AppTranslator.load("app_" + Language, ":/translations"); 
    QApplication::instance()->installTranslator(&AppTranslator); 
} 
私もQMainWindowに、このような画面のすべてのテキストを設定する関数を持っている

void Window::SetText(){ 
    Menu->setTitle(tr("File")); 
    ... 
} 

これは、ウィンドウが作成されたときに呼び出されるとChangeEventの機能にあります。

void Window::changeEvent(QEvent *event){ 
    if(event->type() == QEvent::LanguageChange){ 
     SetText(); 
    }else{ 
     QWidget::changeEvent(event); 
    } 
} 

答えて

1

QtTranslator(AppTranslatorと同じ)をスタックに割り当てて、UpdateTranslationsの末尾に範囲外になる問題があります。

void MainCore::UpdateTranslations(QString Language) 
{ 
    //Setting the translation for the qt widgets. 
    QTranslator QtTranslator; 
    QtTranslator.load("qt_" + Language,QLibraryInfo::location(QLibraryInfo::TranslationsPath)); 
    QApplication::instance()->installTranslator(&QtTranslator); // this is a bad reference 

    ... 
} // QtTranslator will go out of scope 

あなたのアプリが動作している限り、あなたはQtTranslatorが必要です。だから、一つの選択肢は、ヒープ

QTranslator * QtTranslator = new QTranslator; 

でそれを割り当てることで、QTranslatorはQObjectを、に、おそらく最良の方法ですので、あなたは

+0

...後でそれを削除できるようにするQtTranslatorへの参照を保持する必要がありますQApplicationインスタンスの子にすることを生涯制御します。 –

関連する問題