1 Qt 5.10 以下的 QT 语言动态变化 https://wiki.qt.io/How_to_do_dynamic_translation_in_QML
2 Qt 5 QWidget 动态语言切换 请看文本最后
3 Qt 5.10 及以上动态语言 QML
一、创建文件
在 .pro 文件中加入以下字段
TRANSLATIONS += i18n/english.ts \
i18n/chinese.ts
Tools -->External-->Linguist-->lupdate
就能生成相关文件(使用 Linguist 具体请检索,保存,发布生成 xxx.qm 文件)
二、加载相关文件
注:个人喜欢把文件都放在 资源文件中(qml.qrc)
//MyMessage.h
class MyMessage : public QObject
{
Q_OBJECT
public:
explicit MyMessage(QObject *parent = nullptr){
engine.rootContext()->setContextProperty("MyMess", this); //加载这个方便在 QML 中修改
const QUrl url(QStringLiteral("qrc:/main.qml");
engine.load(url);
}
Q_INVOKABLE void switch_language(const int i) {
if (i == 0) {
if (!EN_TR.isEmpty())
QCoreApplication::removeTranslator(&EN_TR);
if (EN_TR.load(":/i18n/english.qm")) //注意:这里是地址而不是 URL 本人这里卡一段时间才发现不对,load 加载可以是实际地址,也可以 qrc 中的地址,具体 F1 看说明
{
qDebug() << "successed: load";
QCoreApplication::installTranslator(&EN_TR);
}
} else { //我就中英文界面默认使用中文,只要卸载就好
QCoreApplication::removeTranslator(&EN_TR);
}
engine.retranslate(); //QML 会自动全局刷新,简直好用
}
private:
QTranslator EN_TR;
QQmlApplicationEngine engine;
}
//QML
import QtQuick 2.13
Item {
width: 500
height: 500
Button {
property var i: 0
anchors.fill: parent
text: qsTr("OK: %1").arg("I am a great man")
onClick: {
MyMess.switch_language(i === 0 ? 1 : 0)
}
}
}
QWidget 界面语言动态切换
QTranslator g_translator_en = new QTranslator;
g_translator_en->load(":/i18n/english.qm"); //一样注意是路径而 不是 URL
qApp->installTranslator(&g_translator_en);
qApp->removeTranslator(&g_translator_en);
这步以上基本相同,下面说两种不同的效果
全局自动切换(推荐)
第一种是 ui->retranslateUi(this) 这种是会自动切换控件上的文字,中英文翻译什么,这种方式比较简单,但是有一个问题,就是需要告知切换的界面,一般操作都是在当下 cpp 文件中重新实现 changeEvent() 函数
void MyTr::changeEvent(QEvent *e) //修改语言后会自动发送 QEvent::LanguageChange 事件
{
if (e->type() == QEvent::LanguageChange) {
ui->retranslateUi(this);
} else
QWidget::changeEvent(e);
}
局部自动切换
第二种是切换指定对象文字 这种针对特定情况比较好用
// 假设 ui->pushButton->setText(tr("好滴");
void MyTr::changeEvent(QEvent *e) {
if (e->type() == QEvent::LanguageChange) {
ui->pushButton->setText(tr("好滴");
} else
QWidget::changeEvent(e);
}