本文讲解的是Qt 动态切换语言,在编写国际化程序的时候,在很多情况下都是在系统启动的过程中选择语言,然后加载对应的地方语言翻译文件,实现语言的本地化。
但是也会有用户需要进行动态的语言切换(Dynamic Language Switching),也就是在程序主>体都运行起来后,需要改变语言的选项。而用户不希望因为语言切换而引起程序的重启或者窗口的关闭。
Qt的国际化设计提供了这种可能。要实现这种动态切换,只需要在程序里使用一点小小的技巧,就不是把调用了Qt翻译语句tr的代码集中在某个和窗体变化无关的函数里,比如retranslateStrings()这样的函数里。在改变语言的时候,调用这个函数就可以了。
下面是附带的一个演示程序,仅为证明功能使用。没有过多考虑代码的严密性。
//dialog.cpp
#include
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
label=new QLabel(this);
okButton=new QPushButton(this);
connect(okButton,SIGNAL(clicked()),this,SLOT(switchlang()));
flag=0;
retranslateStrings();
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(label);
mainLayout->addWidget(okButton);
setLayout(mainLayout);
}
void Dialog::retranslateStrings()
{
label->setText(tr("Name:"));
okButton->setText(tr("Switch Language"));
setWindowTitle(tr("Switch Language ..."));
}
void Dialog::switchlang()
{
QTranslator translator;
if(0==flag){
translator.load("switchlang_zh");
flag=1;
}else
{
flag=0;
}
qApp->installTranslator(&translator);
retranslateStrings();
}
//dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include
class QLabel;
class QPushButton;
//! [0]
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
private:
QLabel *label;
QPushButton *okButton;
int flag;
private slots:
void retranslateStrings();
void switchlang();
};
//! [0]
#endif
//main.cpp
#include
#include "dialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Dialog dialog;
dialog.show();
return app.exec();
}
//switchlang.pro
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += dialog.h
SOURCES += dialog.cpp main.cpp
TRANSLATIONS+=switchlang_zh.ts
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
小结: