一、添加TS文件
右键项目->添加->新建项
注:在生成ts文件前,可将代码中需要动态翻译的中文用tr("中文")包含。



生产后缀ts文件

二、编辑TS文件
Qt VS Tools->Launch Qt Linguist打开QT语言家。
打开上面生成的中英文ts文件。

选中文本信息,分布输入对应中英文,并点击“❓”变为“✔”。
翻译完所有文本信息,直到左侧上下文不在出现黄色问号。


注意:中英文翻译格式不一致,左侧“✔”会为黄色!
三、发布QM文件
点击文件->发布全部,在软件目录会对应生成两个qm文件

注:如果工程文件显示文本信息有改动,需要更新ts文件(右键ts文件->lupdate),并重新生成qm文件。
四、使用QM文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//读取语言配置
std::shared_ptr<QSettings> iniFile = std::make_shared<QSettings>("config.ini", QSettings::IniFormat);
QString language_value = "0";
QString language_suffix = QString("zh");
LANGUAGE language = UI_ZH;
bool key = iniFile->contains("Language/english");
if (key)
{
language = (LANGUAGE)iniFile->value("Language/english").toInt();
if (language == UI_EN)
{
language_suffix = QString("en");
}
}
QTranslator translator;
ret = translator.load(QString(":/Resources/Translatio_") + language_suffix);
if (!ret) {
std::cout << "语音配置读取错误!" << std::endl;
}
a.installTranslator(&translator);
MainForm w;
w.setTranslator(&translator);
w.setLanguage(language);
w.show();
return a.exec();
}
MainForm.h
typedef enum {
UI_ZH,
UI_EN
}LANGUAGE;
Q_DECLARE_METATYPE(LANGUAGE)
public:
void setLanguage(LANGUAGE currentLanguage);
void setTranslator(QTranslator* translator);
private:
void changeEvent(QEvent *event);
void switchLanguage(LANGUAGE language);
private:
LANGUAGE _currentLanguage;
QTranslator *_translator = nullptr;
private slots:
void Btn_ChineseClick();
void Btn_EnglishClick();
MainForm.cpp
void MainForm::setLanguage(LANGUAGE currentLanguage)
{
_currentLanguage = currentLanguage;
}
void MainForm::setTranslator(QTranslator * translator)
{
_translator = translator;
}
void MainForm::changeEvent(QEvent * event)
{
switch (event->type())
{
case QEvent::LanguageChange:
ui.retranslateUi(this);
break;
default:
QWidget::changeEvent(event);
}
}
void MainForm::switchLanguage(LANGUAGE language)
{
QString language_qm;
switch (language)
{
case UI_ZH:
language = UI_ZH;
language_qm = QString(":/Resources/Translation_zh");
break;
case UI_EN:
language = UI_EN;
language_qm = QString(":/Resources/Translation_en");
break;
default:
language = UI_ZH;
language_qm = QString(":/Resources/Translation_zh");
}
if (_currentLanguage != language)
{
_currentLanguage = language;
bool ret = _translator->load(language_qm);
if (!ret) {
PLOG_ERROR << "语音配置读取错误!";
}
else {
QVariant var = QString::number(language, 10);
std::shared_ptr<QSettings> iniFile = std::make_shared<QSettings>("config.ini", QSettings::IniFormat);
iniFile->beginGroup("Language");
iniFile->setValue("english", var);
iniFile->endGroup();
}
}
}
void MainForm::Btn_ChineseClick()
{
switchLanguage(LANGUAGE::UI_ZH);
}
void MainForm::Btn_EnglishClick()
{
switchLanguage(LANGUAGE::UI_ZH);
}
注:在需要动态切换中英文界面都需要实现重写void changeEvent(QEvent *event)事件并调用 retranslateUi(this)刷新界面;