当前位置: 首页 > article >正文

QT笔记——多语言翻译

文章目录

    • 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.";
    }
}

http://www.kler.cn/a/534018.html

相关文章:

  • 电梯系统的UML文档14
  • 今日AI和商界事件(2025-02-05)
  • QT:对象树
  • 在Mapbox GL JS中“line-pattern”的使用详解
  • DeepSeek模型实战:从理论到应用的深度探索
  • Deepseek本地部署(ollama+open-webui)
  • 传感器——针孔相机模型
  • java开发面试自我介绍模板_java面试自我介绍3篇
  • 8-登录流程
  • kakailio官网推荐的安装流程ubuntu 22.04
  • 解决php8.3无法加载curl扩展
  • 【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
  • 【R语言】数据操作
  • trinitycore服务器离线,原来是mysql里数据库flag设置为2离线状态了
  • 安卓系统源码如何导入原生androidx资源文件?
  • 说一下JVM管理的常见参数
  • 怀旧经典:1200+款红白机游戏合集,Windows版一键畅玩
  • 【LeetCode 刷题】贪心算法(2)-进阶
  • LLM框架对比选择:MaxKB、Dify、FastGPT、RagFlow【RAG+AI工作流+Agent]
  • uniapp商城之用户模块【会员中心】
  • 老游戏回顾:G2
  • openwebui入门
  • 数字人|通过语音和图片来创建高质量的视频
  • 玩转Gin框架:Golang使用Gin完成登录流程
  • 如何通过 Logstash 将数据采集到 Elasticsearch
  • 基于单片机的智能安全插座(论文+源码)