参考:
Qt 国际化(上)_w3cschool
https://www.w3cschool.cn/learnroadqt/fwkx1j4j.html
QT5实现语言国际化(中英文界面动态切换,超详细)_qt qevent::languagechange-CSDN博客
https://blog.csdn.net/m0_49047167/article/details/108442111
本地环境:
win10专业版,64位
例1:实现翻译效果
假设我的项目叫demo,那么在demo.pro中添加一行:
TRANSLATIONS += myapp.ts
myapp.ts是一个xml文件,名字随便起的。
然后用命令行打开demo.pro所在的路径:
C:\Users\xxx\Desktop\demo\demo>lupdate demo.pro
Info: creating stash file C:\Users\xxx\Desktop\demo\demo\.qmake.stash
Updating 'myapp.ts'...
Found 98 source text(s) (98 new and 0 already existing)
C:\Users\xxx\Desktop\demo\demo>
这说明有98个要翻译的,都没翻译。
用Qt Linguist打开myapp.ts,选择源语言和目标语言,翻译。
翻译写完后,点击菜单
-发布
,可以看到原文件夹下面有一个同名的qm文件。(二进制文件,很小)
如果是debug模式的话,把myaqq.qm放到build-demo-Desktopxxxxx-Debug文件夹下(不是放到debug下,跟exe放一起是无效的,虽然很多教程那么教:) )。
修改main():
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
...
QTranslator translator;
translator.load("myapp.qm");
a.installTranslator(&translator);
MainWindow w;
w.show();
return a.exec();
}
注释掉a.installTranslator(&translator);
就是未翻译前的状态
例2:通过combobox实现语言切换
假设mainwindow上有个combobox,里面包含中文和英文两项(以后可以更多)。点击某个语言,当前界面就会切换成另一个语言。
首先先照前面写的,准备好中文的翻译,myapp_zh.qm,放到resources下:
然后在mainwindow的页面上添加一个combobox,然后转到槽,写两个函数;并添加一个全局变量langCode代表语言编号。
...
#include <QTranslator>
...
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
static int langCode; // 全局变量
...
private slots:
void on_langComboBox_activated(const QString &arg1);
void changeEvent(QEvent *e);
...
private:
void createWidgets();
Ui::MainWindow *ui;
QTranslator translator;
QApplication *app;
};
然后修改源文件:(其中app和translator不需要初始化)
int MainWindow::langCode = 0; // 全局变量初始化
...
void MainWindow::on_langComboBox_activated(const QString &arg1)
{
langCode = ui->langComboBox->currentIndex();
if (langCode == 0) {
translator.load("://resources/lang/myapp_zh.qm");
} else if (langCode == 1) {
translator.load("://resources/lang/myapp.qm");
} else {
}
app->installTranslator(&translator);
}
void MainWindow::changeEvent(QEvent *e) {
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
完成。