static QString tr(const char *sourceText, const char *comment = 0, int n = -1);
int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));
Qt 自動根據 n 值選擇翻譯:
| n | 英文翻譯結果 |
|---|---|
| 0 | 0 messages saved |
| 1 | 1 message saved |
| 2 | 2 messages saved |
| 5 | 5 messages saved |
.ts 檔中需定義多種複數形式,Qt Linguist 提供介面編輯。
tr() 為 QObject 靜態函式,非繼承類別 (如 main()) 無法直接呼叫。兩種解法:
QObject::tr("MyApp")qApp->translate("MyApp") (qApp 為全域單例巨集)
// main.cpp
QApplication app(argc, argv);
w.setWindowTitle(qApp->translate("MyApp")); // 或 QObject::tr("MyApp")
翻譯文本包含動態資料時,必須使用 %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)。
靜態陣列、全域常數等非函式內字串需標記供 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) 翻譯。僅載入應用 .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/,需部署隨應用釋放。tr() 標記所有可見字串,善用 comment 與 n 參數。.pro 加入 TRANSLATIONS += myapp.ts。lupdate myapp.pro 產生/更新 .ts 檔 (XML 格式,增量更新)。main() 中建立 QTranslator、load() .qm、installTranslator()。qt_XX.qm。Qt 國際化機制成熟完善,支援動態語言切換、複數形式、上下文區隔,是跨平台應用全球化部署的強力工具。