Qt使用Qt Linguist 實現(xiàn)多語言切換
前言
在開發(fā)跨國應(yīng)用時,國際化(i18n)是必不可少的功能。Qt 提供了強大的國際化支持,通過 Qt Linguist 工具可以輕松實現(xiàn)多語言切換。本文將詳細介紹如何使用 Qt Linguist,并提供完整的代碼示例。
一、Qt 國際化工作流程
1. 代碼中使用 tr() 標記需要翻譯的文本
2. 使用 lupdate 生成 .ts 翻譯文件
3. 使用 Qt Linguist 進行翻譯
4. 使用 lrelease 編譯為 .qm 文件
5. 在程序中動態(tài)加載翻譯文件
二、項目配置
1. .pro 文件配置
QT += core gui widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MultiLanguageApp
TEMPLATE = app
CONFIG += c++11
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# ========== 國際化配置 ==========
TRANSLATIONS += \
translations/app_zh_CN.ts \
translations/app_en_US.ts
# 編譯時自動生成 .qm 文件
CONFIG += lrelease
# 將 .qm 文件嵌入到資源中
CONFIG += embed_translations
# 資源文件
RESOURCES += resources.qrc
2. 創(chuàng)建資源文件 resources.qrc
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/translations">
<file>translations/app_zh_CN.qm</file>
<file>translations/app_en_US.qm</file>
</qresource>
</RCC>三、界面設(shè)計
mainwindow.ui
在 Qt Designer 中創(chuàng)建界面:
┌─────────────────────────────────────┐ │ Multi-Language Application │ ├─────────────────────────────────────┤ │ │ │ ┌─────────────────────────────┐ │ │ │ Welcome to Qt Application │ │ │ └─────────────────────────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Chinese │ │ English │ │ │ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────┘
控件對象名:
QPushButton→ChineseQPushButton→EnglishQLabel→label_welcome
四、頭文件 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTranslator>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
// 語言切換槽函數(shù)
void on_Chinese_clicked();
void on_English_clicked();
protected:
// 重寫事件處理函數(shù),用于動態(tài)更新界面文本
void changeEvent(QEvent *event) override;
private:
void retranslateCustomUI(); // 手動更新界面文本
private:
Ui::MainWindow *ui;
QTranslator m_translator; // 翻譯器對象
};
#endif // MAINWINDOW_H
五、源文件 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 設(shè)置窗口標題
setWindowTitle(tr("多語言應(yīng)用程序"));
// 初始化界面文本
retranslateCustomUI();
}
MainWindow::~MainWindow()
{
delete ui;
}
// ========== 切換到中文 ==========
void MainWindow::on_Chinese_clicked()
{
qDebug() << "[MainWindow] 切換到中文";
// 移除舊的翻譯器
qApp->removeTranslator(&m_translator);
// 加載中文翻譯文件
if (m_translator.load(":/translations/app_zh_CN.qm")) {
qApp->installTranslator(&m_translator);
qDebug() << "[MainWindow] 中文翻譯文件加載成功";
QMessageBox::information(this, tr("提示"), tr("已切換到中文"));
} else {
qWarning() << "[MainWindow] 中文翻譯文件加載失敗";
QMessageBox::warning(this, tr("警告"), tr("中文翻譯文件加載失敗"));
}
}
// ========== 切換到英文 ==========
void MainWindow::on_English_clicked()
{
qDebug() << "[MainWindow] 切換到英文";
// 移除舊的翻譯器
qApp->removeTranslator(&m_translator);
// 加載英文翻譯文件
if (m_translator.load(":/translations/app_en_US.qm")) {
qApp->installTranslator(&m_translator);
qDebug() << "[MainWindow] 英文翻譯文件加載成功";
QMessageBox::information(this, tr("Tip"), tr("Switched to English"));
} else {
qWarning() << "[MainWindow] 英文翻譯文件加載失敗";
QMessageBox::warning(this, tr("Warning"), tr("Failed to load English translation"));
}
}
// ========== 事件處理:語言改變時更新界面 ==========
void MainWindow::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
// 更新 UI 自動生成的翻譯
ui->retranslateUi(this);
// 更新自定義的翻譯
retranslateCustomUI();
qDebug() << "[MainWindow] 界面語言已更新";
}
QMainWindow::changeEvent(event);
}
// ========== 手動更新界面文本 ==========
void MainWindow::retranslateCustomUI()
{
// 更新窗口標題
setWindowTitle(tr("多語言應(yīng)用程序"));
// 更新標簽文本(如果有動態(tài)文本)
ui->label_welcome->setText(tr("歡迎使用 Qt 多語言應(yīng)用!"));
// 更新按鈕文本(也可以在 .ui 文件中直接用 tr())
ui->Chinese->setText(tr("中文"));
ui->English->setText(tr("English"));
qDebug() << "[MainWindow] 自定義界面文本已更新";
}
六、主函數(shù) main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 根據(jù)系統(tǒng)語言自動加載翻譯
QTranslator translator;
QString locale = QLocale::system().name(); // 如:zh_CN、en_US
qDebug() << "[main] 系統(tǒng)語言:" << locale;
QString translationFile = QString(":/translations/app_%1.qm").arg(locale);
if (translator.load(translationFile)) {
a.installTranslator(&translator);
qDebug() << "[main] 已自動加載翻譯文件:" << translationFile;
} else {
qDebug() << "[main] 未找到翻譯文件,使用默認語言(中文)";
// 默認加載中文
if (translator.load(":/translations/app_zh_CN.qm")) {
a.installTranslator(&translator);
qDebug() << "[main] 已加載中文翻譯";
}
}
MainWindow w;
w.show();
return a.exec();
}
七、生成翻譯文件
1. 創(chuàng)建 translations 目錄
mkdir translations
2. 生成 .ts 文件
lupdate MultiLanguageApp.pro
生成的文件:
translations/ ├── app_zh_CN.ts └── app_en_US.ts
3. 查看 .ts 文件內(nèi)容(自動生成)
app_zh_CN.ts:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>MainWindow</name>
<message>
<location filename="mainwindow.cpp" line="15"/>
<source>多語言應(yīng)用程序</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.cpp" line="34"/>
<source>提示</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.cpp" line="34"/>
<source>已切換到中文</source>
<translation type="unfinished"></translation>
</message>
<!-- 更多條目... -->
</context>
</TS>
八、使用 Qt Linguist 翻譯
1. 打開 Qt Linguist
linguist translations/app_zh_CN.ts
2. 翻譯界面
┌────────────────────────────────────────────────────┐ │ Context: MainWindow │ ├────────────────────────────────────────────────────┤ │ Source text │ Translation │ ├──────────────────────┼─────────────────────────────┤ │ 多語言應(yīng)用程序 │ 多語言應(yīng)用程序 │ │ 提示 │ 提示 │ │ 已切換到中文 │ 已切換到中文 │ │ 歡迎使用 Qt 多語言應(yīng)用!│ 歡迎使用 Qt 多語言應(yīng)用! │ │ 中文 │ 中文 │ │ English │ English │ └──────────────────────┴─────────────────────────────┘
3. 翻譯英文(app_en_US.ts)
linguist translations/app_en_US.ts
翻譯示例:
???????Source text ? ? ? ? ? ? → Translation 多語言應(yīng)用程序 ? ? ? ? ? ? → Multi-Language Application 提示 ? ? ? ? ? ? ? ? ? ?→ Tip 已切換到中文 ? ? ? ? ? ? → Switched to Chinese 歡迎使用 Qt 多語言應(yīng)用! ?→ Welcome to Qt Multi-Language App! 中文 ? ? ? ? ? ? ? ? ? ?→ Chinese English ? ? ? ? ? ? ? ? → English
4. 保存并標記為完成
- 翻譯完成后點擊 "File" → "Save"
- 標記為完成:右鍵 → "Mark as finished"
九、編譯翻譯文件
方法一:自動編譯(推薦)
如果 .pro 文件中配置了:
CONFIG += lrelease CONFIG += embed_translations
直接編譯項目即可:
qmake make
方法二:手動編譯
lrelease MultiLanguageApp.pro
生成的文件:
translations/ ├── app_zh_CN.ts ├── app_zh_CN.qm ← 編譯后的二進制文件 ├── app_en_US.ts └── app_en_US.qm ← 編譯后的二進制文件
十、運行效果
初始狀態(tài)(中文)
┌─────────────────────────────────────┐ │ 多語言應(yīng)用程序 │ ├─────────────────────────────────────┤ │ 歡迎使用 Qt 多語言應(yīng)用! │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 中文 │ │ English │ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────┘
點擊 "English" 后
┌─────────────────────────────────────┐ │ Multi-Language Application │ ├─────────────────────────────────────┤ │ Welcome to Qt Multi-Language App! │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Chinese │ │ English │ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────┘
十一、高級技巧
1. 帶參數(shù)的翻譯
QString filename = "test.txt";
QString message = tr("文件 %1 加載成功").arg(filename);
// 中文:文件 test.txt 加載成功
// 英文:File test.txt loaded successfully在 Linguist 中翻譯:
Source: 文件 %1 加載成功 Translation: File %1 loaded successfully
2. 復數(shù)形式
int n = 5;
QString message = tr("You have %n unread message(s)", "", n);在 Linguist 中翻譯:
<message numerus="yes">
<source>You have %n unread message(s)</source>
<translation>
<numerusform>You have %n unread message</numerusform>
<numerusform>You have %n unread messages</numerusform>
</translation>
</message>3. 上下文翻譯(避免歧義)
// 不同上下文中的相同單詞
QString text1 = tr("File"); // 文件(名詞)
QString text2 = tr("File", "verb"); // 歸檔(動詞)十二、常見問題
Q1: 翻譯不生效?
檢查清單:
- 是否調(diào)用了
qApp->installTranslator(&translator) .qm文件是否存在于資源路徑中- 是否調(diào)用了
ui->retranslateUi(this) - 是否重寫了
changeEvent()函數(shù)
Q2: 動態(tài)文本不更新?
解決方案:
void MainWindow::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
ui->retranslateUi(this); // 更新 UI 自動生成的文本
retranslateCustomUI(); // 更新自定義文本
}
QMainWindow::changeEvent(event);
}Q3: 如何調(diào)試翻譯?
qDebug() << "當前翻譯:" << tr("測試文本");
qDebug() << "系統(tǒng)語言:" << QLocale::system().name();十三、完整項目結(jié)構(gòu)
MultiLanguageApp/
├── main.cpp
├── mainwindow.h
├── mainwindow.cpp
├── mainwindow.ui
├── MultiLanguageApp.pro
├── resources.qrc
└── translations/
├── app_zh_CN.ts
├── app_zh_CN.qm
├── app_en_US.ts
└── app_en_US.qm總結(jié)
通過本文,您應(yīng)該已經(jīng)掌握了:
- ? 如何配置 Qt 國際化項目
- ? 如何使用
tr()標記需要翻譯的文本 - ? 如何使用 Qt Linguist 翻譯
- ? 如何實現(xiàn)語言動態(tài)切換
- ? 如何處理帶參數(shù)和復數(shù)形式的翻譯
Qt 的國際化支持非常強大,合理使用可以讓您的應(yīng)用輕松走向全球!
到此這篇關(guān)于Qt使用Qt Linguist 實現(xiàn)多語言切換的文章就介紹到這了,更多相關(guān)Qt Linguist 多語言切換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
全面解析設(shè)計模式中的建造者模式及相關(guān)C++實現(xiàn)
這篇文章主要介紹了設(shè)計模式中的建造者模式及相關(guān)C++實現(xiàn),需要的朋友可以參考下2016-03-03

