参考:
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位,Qt 5.12
目录
- 例1:实现翻译效果
- 例2:通过combobox实现语言切换
- 例3:通过菜单实现语言切换
- 例4:读取和保存语言设置
- 报错:Project ERROR: Cannot run compiler ‘cl‘
例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;
}
}
完成。
例3:通过菜单实现语言切换
这个比较简单。假设菜单栏,文件菜单下有一个切换语言的子菜单,其下有几种语言。当前是中文,如果选择英文,界面会变成英文,同时“英文”前面会打勾。
假设菜单名称如下:
在mainwindow.h中增加一个enum,两个槽函数void on_actionEn_triggered()
和void on_actionExit_triggered()
以及一个私有变量Languages language;
。
enum Languages {
ZH,
EN,
};
修改mainwindow.cpp,保留上面的void MainWindow::changeEvent(QEvent *e)
。
void MainWindow::on_actionZh_triggered() {
ui->actionZh->setChecked(true);
if (language != ZH) {
language = ZH;
// 其他语言去掉勾选
ui->actionEn->setChecked(false);
translator.load("://resources/lang/myapp_zh.qm");
app->installTranslator(&translator);
}
}
void MainWindow::on_actionEn_triggered() {
ui->actionEn->setChecked(true);
if (language != EN) {
language = EN;
// 其他语言去掉勾选
ui->actionZh->setChecked(false);
translator.load("://resources/lang/myapp.qm");
app->installTranslator(&translator);
}
}
例4:读取和保存语言设置
参考之前写的:
qt5-入门-主窗口设计1-CSDN博客
https://blog.csdn.net/pxy7896/article/details/136534754
readSettings()加一个读取和判断,并对设置菜单进行相应的勾选。writeSettings()需要保存变量。代码略。
报错:Project ERROR: Cannot run compiler ‘cl‘
这个是没配置好环境。一般来说,只要将msvc的bin放到环境变量path里就可以了。比如windows中,这个bin可能在:C:\Qt\版本号\msvc2019\bin,我看了下我的Qt文件夹里没有这个,用Everything一搜,发现只有VS下面有:
因为我是64位的系统,直接把第一行那个路径放入path中即可,然后运行lupdate是正确的。(不需要重启电脑,可能需要重启下cmd)
参考:
Qt环境报错-Project ERROR: Cannot run compiler ‘cl‘. Output_project error: cannot run compiler ‘cl’. output:-CSDN博客
https://blog.csdn.net/qq_43627907/article/details/124528617