2014-03-30 81 views
0

這個問題有unfortunately been asked before但我在這裏瘋了。 在我的Qt應用程序中,用戶可以動態更改適用於我自己翻譯的完美語言。它不適用於我對QFileDialog的調用。相應的代碼:QFileDialog動態翻譯

void myapp::change_language(std::string& lang_str){ 
    // my own translations works 
    qApp->removeTranslator(&this->app_lang); 
    this->app_lang.load(QString::fromStdString(lang_str)); 
    qApp->installTranslator(&this->app_lang); 

    // system translations, works not for qfiledialog 
    qApp->removeTranslator(&this->app_lang_qt); 
    bool test = this->app_lang_qt.load("qt_fr.qm"); // returns true 
    qApp->installTranslator(&this->app_lang_qt); 
} 

而且

void myapp::changeEvent(QEvent* event){ 
    if(event->type() == QEvent::LanguageChange){ 
     this->ui.retranslateUi(this); 
    } 
    QMainWindow::changeEvent(event); 
} 

隨着

QTranslator app_lang; 
QTranslator app_lang_qt; 

固定字符串 「qt_fr.qm」 只是用於測試目的,因爲法國是容易被檢測到。

我想要的是將靜態調用中的語言更改爲QFileDialog和QMessageBox,但語言僅在QMessageBox中更改,而不是在QFileDialog中更改。對於這兩個類,我只是調用靜態成員來解決問題。我也試着在main.cpp中安裝這個翻譯器,結果相同。

+0

另一個解決方案的不同之處在於它加載了Qt translation FIRST。並且不使用app_lang_qt,而是調用「installTranslator」。 – RedX

+0

感謝您的回覆。我會嘗試更改訂單,但應該沒有什麼不同,因爲文檔狀態可以安裝多個翻譯器。我不太瞭解你評論的第二部分。鏈接解決方案是主要功能,因此可以使用本地QTranslator。我實現了一個動態變化,它需要我將QTranslator保存在某個地方,所以我有兩個變量。此外,將代碼移到main()並不能解決問題。 – Bowdzone

+0

是的,不幸的是,改變順序並沒有解決問題。 – Bowdzone

回答

3

默認情況下,QFileDialog將使用本機文件瀏覽器而不是基於自定義Qt的對話框。原生文件瀏覽器將使用操作系統語言,而不是Qt語言,並且不會將Qt轉換應用於它。您可以使用QFileDialogDontUseNativeDialog選項覆蓋此行爲。

+0

這到底是怎麼想到的?非常感謝你! – Bowdzone