2017-04-26 72 views
0

我正在使用Qt並希望翻譯由Qt小部件顯示的「本地」文本。通過「本地顯示的文本」,例如,我指的是用於文本編輯(複製,粘貼,...)的上下文菜單中顯示的文本。Qt - 使用內建翻譯

以下是我已經做了:

#include <QApplication> 
#include <QDebug> 
#include <QTranslator> 

#include <QFile> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTranslator translator; 
    if(translator.load("qt_fr.qm", QApplication::applicationDirPath())) { 
     qDebug() << a.installTranslator(&translator); 
    } 

    qDebug() << QFile::exists(QApplication::applicationDirPath() + "/qt_fr.qm"); // just to debug file existence 

    // MainWindow w;  // not related to my question 
    // w.showMaximized(); // neither is this 

    return a.exec(); 
} 

qt_fr.qm文件位於path_to_qt/Qt5.6.2/5.6/mingw49_32 /譯爲Qt5.6.2和MinGW用戶。我將所述文件複製到正在運行的軟件目錄,但翻譯器始終無法加載它。但是,當我使用我自己的qm文件(使用Qt lupdate和lrelease工具從.ts文件構建)時,qm文件已正確加載並安裝。

有什麼我失蹤或做錯了嗎?

+0

Qt會先追加一個後綴(默認'.qm'),所以我建議從文件名參數中刪除它。請注意,文檔建議使用接受'QLocale'作爲第一個參數的重載。例如,'translator.load(QLocale :: French,「qt」,QApplication :: applicationDirPath())'。 –

+0

確實如此:如果沒有擴展名被添加到文件名中,加載過程很簡單。但是由於Qt在加載失敗時回溯並重試,添加.qm擴展不應導致失敗。 我也試過QLocale的版本,但它仍然無法正常工作。任何其他建議將受到歡迎。 – misterFad

+0

此外,使用QLocale假定我們正在加載的qm文件與運行我們軟件的操作系統上安裝的語言匹配。但是,[有時​​候](https://camo.githubusercontent.com/8e48efe46e756e80f900584241c5c108ebc7fcef/68747470733a2f2f757365722e6f632d7374617469632e636f6d2f75706c6f61642f323031372f30312f32362f31343835343536393833393335385f696d6734372e706e67),我們可以同時是德國(例如)選擇英語。 當我使用我自己的.qm文件(lupdate&lrelease)時,上面提供的代碼片段工作正常,但是當加載Qt內置.qm文件時,加載過程失敗。 – misterFad

回答

1

我認爲問題可能是您沒有複製完整的消息目錄。我下面的作品在Debian系統上,使用質量管理文件的標準位置:

#include <QApplication> 
#include <QDebug> 
#include <QLocale> 
#include <QTranslator> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTranslator translator; 
    const QString dir = "/usr/share/qt5/translations"; 

    if (translator.load("qt_fr", dir)) { 
     qDebug() << "first load succeeded:" 
       << "'Open' =>" << translator.translate("QShortcut", "Open"); 
    } 

    if (translator.load(QLocale::French, "qt", "_", dir)) { 
     qDebug() << "second load succeeded:" 
       << "'Open' =>" << translator.translate("QShortcut", "Open"); 
    } 
} 

輸出是

first load succeeded: 'Open' => "Ouvrir" 
second load succeeded: 'Open' => "Ouvrir" 

(我刪除從文件名.qm,因爲Qt的將首先嚐試,並且我還展示瞭如何組合來自特定語言環境對象的文件名)。

如果我們檢查使用lconvert -of ts /usr/share/qt5/translations/qt_fr.qmqt_fr.qm文件中,我們可以看到,它只是一個非常小的文件,通過引用包括其他文件:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE TS> 
<TS version="2.1" language="fr_FR"> 
<dependencies> 
<dependency catalog="qtbase_fr"/> 
<dependency catalog="qtscript_fr"/> 
<dependency catalog="qtquick1_fr"/> 
<dependency catalog="qtmultimedia_fr"/> 
<dependency catalog="qtxmlpatterns_fr"/> 
</dependencies> 
</TS> 

我認爲你的症狀最可能的原因是,一個或更多的依賴文件無法加載。您應確保在複製了qt_fr.qm的相同位置提供所有這些文件區域 - 或者,如果您只需要「基本」翻譯,則只需複製qtbase_fr.qm,並適當更改您的translator.load()調用即可。

+0

事實上,我沒有複製依賴文件,這就是爲什麼翻譯者總是無法加載qm文件。我現在也意識到,由於我只想翻譯文本編輯上下文菜單,所以加載** qtbase_fr **完全適合我的需要,並且不需要依賴文件。非常感謝,如果可以的話,我會有10票贊成。 :)順便說一句,你怎麼知道lconvert工具?那是我從來沒有聽說過的,我對Qt並不陌生,除非有人告訴我,我知道沒有什麼魔術可以幫助我。 _趕時髦,這裏不是母語爲英語的人。 – misterFad

+1

LConvert似乎並不是很出名 - 它只是在Qt文檔中簡要提及,並沒有附帶手冊頁。我所知道的一切都是通過'lconvert -help'來學習的。是的,我應該建議你可能只需要'qtbase'的翻譯,但你似乎在沒有我的幫助的情況下解決了這個問題! :-)我爲最後的讀者編輯了最後一段。 –

+0

順便說一句,如果你真的*想要給10倍upvote,只是獲得更多的聲望,那麼你可以[獎賞賞金](/ help/privileges/set-bounties)。儘管如此,我仍然很高興,所以請保持你的收入。 –