需求: 之前开发了一个工具软件,当时软件界面只显示中文,现在需要提供英文版本,而且可以实现中英文的切换。网上一顿搜索下来解决了问题,这里记录下

大体思路:
1、使用Qt自带的lupdate工具生成 .ts资源文件,此工具会搜索软件中的所有需要翻译的字符串(即UI文件中字符串和代码文件中以tr()函数标记的字符串),然后把需要翻译的字符串统计到 .ts文件中
2、使用Qt自带的linguist工具打开 .ts资源文件进行翻译
3、再使用Qt自带的lrelease工具把 .ts资源文件翻译成Qt可以直接使用的 .qm文件即可
4、通过QSettiings保存当前的语言,在main函数中加载此文件获取需要加载语言的 .qm文件
5、UI添加切换语言的按钮,语言切换时通过重启软件的方式加载对应语言的 .qm文件

重要: 上面步骤1和3可以在CMakeList文件中直接通过宏操作,步骤2可以通过命令行直接敲入命令打开Qt预言家工具进行编辑

操作步骤:
1、编辑CMakeList.txt文件,添加如下内容:

 #添加LinguistTools
find_package(Qt5 COMPONENTS Core Widgets LinguistTools REQUIRED) 

#设置开关,用于标记是否第一次创建 .ts文件
option(SCDT_BUILD_TRANSLATIONS "Generate translation files"    OFF)
#设置翻译源文件
set(TS_FILES translations/scdt_cn.ts translations/scdt_en.ts) 

#拷贝配置文件到安装目录下
install(DIRECTORY translations DESTINATION .)
#拷贝配置文件到当前构建目录下,保证本地运行时可以找到配置文件
file(COPY ${PROJECT_SOURCE_DIR}/translations DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

#设置翻译文件.qm的输出文件夹
set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "translations") 
if(SCDT_BUILD_TRANSLATIONS)
    #创建 .ts文件,并以此.ts文件生成 .qm文件
    qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) 
else()
    #以当前translation文件夹下存在的 .ts文件生成对应的 .qm文件
    qt5_add_translation(QM_FILES ${TS_FILES}) 
endif()

#把.ts和.qm资源添加到项目中
add_executable(${SUPER_PROJECT} ${FILES_HEADER} ${FILES_SRC} ${TS_FILES} icon/logo.rc res.qrc ${QM_FILES})

2、在项目源码根目录下创建文件夹translations

3、在当前项目的CMakeList.txt文件添加如上内容后,先把开关SCDT_BUILD_TRANSLATIONS 置为 ON,然后在Qt Creator界面左侧的项目->构建里找到这个开关置为ON,然后点击执行cmake,再运行项目,则生成translations/scdt_cn.ts translations/scdt_en.ts文件

option(SCDT_BUILD_TRANSLATIONS "Generate translation files"    ON)

4、然后打开命令行,执行linguist scdt_en.ts即会打开Qt语言编辑工具对语言进行翻译:(如果找不到linguist 工具请排查下环境变量)

linguist translations/scdt_en.ts

5、再把开关SCDT_BUILD_TRANSLATIONS 置为 OFF,然后在Qt Creator界面左侧的项目->构建里找到这个开关置为OFF,然后点击执行cmake,再运行项目,则生成translations/scdt_cn.qm translations/scdt_en.qm文件在运行目录下

6、main函数代码如下

int main(int argc, char *argv[])
{
    //适配不同分辨率和缩放
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
    QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);

    QApplication app(argc, argv);
    QSettings setting(QCoreApplication::applicationDirPath() + "/setting.ini", QSettings::IniFormat);
    QString language = setting.value("Language", "CN").toString();

    QTranslator* trans = new QTranslator;
    if("CN" == language)
    {
        QString qmfile = QCoreApplication::applicationDirPath() + "/translations/scdt_cn.qm";
        trans->load(qmfile);
    }
    else {
        QString qmfile = QCoreApplication::applicationDirPath() + "/translations/scdt_en.qm";
        trans->load(qmfile);
    }
    app.installTranslator(trans);

    ScdtMainWindow w;
    w.show();
    return app.exec();
}

7、切换语言的代码如下:

    TipsDialog* tips = new TipsDialog();
    if("EN" == m_language) {
        tips->setTips(tr("语言将从英文切换到中文,此操作会重启SCDT软件,请确认?"));
    }
    else if("CN" == m_language){
        tips->setTips(tr("语言将从中文切换到英文,此操作会重启SCDT软件,请确认?"));
    }

    connect(tips, &TipsDialog::confirmButtonClicked, [=]{

        QString file = m_app_path + "/setting.ini";
        QSettings settings(file, QSettings::IniFormat);
        if("EN" == m_language) {
            settings.setValue("Language", "CN");
        }
        else if("CN" == m_language){
            settings.setValue("Language", "EN");
        }

        QProcess::startDetached(QApplication::applicationFilePath(), QApplication::arguments(), QDir::currentPath());
        QApplication::exit();
    });
    tips->exec();
    
11-04 12:21