文章目录
- 1、概要
- 2、多语言切换
- 2.1、结果展示
- 2.2、创建项目
- 2.2、绘制UI
- 2.2、生成“.st”文件
- 2.4、生成“.qm”文件
- 2.5、工程demo
1、概要
借助QT自带的翻译功能,实现实际应用用进行 “多语言切换”
2、多语言切换
2.1、结果展示
多语言切换
2.2、创建项目
1、文件,创建“新项目”————》“Application”————》“Qt Widgets Application”;
2、......
2.2、绘制UI
(1)、菜单栏创建“QMenu”,模拟正常软件控件布局;
(2)、QMenu直接双击,输入对应的命名昵称,按键盘“Enter”键才会生效(有点bug哈);
(3)、创建QMenu下的QAction时,命名需要复制粘贴进去,再“Enter”键,直接输入不生效;
(4)、简单拖入两个QLable按钮,便于直观看到效果;
2.2、生成“.st”文件
(1)、在.pro工程目录下,手动创建“translate”文件夹,用于存放需要添加的语种的.ts文件;
//注意这里的.ts文件名称是你自己命名的,自己记住那个语言对应哪个文件即可,一般习惯上使用各语种的简写,后续载入对应的qm语言文件做到对应正确就行。
//当前因为选中语种为“中文、英文、日语”,故命名如下所示;
TRANSLATIONS += \
translate/LanguageTest_cn.ts\
translate/LanguageTest_en.ts\
translate/LanguageTest_jp.ts
(2)、在QT菜单栏,选中“工具”——》选中“外部”——》选中“QT语言家”——》单机“lupdate”工具;
2.4、生成“.qm”文件
(1)、找到安装目录下“bin”文件中的“linguist.exe”工具;
(2)、 双击“linguist.exe”工具,将QT生成的“.ts”文件拖入其中;
(3)、根据需要,进行对应的翻译,直达所有的控件皆翻译完成,如下图所示;
(4)、单机“linguist.exe”菜单栏中的“文件”,选择“保存”并“全部另存为”;
2.5、工程demo
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[]){
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QString>
#include <QDebug>
#include <QApplication>
#include <QTranslator>
#include <QFileInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onMenulanguageTriggered(QAction *action); //UI按钮触发,切换翻译
void onLanguageTrans(int index); //加载翻译的.qm文件
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->menu_language, &QMenu::triggered, [&](QAction *action) {
onMenulanguageTriggered(action);
}); //UI切换按钮,就直接触发“onMenulanguageTriggered()”函数,获取QMenu当前被选中的QAction
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onLanguageTrans(int index)
{
static QTranslator* translator; //初始化QT自带的翻译类“QThranslator”
if(translator!=NULL)
{
qApp->removeTranslator(translator);
delete translator;
translator=NULL;
}
translator=new QTranslator();
QString strLanguagePath;
switch (index) {
case 1:
// chinese
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_cn.qm";
break;
case 2:
// English
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_en.qm";
break;
case 3:
//jp
strLanguagePath = QCoreApplication::applicationDirPath() + "/translate/" + "LanguageTest_jp.qm";
break;
}
if(translator->load(strLanguagePath)) //判断.qm文件是否加载成功
{
qApp->installTranslator(translator);
//用于将指定的翻译器安装到应用程序中。安装后,应用程序在显示文本时会优先使用该翻译器提供的翻译文本。
this->ui->retranslateUi(this);
//用于重新翻译当前界面上的所有控件文本。当翻译器安装成功后,调用这个函数可以使界面上的文本立即更新为新的翻译内容。
}
else
{
qDebug()<<"load failed";
}
}
void MainWindow::onMenulanguageTriggered(QAction *action)
{
//刷新语言
// 获取菜单中所有动作的列表
QList<QAction *> actionList = ui->menu_language->actions();
// 查找触发动作在列表中的索引
int index = actionList.indexOf(action);
if (index != -1)
{
onLanguageTrans(index);
qDebug() << "Triggered action index: " << index;
} else
{
qDebug() << "Action not found in menu.";
}
}