Qt 动态中英文切换

news/2024/12/2 21:54:28/

背景:

        需要界面实现动态国际化,一键点击切换中英文或其他语言。


前提:

        已经完成了整个界面的翻译,拿到匹配的ts翻译文件,注意:要保证界面切换后,翻译的全覆盖,要保证任何需要反应的地方,都用到了tr("")包含,不然Linguist会捕捉不到。.ts文件的生成参考下文。

Qt中英文切换(国际化)_雲烟的博客-CSDN博客

工具:

假设已经拿到a.qm b.qm c.qm三个翻译文件

#include <QtCore/QObject>
#include <QtCore/QTranslator>class LanguageManager:public QObject{Q_OBJECTpublic:~LanguageManager() override = default;void setLanguage(const QString &language);QString getLanguage();void addLangFile(const QString &name);void removeLangFile(const QString &name);void reload();static LanguageManager *getInstance(){if(!instance){instance = new LanguageManager;}return instance;}signals:void languageChanged(const QString &lang);privite:LanguageManager();privite:static LanguageManager *instance;QString baseDir;QList<QString> langFiles;QList<QTranslator *> translations;
}

#include "Languagemanager.h"
#include <QApplication>
#include <QCoreApplication>
#include <QDebug>
#include <QStringBuilder>
#include <configFile.h>LanguageManager *LanguageManager::instance = nullptr;void LanguageManager::setLanguage(const QString &language)
{//写配置文件保存SystemConfig sc;auto ov = sc.value("qt/language");sc.setValue("qt/language",language);if(ov!=language){reload();emit languageChanged(language);}
}QString LanguageManager::getLanguage()
{SystemConfig sc;return sc.value("qt/language").toString();
}void LanguageManager::addLangFile(const QString &name)
{if(name.isEmpty()){return;}langFiles.append(name);
}void LanguageManager::removeLangFile(const QString &name)
{if(name.isEmpty()){return;}langFiles.removeOne(name);
}void LanguageManager::reload()
{auto lang = getLanguage();QString qmBase = QApplication::applicationDirPath() + "/" + baseDir;if(!qmbase.isEmpty() && !qmBase.endsWith("/")){qmBase += "/";}if(!translations.isEmpty()){for(auto const t:translations){QCoreApplication::removeTranslator(t);t->deleteLater();}translations.clear();}for(auto const &qm:langFiles){auto *t = new QTranslator(this);if(t->load(qmBase % qm % "_" % lang)){translations.append(t);QCoreApplication::installTranslator(t);}else{qDebug()<<"load error:"<<qm<<", language"<<lang;}}
}LanguageManager::LanguageManager (): baseDir("lang"){}

使用:

        在界面切换的按键或者条目里直接调用即可:

LanguageManager::getInstance()->setLanguage("english");

        注意:该调用界面要重载changeEvent()保证界面即刻生效。

protected:void changeEvent(QEvent *evt) override ;void MainPanel::changeEvent(QEvent *evt) {if (evt->type() == QEvent::LanguageChange) {ui->retranslateUi(this);}QWidget::changeEvent(evt);
}

至此,界面即可看到变化,中英文动态切换完成!


http://www.ppmy.cn/news/1078901.html

相关文章

第P3周:天气识别

一、前期准备 1、设置GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasetsimport os,PIL,pathlibdevice torch.device("cuda" if torch.cuda.is_available() …

一些进程/线程调试经验和基础

查看进程/线程/系统运行状况等的命令 主线剧情02-ARM-Linux基础学习记录_Real-Staok的博客-CSDN博客 里面的 Linux Shell 一节 的 任务后台执行 / 任务&进程查看 部分。 关于Linux下进程的详解【进程查看与管理】 - AshJo - 博客园 (cnblogs.com)。 linux top命令查看内存…

kubevirt虚机创建svc通过NodePort的方式暴露端口

背景 存在kubevit存在的三个虚机&#xff1a; ubuntu-4tlg7 7d22h Running True ubuntu-7kgrk 7d22h Running True ubuntu-94kg2 7d22h Running True 网络没有做透传&#xff0c;pod也不是underlay网络想要通过NodePort方式暴露虚机22端口进行远程登录。 …

【Java 动态数据统计图】动态X轴二级数据统计图思路案例(动态,排序,动态数组(重点推荐:难))八(130)

需求&#xff1a; 1.有一组数据集合&#xff0c;数据集合中的数据为动态&#xff1b; 举例如下&#xff1a; [{province陕西省, city西安市}, {province陕西省, city咸阳市}, {province陕西省, city宝鸡市}, {province陕西省, city延安市}, {province陕西省, city汉中市}, {pr…

Vue实现Antv/X6中的示例,以及一些er图开发场景

通过Vue实现Antv X6中的示例&#xff0c;以及一些开发场景&#xff0c;代码已经丢到仓库里了。 lwstudy/antv-x6-vue-demo: Vue实现Antv X6中的示例&#xff0c;以及一些开发场景 (github.com)learn-antv-x6: antv/X6学习 (gitee.com) 介绍 使用脚手架&#xff08;自动生成接…

【Css】Less和Sass的区别:

文章目录 一、定义&#xff1a;【1】Less【2】Sass 二、相同之处:三、区别:【1】实现方式&#xff1a;【2】实现方式&#xff1a;【3】混合(Mixins)&#xff1a;【4】解析方式&#xff1a;【5】变量的作用域&#xff1a;【6】比起Less 一、定义&#xff1a; 【1】Less Less 是…

简述SpringMVC

一、典型的Servlet JSP JavaBean UserServlet看作业务逻辑处理&#xff08;Controller&#xff09;User看作模型&#xff08;Model&#xff09;user.jsp看作渲染&#xff08;View&#xff09; 二、高级MVC 由DispatcherServlet对请求统一处理 三、SpringMVC MVC与Spr…

LinuxShell变量

变量&#xff1a; 命名规则&#xff1a; 在Shell中&#xff0c;变量名可以由字母、数字或者下划线组成&#xff0c;并且只能以字母或者下划线开头。对于变量名的长度&#xff0c;Shell并没有做出明确的规定。因此&#xff0c;用户可以使用任意长度的字符串来作为变量名。但是…