Qt使用Qt Linguist 實(shí)現(xiàn)多語(yǔ)言切換
前言
在開發(fā)跨國(guó)應(yīng)用時(shí),國(guó)際化(i18n)是必不可少的功能。Qt 提供了強(qiáng)大的國(guó)際化支持,通過 Qt Linguist 工具可以輕松實(shí)現(xiàn)多語(yǔ)言切換。本文將詳細(xì)介紹如何使用 Qt Linguist,并提供完整的代碼示例。
一、Qt 國(guó)際化工作流程
1. 代碼中使用 tr() 標(biāo)記需要翻譯的文本
2. 使用 lupdate 生成 .ts 翻譯文件
3. 使用 Qt Linguist 進(jìn)行翻譯
4. 使用 lrelease 編譯為 .qm 文件
5. 在程序中動(dòng)態(tài)加載翻譯文件
二、項(xiàng)目配置
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
# ========== 國(guó)際化配置 ==========
TRANSLATIONS += \
translations/app_zh_CN.ts \
translations/app_en_US.ts
# 編譯時(shí)自動(dòng)生成 .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è)計(jì)
mainwindow.ui
在 Qt Designer 中創(chuàng)建界面:
┌─────────────────────────────────────┐ │ Multi-Language Application │ ├─────────────────────────────────────┤ │ │ │ ┌─────────────────────────────┐ │ │ │ Welcome to Qt Application │ │ │ └─────────────────────────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Chinese │ │ English │ │ │ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────┘
控件對(duì)象名:
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:
// 語(yǔ)言切換槽函數(shù)
void on_Chinese_clicked();
void on_English_clicked();
protected:
// 重寫事件處理函數(shù),用于動(dòng)態(tài)更新界面文本
void changeEvent(QEvent *event) override;
private:
void retranslateCustomUI(); // 手動(dòng)更新界面文本
private:
Ui::MainWindow *ui;
QTranslator m_translator; // 翻譯器對(duì)象
};
#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è)置窗口標(biāo)題
setWindowTitle(tr("多語(yǔ)言應(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"));
}
}
// ========== 事件處理:語(yǔ)言改變時(shí)更新界面 ==========
void MainWindow::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
// 更新 UI 自動(dòng)生成的翻譯
ui->retranslateUi(this);
// 更新自定義的翻譯
retranslateCustomUI();
qDebug() << "[MainWindow] 界面語(yǔ)言已更新";
}
QMainWindow::changeEvent(event);
}
// ========== 手動(dòng)更新界面文本 ==========
void MainWindow::retranslateCustomUI()
{
// 更新窗口標(biāo)題
setWindowTitle(tr("多語(yǔ)言應(yīng)用程序"));
// 更新標(biāo)簽文本(如果有動(dòng)態(tài)文本)
ui->label_welcome->setText(tr("歡迎使用 Qt 多語(yǔ)言應(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)語(yǔ)言自動(dòng)加載翻譯
QTranslator translator;
QString locale = QLocale::system().name(); // 如:zh_CN、en_US
qDebug() << "[main] 系統(tǒng)語(yǔ)言:" << locale;
QString translationFile = QString(":/translations/app_%1.qm").arg(locale);
if (translator.load(translationFile)) {
a.installTranslator(&translator);
qDebug() << "[main] 已自動(dòng)加載翻譯文件:" << translationFile;
} else {
qDebug() << "[main] 未找到翻譯文件,使用默認(rèn)語(yǔ)言(中文)";
// 默認(rèn)加載中文
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)容(自動(dòng)生成)
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ǔ)言應(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ǔ)言應(yīng)用程序 │ 多語(yǔ)言應(yīng)用程序 │ │ 提示 │ 提示 │ │ 已切換到中文 │ 已切換到中文 │ │ 歡迎使用 Qt 多語(yǔ)言應(yīng)用!│ 歡迎使用 Qt 多語(yǔ)言應(yīng)用! │ │ 中文 │ 中文 │ │ English │ English │ └──────────────────────┴─────────────────────────────┘
3. 翻譯英文(app_en_US.ts)
linguist translations/app_en_US.ts
翻譯示例:
???????Source text ? ? ? ? ? ? → Translation 多語(yǔ)言應(yīng)用程序 ? ? ? ? ? ? → Multi-Language Application 提示 ? ? ? ? ? ? ? ? ? ?→ Tip 已切換到中文 ? ? ? ? ? ? → Switched to Chinese 歡迎使用 Qt 多語(yǔ)言應(yīng)用! ?→ Welcome to Qt Multi-Language App! 中文 ? ? ? ? ? ? ? ? ? ?→ Chinese English ? ? ? ? ? ? ? ? → English
4. 保存并標(biāo)記為完成
- 翻譯完成后點(diǎn)擊 "File" → "Save"
- 標(biāo)記為完成:右鍵 → "Mark as finished"
九、編譯翻譯文件
方法一:自動(dòng)編譯(推薦)
如果 .pro 文件中配置了:
CONFIG += lrelease CONFIG += embed_translations
直接編譯項(xiàng)目即可:
qmake make
方法二:手動(dòng)編譯
lrelease MultiLanguageApp.pro
生成的文件:
translations/ ├── app_zh_CN.ts ├── app_zh_CN.qm ← 編譯后的二進(jìn)制文件 ├── app_en_US.ts └── app_en_US.qm ← 編譯后的二進(jìn)制文件
十、運(yùn)行效果
初始狀態(tài)(中文)
┌─────────────────────────────────────┐ │ 多語(yǔ)言應(yīng)用程序 │ ├─────────────────────────────────────┤ │ 歡迎使用 Qt 多語(yǔ)言應(yīng)用! │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 中文 │ │ English │ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────┘
點(diǎn)擊 "English" 后
┌─────────────────────────────────────┐ │ Multi-Language Application │ ├─────────────────────────────────────┤ │ Welcome to Qt Multi-Language App! │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Chinese │ │ English │ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────┘
十一、高級(jí)技巧
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. 復(fù)數(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"); // 歸檔(動(dòng)詞)十二、常見問題
Q1: 翻譯不生效?
檢查清單:
- 是否調(diào)用了
qApp->installTranslator(&translator) .qm文件是否存在于資源路徑中- 是否調(diào)用了
ui->retranslateUi(this) - 是否重寫了
changeEvent()函數(shù)
Q2: 動(dòng)態(tài)文本不更新?
解決方案:
void MainWindow::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
ui->retranslateUi(this); // 更新 UI 自動(dòng)生成的文本
retranslateCustomUI(); // 更新自定義文本
}
QMainWindow::changeEvent(event);
}Q3: 如何調(diào)試翻譯?
qDebug() << "當(dāng)前翻譯:" << tr("測(cè)試文本");
qDebug() << "系統(tǒng)語(yǔ)言:" << QLocale::system().name();十三、完整項(xiàng)目結(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 國(guó)際化項(xiàng)目
- ? 如何使用
tr()標(biāo)記需要翻譯的文本 - ? 如何使用 Qt Linguist 翻譯
- ? 如何實(shí)現(xiàn)語(yǔ)言動(dòng)態(tài)切換
- ? 如何處理帶參數(shù)和復(fù)數(shù)形式的翻譯
Qt 的國(guó)際化支持非常強(qiáng)大,合理使用可以讓您的應(yīng)用輕松走向全球!
到此這篇關(guān)于Qt使用Qt Linguist 實(shí)現(xiàn)多語(yǔ)言切換的文章就介紹到這了,更多相關(guān)Qt Linguist 多語(yǔ)言切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用C++實(shí)現(xiàn)計(jì)算機(jī)輔助教學(xué)系統(tǒng)
我們都知道計(jì)算機(jī)在教育中起的作用越來越大。這篇文章主要為大家詳細(xì)介紹了如何利用C++編寫一個(gè)計(jì)算機(jī)輔助教學(xué)系統(tǒng),感興趣的可以了解一下2023-05-05
全面解析設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn)
這篇文章主要介紹了設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn),需要的朋友可以參考下2016-03-03
C語(yǔ)言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)
C語(yǔ)言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ(yǔ)法檢查并不象其它高級(jí)語(yǔ)言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來了許多不便,尤其對(duì)初學(xué)C語(yǔ)言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤2013-07-07
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

