很多时候我们做的软件可能要分为 简体中文版,繁体版,英文版…..等等一系列,如果每一种语言搞一个版本会把人搞死的,要是一个出现了bug 那其他的版本都要搞,谁也受不了.Qt 提供了方法做 Qt国际化。
Qt 国际化(啰嗦多图版 )
1.首先 我们在 pro 文件里加入
TRANSLATIONS += English.ts\
Chinese.ts
然后 依次 点击 菜单栏 - 工具 - 外部 -Qt语言家 - 更新翻译(lupdate)
如果 执行完 这一步 pro 同级目录下 如果没有 生成 English.ts 和 chinese.ts 文件 (XX.ts) 名字 对应你pro 里面 加的名字
那要看一下 控制台 6 概要信息的 报错(我自己遇到的坑)
成功的话本地就会生成 2个ts 文件
下一步 需要 用 Linguist 打开生成的 ts文件
然后翻译一下(想要打开ts文件 里面有你想要翻译的内容,必须要把代码用’tr()’包裹住)
然后 保存 - 发布 - 工具 - 外部 - Qt 语言家 - 发布翻译(lrelease)
然后本地会生成对应的 qm 文件 这就是我们需要的
下面又分为两步(!!!)
如果你的界面是UI 控件拖的(可以实时的切换) 和 界面是纯代码撸的 是不一样的(不能实时的切换)
这里我自己是遇到了这个问题,如果有错误请各位大佬指点
1.纯代码实现的界面:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator m;
m.load(":/English.qm");
qApp->installTranslator(&m);
Widget w;
w.show();
return a.exec();
}
void Widget::initUi()
{
this->setStyleSheet("font-size:20px;font-family:Microsoft Yahei;color:#272c2f;");
this->setWindowTitle(tr("码农小明"));
QVBoxLayout* m_VbLayout = new QVBoxLayout();
QLabel* m_line1 = new QLabel(tr("鹅鹅鹅"));
QLabel* m_line2 = new QLabel(tr("曲项向天歌"));
QLabel* m_line3 = new QLabel(tr("白毛浮绿水"));
QLabel* m_line4 = new QLabel(tr("红掌拨清波"));
m_VbLayout->addWidget(m_line1);
m_VbLayout->addWidget(m_line2);
m_VbLayout->addWidget(m_line3);
m_VbLayout->addWidget(m_line4);
m_VbLayout->setContentsMargins(5,5,5,5);
QLabel* m_author = new QLabel(tr("咏鹅 -驼宾王"));
QHBoxLayout* m_HbLabyout = new QHBoxLayout();
m_HbLabyout->addWidget(m_author);
m_HbLabyout->addLayout(m_VbLayout);
QVBoxLayout *m_layout = new QVBoxLayout();
m_layout->addLayout(m_HbLabyout);
this->setLayout(m_layout);
}
这样实现的 没法实时的切换 只能在 程序启动的时候进行选择语言
* (程序运行中想切换 就用 读写配置文件 当前选择的 语言,然后重启程序 程序打开的时候根据配置文件进行 语言的读取)*
2.UI 拖的 控件
void Widget::on_ChineseButton_clicked()
{
QTranslator m;
m.load(":/Chinese.qm");
qApp->installTranslator(&m);
this->ui->retranslateUi(this);
}
void Widget::on_EnglishButton_clicked()
{
QTranslator m;
m.load(":/English.qm");
qApp->installTranslator(&m);
this->ui->retranslateUi(this);
}
拖控件可以实时的更新界面 (具体为啥 代码撸的界面 不能实时的更新 我不明白) 有知道的大佬告诉一下 谢谢!
98年菜鸡一枚,请大佬们多多照顾!