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

Qt 學習之路 (34):國際化進階技巧 (下)

     編輯:關於C語言

承上篇完成基本翻譯流程,本文深入 tr() 進階用法、非 QObject 環境翻譯、複數形式處理、延遲標記巨集,以及 Qt 內建元件的翻譯載入。

tr() 完整簽名與三大參數

static QString tr(const char *sourceText,
                  const char *comment = 0,
                  int n = -1);
  • sourceText:原始字串,無翻譯時回退顯示
  • comment:給翻譯人員的備註 (如區分 "table" 為桌子/表格)
  • n:複數判斷依據,配合 %n 佔位符自動選擇單/複數翻譯

複數形式範例

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

Qt 依 n 值自動切換:0→"0 message saved"、1→"1 message saved"、2+→"2 messages saved" 等,無需手寫邏輯判斷。

非 QObject 類別/全域函式的翻譯方案

main() 或非 QObject 子類別無法直接呼叫 tr(),兩種替代寫法:

// 方案 1:顯式指定類別
w.setWindowTitle(QObject::tr("MyApp"));

// 方案 2:使用 QCoreApplication 單例 (qApp 巨集)
w.setWindowTitle(qApp->translate("MyApp"));

動態參數插值:必須使用 %1 + arg()

錯誤寫法 (無法提取翻譯):

tr("You selected\n") + path  // 字串串接破壞提取

正確寫法:

tr("You selected\n%1").arg(path)  // 保持完整字串結構

延遲翻譯標記:QT_TR_NOOP / QT_TRANSLATE_NOOP

用於靜態陣列、全域變數等非即時翻譯場景:

static const char *greeting_strings[] = {
    QT_TR_NOOP("Hello"),
    QT_TR_NOOP("Goodbye")
};
// 稍後在 QObject 成員函式中翻譯
return tr(greeting_strings[type]);

跨類別需攜帶上下文時使用 QT_TRANSLATE_NOOP("Context", "String"),配合 qApp->translate("Context", str)。

翻譯 Qt 內建對話框 (檔案選擇器、訊息盒等)

需額外載入 Qt 官方提供的語系檔 qt_zh_TW.qm (位於 Qt 安裝目錄 translations/):

QTranslator qtTranslator2;
qtTranslator2.load("qt_zh_TW.qm");
a.installTranslator(&qtTranslator2);

安裝後,QFileDialog、QMessageBox 等標準按鈕 (開啟/儲存/確定/取消) 皆自動顯示為目標語言。

總結

Qt 國際化體系完整支援:字串標記、上下文備註、複數形式、延遲翻譯、動態參數、內建元件翻譯、多語系動態切換。掌握這些技巧即可構建專業級多語言應用程式。

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