需求: 之前开发了一个工具软件,当时软件界面只显示中文,现在需要提供英文版本,而且可以实现中英文的切换。网上一顿搜索下来解决了问题,这里记录下
大体思路:
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();