標籤:style color os 使用 io strong 檔案 ar 問題
如果我們程式需要翻譯成另外一種語言,那麼Qt Linguist 和Qt的翻譯工具已經為我們解決這個問題,它提供了一套解決方案,它們提供了如何組織和處理翻譯後字串的方法。
為了準備進行代碼翻譯,需要使用QObject::tr()函數,來包含需要翻譯的字串,當將其作用於非靜態函數時,他會將QMetaObject所提供對象的類名進行翻譯,作為要翻譯字串分組的“上下文”
tr()函數有兩個作用:
-
它使的QT的lupate工具可以提取所有可翻譯的字串
-
如果翻譯檔案可用,並且語言已經被選中,該函數就會返回翻譯後的字串
如果沒有可以使用的翻譯檔案,那麼tr()函數返回原始字串
注意:確保每個可翻譯的字串都完全在tr()函數內部,並且編譯時間刻被進行提取,這個是非常重要的,對於帶參數的字串,可以使用QString::arg()函數來將參數放置在翻譯過的字串中:
label->setText(tr("%1 + %2 = %3")) .arg(para1) .arg(para2) .arg(para3)
具體步驟:
-
在pro檔案中添加:
TRANSLATIONS = $$PWD/lang/chinese.ts \ $$PWD/lang/english.ts
2. 方法 一>使用Qt的終端使用lupdate pro檔案名稱,產生翻譯檔案chinese.ts和english.ts
方法 二>工具->外部->Qt語言家->更新翻譯,將產生翻譯檔案chinies.ts和english.ts
3.使用Qt Linguist編輯*.ts檔案,來進行翻譯工作
4. 方法 一>使用Qt的終端使用lrelease命令
方法 二>在Qt Linguist找到“發布”,就可以根據*.ts產生*.qm檔案,他們可以有應用程式來載入其翻譯
方法 三>工具->外部->Qt語言家->部署翻譯,將產生語言檔案qm
5. 載入翻譯檔案
QTranslator translator;translator.load("cn.qm");qApp->installTranslator(&translator);
用QT實現多國語言支援有兩種情況:
第一種:使用UI編輯器來自動產生介面,這種方式實現多語系的動態切換很容易。
void MainWindow::changeLanguage(const ELangType& langType){ switch(langType) { case ELangType_Chinese: { this->languageState = ELangType_Chinese; this->translator.load("chinese") ; qApp->installTranslator(&(this->translator)); break; } case ELangType_English: { this->languageState = ELangType_English; this->translator.load("english") ; qApp->installTranslator(&(this->translator)); break; } default: { break; } }}
這個函數是實現語言動態切換,其中languageType是用來記錄當前語言的狀態,qApp是QApplication對象,我們只需使用QTranslator載入不同的檔案就可以實現多語系的動態切換。
第二種:不使用UI編輯器,自己通過親自編程來設計應用程式介面,這種方式實現多語系動態切換比較繁瑣,注意不是難;
void MainWindow::changeLanguage(const ELangType& langType){ switch(langType) { case ELangType_Chinese: { this->languageState = ELangType_Chinese; this->translator.load("chinese") ; this->pOwner->installTranslator(&(this->translator)); break; } case ELangType_English: { this->languageState = ELangType_English; this->translator.load("english") ; this->pOwner->installTranslator(&(this->translator)); break; } default: { break; } } this->labelname->setText(tr("name")); this->labeltel->setText(tr("tel")); ........}
因此這個特別麻煩,每個介面都要進行類似這樣的操作,一般我會在每個介面使用一個retranslateUi()函數,把所有的
要翻譯的控制項放到裡面,每次翻譯的時候調用下就可以了
注意:第一個方法沒有再次從新設定tr(),原因如下
void MainWindow::changeEvent(QEvent *e){ QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this);//這裡實現語言翻譯器的更新。 .......}
tr()和國際化