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

Qt 學習之路 (34):國際化實戰進階——tr() 進階用法與 Qt 內建翻譯

     編輯:關於C++

tr() 函式完整簽名與參數詳解


static QString tr(const char *sourceText, const char *comment = 0, int n = -1);
  • sourceText:待翻譯原文。若 .qm 檔有對應譯文則替換,否則顯示原文。
  • comment:翻譯備註,解決多義詞歧義 (如 "table" 可為桌子/表格)。翻譯人員僅拿 .ts 檔時極重要。
  • n:複數形式控制參數。支援語言複數規則 (英文單/複數、斯拉夫語多重複數等)。

複數形式實戰範例


int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));

Qt 自動根據 n 值選擇翻譯:

n英文翻譯結果
00 messages saved
11 message saved
22 messages saved
55 messages saved

.ts 檔中需定義多種複數形式,Qt Linguist 提供介面編輯。

非 QObject 環境使用翻譯

tr() 為 QObject 靜態函式,非繼承類別 (如 main()) 無法直接呼叫。兩種解法:

  1. 顯式限定:QObject::tr("MyApp")
  2. 使用 QCoreApplication::translate():qApp->translate("MyApp") (qApp 為全域單例巨集)

// main.cpp
QApplication app(argc, argv);
w.setWindowTitle(qApp->translate("MyApp"));  // 或 QObject::tr("MyApp")

動態參數格式化:arg() 機制

翻譯文本包含動態資料時,必須使用 %1~%9 佔位符 + arg(),不可用字串拼接:


// 正確:可翻譯、參數獨立
QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path));

// 錯誤:字串拼接導致無法提取翻譯
QMessageBox::information(NULL, tr("Path"), "You selected\n" + path);

arg() 支援多型別、多參數鏈式呼叫:tr("File %1, Line %2").arg(file).arg(line)。

翻譯函式外部字串:QT_TR_NOOP 與 QT_TRANSLATE_NOOP

靜態陣列、全域常數等非函式內字串需標記供 lupdate 提取:


// 單一類別內部使用
QString FriendlyConversation::greeting(int type) {
    static const char *greeting_strings[] = {
        QT_TR_NOOP("Hello"),
        QT_TR_NOOP("Goodbye")
    };
    return tr(greeting_strings[type]);  // 執行時翻譯
}

// 跨類別/全域使用:需指定上下文類別名
static const char *greeting_strings[] = {
    QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
    QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
};

QString FriendlyConversation::greeting(int type) {
    return tr(greeting_strings[type]);
}

QString global_greeting(int type) {
    return qApp->translate("FriendlyConversation", greeting_strings[type]);
}
  • QT_TR_NOOP:標記字串供提取,執行時用 tr() 翻譯 (上下文為呼叫類別)。
  • QT_TRANSLATE_NOOP:指定上下文類別名,執行時用 qApp->translate(context, str) 翻譯。

載入 Qt 內建翻譯:完整中文化

僅載入應用 .qm 檔無法翻譯 Qt 內建對話框 (如檔案選擇對話框)。需額外載入 Qt 官方翻譯檔:


int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    
    // 1. 載入應用翻譯
    QTranslator appTranslator;
    appTranslator.load("myapp.qm");
    a.installTranslator(&appTranslator);
    
    // 2. 載入 Qt 內建翻譯 (從 Qt 安裝目錄 translations/ 複製 qt_zh_CN.qm 至執行檔目錄)
    QTranslator qtTranslator;
    qtTranslator.load("qt_zh_CN.qm");
    a.installTranslator(&qtTranslator);
    
    MainWindow w;
    w.resize(800, 600);
    w.show();
    return a.exec();
}

關鍵點:

  • 可安裝多個 QTranslator,按安裝順序查找。
  • qt_zh_CN.qm 位於 $QTDIR/translations/,需部署隨應用釋放。
  • .qm 檔為二進位高度優化格式,體積極小,適合動態載入切換語言。

國際化完整工作流總結

  1. 程式碼中用 tr() 標記所有可見字串,善用 comment 與 n 參數。
  2. .pro 加入 TRANSLATIONS += myapp.ts。
  3. 執行 lupdate myapp.pro 產生/更新 .ts 檔 (XML 格式,增量更新)。
  4. 用 Qt Linguist 開啟 .ts 翻譯,完成後「發布」產生 .qm。
  5. main() 中建立 QTranslator、load() .qm、installTranslator()。
  6. .qm 檔置於執行檔同目錄 (相對路徑載入)。
  7. 如需系統對話框中文化,額外載入 qt_XX.qm。

Qt 國際化機制成熟完善,支援動態語言切換、複數形式、上下文區隔,是跨平台應用全球化部署的強力工具。

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