Qt 极简实现多语言动态切换 + 公英制一键切换(无需重启)| 附完整源码

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);

只要改配置,所有界面自动刷新,无需逐个刷新控件。

项目源码

对你有用就点个赞👍,以后需要用到就收藏⭐