Qt C++ 多语言高阶实现:步伐启动自动编译 .ts 文件并生成语言菜单 ...

打印 上一主题 下一主题

主题 838|帖子 838|积分 2524

(简单地说,就是让 Qt C++ 步伐在启动时自动搜索编译.ts文件,并自动生成语言菜单,实现多语言实时切换)
目次

第一部门_需求背景与实现目标

现实需求痛点

在 Qt C++ 开辟中,国际化多语言切换通常需要提前编译 .ts 文件生成 .qm 文件,并随步伐一同发布。然而,这种方式存在以下局限性:

  • 每次修改发布都需要预先编译qm文件。
  • 无法直接修改或更新已有的语言文件。(需要借助linguist等工具)
  • 用户无法扩展新的语言支持,必须告急开辟者。
返回目次
本视频实现目标

本视频将利用 Qt C++ 内置的多语言解决方案,不依赖任何第三方库,简洁高效地实现以下功能:

  • 步伐启动时自动编译 .ts 文件为 .qm 文件。
  • 搜索 .qm 文件动态生成语言菜单。
  • 实现多语言的实时动态切换,无需重启步伐。
如许,步伐发布后用户便可以自由修改或新增语言文件,大大提升步伐的实用性和扩展性。
       
       
返回目次
本视频相关资料

通过一个简单的例子,讲解实现这些功能的核心知识和操作方法。视频时长控制在 40 分钟内,后续将提供完整的讲解资料和源代码。
假如本视频对您有所帮助,希望大家点赞、关注、收藏!您的支持是作者继续制作更好内容的动力!
返回目次
第二部门_具体实现过程

传统多语言切换演示_底子项目搭建


  • 传统多语言切换演示(参见上期视频)
    传统方式实现多语言切换,用户通过按钮选择语言,步伐加载对应的 .qm 文件并更新界面语言。
    传统方式需要提前编译 .ts 文件,无法直接更新语言文件,用户无法扩展语言支持。
    参见上期视频。相关资料:

  • 扩展目标:在上述传统项目底子上,搭建 LangTest04、已添加窗口组件布局,进一步实现步伐启动时自动编译 .ts 文件,动态生成语言菜单,实现动态扩展语言支持。
返回目次
高阶实现_步伐启动时自动编译ts文件


  • 核心功能
    在步伐启动时,自动搜索 res/language 目次中的 .ts 文件,并调用 lrelease.exe 将其编译为 .qm 文件。
  • 代码实现
    在 mainwindow.cpp 的 initLanguageMenu 函数中:
    1. void MainWindow::initLanguageMenu() {
    2.     // 指定 .ts 文件路径,搜索获取 .ts 文件列表
    3.     QDir languageDir("res/language");
    4.     QStringList tsFileList = languageDir.entryList(QStringList("*.ts"), QDir::Files);
    5.     QStringList tsFilePathList;
    6.     for (const QString &tsFile : tsFileList) {
    7.         tsFilePathList.append(languageDir.filePath(tsFile));
    8.     }
    9.     // 调用 lrelease.exe 编译 .ts 文件列表
    10.     QProcess *process = new QProcess(this);
    11.     process->start("res/lrelease/lrelease.exe", tsFilePathList);
    12.     // 连接编译完成信号。必须等待 .qm 文件编译完成后,才能搜索 .qm 文件动态生成语言菜单
    13.     connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
    14.             this, [this, process]() {
    15.                 if (process->exitStatus() == QProcess::NormalExit && process->exitCode() == 0) {
    16.                     this->onCompileTsFilesFinished();
    17.                 }
    18.                 process->deleteLater();
    19.             });
    20. }
    复制代码
  • 关键点

    • 利用 QProcess 调用 lrelease.exe 自动编译 .ts 文件。
    • 必须等待 .qm 文件编译完成后,才气调用 onCompileTsFilesFinished 函数,才气搜索 .qm 文件动态生成语言菜单。

返回目次
高阶实现_动态生成语言菜单


  • 功能描述
    搜索 .qm 文件,动态生成语言菜单,并为每个菜单项绑定对应的语言切换功能。
  • 用Lambda表达式为语言菜单动态添加槽函数
    在 onCompileTsFilesFinished 函数中:
    1. // 等待 .qm 文件编译完成调用
    2. void MainWindow::onCompileTsFilesFinished() {
    3.     QMenuBar *menuBar = this->menuBar();
    4.     QMenu *languageMenu = menuBar->addMenu(tr("语言"));
    5.     // 搜索获取 .qm 文件列表 qmFiles
    6.     QDir languageDir("res/language");
    7.     QStringList qmFiles = languageDir.entryList(QStringList("*.qm"), QDir::Files);
    8.     // 动态生成语言菜单
    9.     for (const QString &qmFile : qmFiles) {
    10.         QString languageName = extractLanguageName(qmFile);
    11.         QAction *action = new QAction(languageName, this);
    12.         action->setCheckable(true);
    13.         languageMenu->addAction(action);
    14.         // 用Lambda表达式为语言菜单动态添加槽函数
    15.         connect(action, &QAction::triggered, this, [this, qmFile]() {
    16.             changeLanguage(qmFile);
    17.         });
    18.     }
    19. }
    复制代码
  • 提取语言名称
    利用 extractLanguageName 函数从 .qm 文件名中提取语言名称:
    1. QString MainWindow::extractLanguageName(const QString &qmFile) {
    2.     QMap<QString, QString> mapLanguage = {
    3.         {"_zh_CN", tr("简体中文")}, {"_en", tr("英文")}, {"_fr", tr("法语")},
    4.         {"_de", tr("德语")}, {"_ja", tr("日语")}
    5.     };
    6.     for (auto it = mapLanguage.begin(); it != mapLanguage.end(); ++it) {
    7.         if (qmFile.contains(it.key())) {
    8.             return it.value();
    9.         }
    10.     }
    11.     return qmFile;
    12. }
    复制代码
返回目次
实现多语言动态切换


  • 切换语言的核心逻辑
    在 changeLanguage 函数中:
    1. void MainWindow::changeLanguage(const QString &qmFile) {
    2.     if (translator) {
    3.         qApp->removeTranslator(translator);
    4.         delete translator;
    5.     }
    6.     translator = new QTranslator(this);
    7.     if (translator->load("res/language/" + qmFile)) {
    8.         qApp->installTranslator(translator);
    9.     }
    10.     retranslateUi();
    11. }
    复制代码
  • 刷新界面语言
    在 retranslateUi 函数中:
    1. void MainWindow::retranslateUi() {
    2.     ui->retranslateUi(this);
    3.     QString strLang = tr("当前语言是");
    4.     ui->label_3->setText(strLang + extractLanguageName(currentLanguageQm));
    5. }
    复制代码
返回目次
生存用户语言选择_重启步伐后自动切换用户选择语言


  • 准备设置文件,加载用户语言选择
    在 MainWindow 函数中处理设置文件:
    1. MainWindow::MainWindow(QWidget *parent)
    2.    : QMainWindow(parent), ui(new Ui::MainWindow) {
    3.    ui->setupUi(this);
    4.    // 1、处理配置文件
    5.    // Qt中使用QSettings类读写ini文件,第一个参数是ini文件路径,第二个参数表示是ini文件格式,第三个参数可省略
    6.    settingsFile = new QSettings(QCoreApplication::applicationName() + ".ini",
    7.                                  QSettings::IniFormat, this);
    8.    // 解决QSettings保存中文值,ini自动保存为ANSI、GB2312格式后,启动崩溃问题
    9.    settingsFile->setIniCodec(QTextCodec::codecForName("GBK"));
    10.    // 加载用户语言选择
    11.    currentLanguageQm =
    12.       settingsFile->value("Main/strCurrentLanguageQm", "").toString();
    13.    // 2、初始化语言菜单
    14.    initLanguageMenu();
    15. }
    复制代码
  • 生存用户语言选择
    在 retranslateUi 函数中生存当前语言 qm 文件名称:
    1. // 更新界面语言
    2. void MainWindow::retranslateUi() {
    3.    // ......
    4.    // 保存当前语言 qm 文件名称
    5.    settingsFile->setValue("Main/strCurrentLanguageQm", currentLanguageQm);
    6.    // ......
    7. }
    复制代码
返回目次
第三部门_用户自行修改或新增语言支持

通过以上方式,我们便实现本视频的目标,让 Qt C++ 步伐在启动时自动编译.ts文件,自动生成语言菜单,实现多语言实时切换。
如许,步伐发布后用户便可以自由修改或新增语言文件,大大提升步伐的实用性和扩展性。
演示修改.ts文件后-重启步伐立即生效

用文本编辑器打开.ts,修改LangTest04_fr.ts文件中的内容,好比修改为:
  1. <message>
  2.    <location filename="../../../../mainwindow.cpp" line="189"/>
  3.    <source>QT多语言演示程序。当前语言是</source>
  4.    <translation>QT5 multi Language sample program. Current language is </translation>
  5. </message>
复制代码
生存修改效果,重启步伐立即生效。

返回目次
演示添加法语支持


  • 创建法语 .ts 文件
    在项目标 LangTest04.pro 文件中,添加法语 .ts 文件的设置:
    1. TRANSLATIONS += LangTest04_fr_FR.ts
    复制代码
  • 生成 .ts 文件
    利用 lupdate 下令生成新的 .ts 文件:
    1. lupdate LangTest04.pro -ts res/language/LangTest04_fr_FR.ts
    复制代码
  • 翻译内容

    • 利用 Qt Linguist 打开 LangTest04_fr_FR.ts 文件,翻译所需内容并生存。
    • 可以用文本编辑器打开.ts,直接进行修改。
    • 较大量的翻译,可以借助工具、AI、python等方式完成。

  • 编译 .ts 文件为 .qm 文件
    步伐启动时会自动编译 LangTest04_fr_FR.ts 为 LangTest04_fr_FR.qm,并在语言菜单中显示法语选项。

返回目次
第四部门_安全性优化指南

假如开辟者担心QT步伐发布时,直接发布.ts文件,可能会影响步伐安全性。
开辟者可以删除.ts文件中的所有location标签等信息,注意name等标签不能删。
可以利用Python、AI工具、正则表达式等方式进行删除。
生成正则表达式

好比,用正则表达式删除所有location标签,
如今方法很简单,只需将要求发给deepseek、chatGPT、kimi等AI,AI便可返回所需效果,还有相应解释。
通过简单的修改测试,便能实现我们的需求。
删除所有location标签的正则表达式

[code][/code][code]^\s*。</p>\r?\n: 匹配回车换行符。
用文本编辑器打开.ts文件,搜素删除所有location,生存修改效果,重启步伐立即生效。
</ul>返回目次
总结与注意事项


  • 总结

    • 通过本视频的讲解,我们成功实现了一个具有高扩展性和实用性的多语言动态切换功能。
    • 用户可以自由修改或新增语言文件,而无需依赖开辟者。
    • 这种筹划方式不仅简化了开辟流程,还极大地提升了步伐的实用型和机动性。

  • 实现效果

    • 步伐启动时自动编译 .ts 文件生成 .qm 文件。
    • 根据 .qm 文件动态生成语言菜单。
    • 用户选择语言后,界面实时切换,无需重启步伐。
    • 可以实现生存用户语言选择,重启步伐后自动切换用户选择语言。
    • 用户可以自行修改.ts语言文件,扩展新的语言支持。

  • 注意事项

    • 关键:确保 lrelease.exe 和 .ts 文件路径精确。
    • 关键:确保 .ts 格式精确,建议利用 Qt Linguist 工具检查。
    • 用户新增语言,只支持 extractLanguageName 函数中映射表中的语言。

返回目次
假如本视频对您有所帮助,请点赞、关注、收藏!等待您的支持!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表