首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 國際化完整實戰:動態多語言切換與翻譯流程

     編輯:關於C語言

核心需求:無需重啟的動態語言切換

優秀的國際化應用應支援:啟動時載入預設/上次語言、運行時透過選單即時切換語言、介面文字即時更新。

多語言切換示意動畫

實作四步驟

  1. 文字國際化標記:所有可見文字包裹在 tr() 中
  2. 提供切換介面:如語言下拉選單
  3. 重寫 changeEvent:攔截 QEvent::LanguageChange,調用 translateUI() 重新套用文字
  4. 載入翻譯檔:使用 QTranslator 載入 .qm 檔並安裝至 qApp

關鍵程式碼架構

語言枚舉與中介資料註冊

typedef enum { UI_ZH, UI_EN } LANGUAGE;
Q_DECLARE_METATYPE(LANGUAGE)  // 讓自訂型別可用於 QVariant
qRegisterMetaType("LANGUAGE");  // 讓自訂型別可用於訊號槽

設定對話框:語言切換發射訊號

void SettingDialog::onIndexChanged() {
    LANGUAGE lang = language_combo_box->currentData().value();
    emit switchLanguage(lang);
}

void SettingDialog::changeEvent(QEvent *event) {
    if (event->type() == QEvent::LanguageChange)
        translateUI();  // 重新套用所有 tr() 文字
    else
        QDialog::changeEvent(event);
}

主視窗:接收訊號、載入翻譯、持久化設定

void MainWidget::switchLanguage(LANGUAGE language) {
    QString qmPath;
    switch (language) {
        case UI_ZH: qmPath = ":/qm/main_widget_zh"; break;
        case UI_EN: qmPath = ":/qm/main_widget_en"; break;
    }
    if (current_language != language) {
        current_language = language;
        translator->load(qmPath);
        Util::writeInit("./user.ini", "language", QString::number(language));
    }
}

程式進入點:啟動時載入上次語言

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QTranslator translator;
    QString suffix = "zh";
    LANGUAGE lang = UI_ZH;

    // 讀取儲存設定
    QString value;
    if (Util::readInit("./user.ini", "language", value)) {
        lang = (LANGUAGE)value.toInt();
        if (lang == UI_EN) suffix = "en";
    }

    translator.load(":/qm/main_widget_" + suffix);
    app.installTranslator(&translator);
    // ... 建立主視窗並傳遞 translator ...
}

翻譯檔建立流程

  1. .pro 增加 TRANSLATIONS = Resource/main_widget_zh.ts Resource/main_widget_en.ts
  2. 執行 工具 → 外部 → Qt Linguist → 更新翻譯 產生 .ts
  3. 用 Qt Linguist 開啟 .ts 進行翻譯
  4. 選擇 檔案 → 發布 產生 .qm 二進位翻譯檔

更新翻譯選單

發布翻譯選單

載入翻譯檔一行搞定

QTranslator translator;
translator.load(":/qm/main_widget_zh");
app.installTranslator(&translator);

關鍵點:changeEvent 中的 QEvent::LanguageChange 會在 installTranslator 或 removeTranslator 後自動發送,確保所有視窗同步更新。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved