1、实现目的
软件运行时多语言切换和公英制单位切换,无需重启程序并且配置持久化
2、效果

3、方法
-
ConfigManager(单例):全局保存语言、单位、发送配置变更信号、单位换算、ini持久化。
-
TranslateManager(单例):监听信号,动态加载 qm 语言包。
-
UI 界面:监听全局信号,统一刷新文字和数值。
4、源码讲解
a、全局配置类 ConfigManager
统一管理语言、单位、配置信号、换算公式。
cpp
// 语言枚举
enum LangType {
LANG_CN_SIMPLE, // 简体中文
LANG_CN_TRAD, // 繁体中文
LANG_EN, // 英文
LANG_RU // 俄语
};
// 单位枚举
enum UnitType {
UNIT_METRIC, // 公制 mm kg
UNIT_IMPERIAL // 英制 inch lb
};
// 配置改变信号(全局核心)
void configChanged();
// 公英制换算
double metricToImperial(double mm) { return mm / 25.4; }
原理 :修改语言/单位后发送 configChanged(),所有 UI 自动刷新。
b、翻译管理器 TranslateManager
使用 QTranslator 的 load()
cpp
void TranslateManager::loadLanguage(ConfigManager::LangType lang) {
qApp->removeTranslator(&m_translator);
QString path = QApplication::applicationDirPath() + "/lang/";
switch (lang) {
case ConfigManager::LANG_CN_SIMPLE:
m_translator.load(path + "zh_CN.qm");
break;
case ConfigManager::LANG_CN_TRAD:
m_translator.load(path + "zh_TW.qm");
break;
case ConfigManager::LANG_EN:
m_translator.load(path + "en.qm");
break;
case ConfigManager::LANG_RU:
m_translator.load(path + "ru.qm");
break;
}
qApp->installTranslator(&m_translator);
}
c、界面动态刷新
Qt 动态翻译必须手动刷新控件文本
cpp
void MainWindow::retranslateUi() {
// 刷新所有翻译文本
ui->menuSetting->setTitle(tr("Setting"));
ui->actionChinese_Simple->setText(tr("Simplified Chinese"));
ui->actionChinese_Trad->setText(tr("Traditional Chinese"));
ui->actionEnglish->setText(tr("English"));
ui->actionRussian->setText(tr("Russian"));
ui->actionMetric->setText(tr("Metric(mm)"));
ui->actionImperial->setText(tr("Imperial(inch)"));
this->setWindowTitle(tr("Multi-Language & Unit Switch Tool"));
// 刷新单位数值
double originalMM = 200.0;
auto cfg = theConfig;
if (cfg->getUnit() == ConfigManager::UNIT_METRIC) {
ui->labelValue->setText(tr("Current Length:%1 mm").arg(originalMM));
} else {
double inch = cfg->metricToImperial(originalMM);
ui->labelValue->setText(tr("Current Length: %1 inch").arg(inch, 0, 'f', 3));
}
}
d、全局信号绑定
一键全局刷新
cpp
connect(theConfig, &ConfigManager::configChanged, this,
&MainWindow::retranslateUi);
只要改配置,所有界面自动刷新,无需逐个刷新控件。
对你有用就点个赞👍,以后需要用到就收藏⭐