Qt實現多語言切換 - Qt語言家

前言

爲了支持國際化最關鍵的地方是製作多國語言包,然後再實現動態切換。QT裏面既可以採用命令行也可以採用Qt Creator的界面操作來生成,這裏我們利用Qt Creator來生成多國語言包。
基本流程是

  1. 生成ts文件;
  2. 生成qm文件;
  3. 最後通過QTranslator類來加載qm文件,實現多語言包的切換。

注意:爲了更全面地實現多語言包,在程序中所有涉及到界面中的按鈕或者菜單中的文字顯示,都必須使用 QObject::tr("…") 的方式將顯示的內容包裹起來,這樣做的原因是:只有添加了QObject::tr()的標記,生成ts文件的時候程序纔會認爲被QObject::tr()包裹的地方是需要製作多語言的,從而在ts中預留出位置。

1. 生成ts文件

1.1 在pro文件中添加

TRANSLATIONS = languages/lang_English.ts \
               languages/lang_Chinese.ts

在pro文件中,加入說明,其中“lang_English.ts”與“llang_Chinses.ts”爲設置語言文件的名稱,這裏使用中文與英語兩種語言,當你需要其他更多的語言時,添加多個語言文檔即可。
注:languages文件夾需事先創建。

1.2 語言文字在程序中說明

爲了Qt識別你在程序中需要語言準換的文字,需要將需要轉換的文字使用QObject::tr(“…”) 進行標記,否則程序中並不能對其進行識別。例如:

qDebug()<<tr("Output Info: ")<<tr("Language - English");

而在ui窗口直接進行添加一些插件中的語言,一般默認可以識別進行翻譯的。如果我們想將其關掉,可以選擇插件的屬性,將toolTip中“可翻譯的”直接取消勾選即可。
在這裏插入圖片描述

1.3 生成ts文件

執行【工具】–>【外部】–>【Qt語言家】–>【更新翻譯(lupdate)】,如下圖所示,執行完成後languages目錄下會自動生成lang_English.ts和lang_Chinese.ts文件。
在這裏插入圖片描述

1.4 修改ts文件

利用Qt中自帶的Linguist打開剛剛生成的st文件,根據相應的語言,進行語言轉換。
lang_Chinese.ts
在這裏插入圖片描述lang_English.ts
在這裏插入圖片描述

2 生成qm文件

ts文件翻譯結束以後,點擊保存,然後在Qt Creator中,使用:工具->外部->Qt預言家->部署翻譯(lrelease),就會生成需要的qm文件。
在這裏插入圖片描述

3 加載qm語言包

將生成的qm文件複製到發佈版本中相應的位置,然後在程序中加載

void MainWindow::loadLanguage(const QString langflag)
{
    if(langflag.isEmpty())
        return;

    QString langqmfilepath;

    if(langflag.compare("en") == 0)
    {
        langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_English.qm");
    }
    else if(langflag.compare("zh") == 0)
    {
        langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_Chinese.qm");
    }

    if(QFile(langqmfilepath).exists())
    {
        m_translator->load(langqmfilepath);
        qApp->installTranslator(m_translator);
    }
    else
        qDebug()<<"[houqd] authclient language file does not exists ...";

	//重新刷新界面
    ui->retranslateUi(this);

}

其中,m_translator即爲QTranslator實例,在類的構造函數中賦值:m_translator = new QTranslator;實現過程很簡單,就是取得語言包的絕對路徑,然後利用QTranslator來加載它,再利用qApp->installTranslator(m_translator)來安裝,最後還應該將顯示界面重新顯示一次進行更新。
主界面可以直接藉助ui->retranslateUi(this)進行重新設置界面顯示,但是這個只能更新當前頁面,其餘浮動頁面並不能直接顯示出來。需要按照以下格式將每一個需要顯示的頁面添加相應的程序。
示例
myDialog.h

void changeEvent(QEvent *event);

myDialog.cpp

void myDialog::changeEvent(QEvent *event)
{
    QDialog::changeEvent(event);
    switch (event->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;

    }
}

示例參見:https://gitee.com/null_712_5588/CSDNBlogDemo/tree/master/QtLanguageSwitchTest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章