承上篇完成基本翻譯流程,本文深入 tr() 進階用法、非 QObject 環境翻譯、複數形式處理、延遲標記巨集,以及 Qt 內建元件的翻譯載入。
static QString tr(const char *sourceText,
const char *comment = 0,
int n = -1);
%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" 等,無需手寫邏輯判斷。
main() 或非 QObject 子類別無法直接呼叫 tr(),兩種替代寫法:
// 方案 1:顯式指定類別
w.setWindowTitle(QObject::tr("MyApp"));
// 方案 2:使用 QCoreApplication 單例 (qApp 巨集)
w.setWindowTitle(qApp->translate("MyApp"));
錯誤寫法 (無法提取翻譯):
tr("You selected\n") + path // 字串串接破壞提取
正確寫法:
tr("You selected\n%1").arg(path) // 保持完整字串結構
用於靜態陣列、全域變數等非即時翻譯場景:
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_zh_TW.qm (位於 Qt 安裝目錄 translations/):
QTranslator qtTranslator2;
qtTranslator2.load("qt_zh_TW.qm");
a.installTranslator(&qtTranslator2);
安裝後,QFileDialog、QMessageBox 等標準按鈕 (開啟/儲存/確定/取消) 皆自動顯示為目標語言。
Qt 國際化體系完整支援:字串標記、上下文備註、複數形式、延遲翻譯、動態參數、內建元件翻譯、多語系動態切換。掌握這些技巧即可構建專業級多語言應用程式。