打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Qt实现动态切换语言
要想实现动态切换语言,必须掌握动态切换语言的原理。

原理其实就是把显示的语言文字做成不同的字库文件,然后在程序中动态的加载字库文件而已。比如说我要中文显示,那么我就先做一个中文字库文件,然后在程序中将这个中文字库文件加载到程序中,前提是这个文件必须包括你要显示的文字的全部,要不然有些文字就不能正确显示。

那么现在有几个问题需要思考:1.怎么制作这个字库文件?2.怎样加载这个文件?3.怎样实现动态切换?

1.怎么制作这个字库文件?

1)加标识。在需要被翻译的字符串前面标识tr,如QString str=tr(“hello,world!”); ,这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是加上tr的了,所以在翻译时也能看见。建议:在程序中的字符串使用英文,汉语等通过多国语翻译来实现,而不要采取把汉字写在代码中。

  2)提取翻译源文件.ts。在命令行下调用: lupdate myproject.pro,生成.ts文件.

  3)翻译文件。启动Qt Linguist进行翻译.

  4)发布字库文件.qm。在命令行下调用:lrelease myproject.pro,生成.qm文件或者点击Qt Linguist的文件->发布

  2.怎样加载这个文件?

 QTranslator *translator = new QTranslator(app);        translator->load(QString("./language/zh_CN","." ));  // 会在当前目录下的language目录下寻找,可以不带".qm"后缀名      app->installTranslator( translator );                // 安装翻译器

  3.怎样实现动态切换?

  我完成以上两步之后采用信号-槽机制来进行加载文件,但是就是不能动态改变语言。后来在网上找到一点提示:在系统调用完installTranslator函数之后,程序当中所有的QWidget以及其子类都会接受到QEvent::LanguageChange()信号。基于此,我就在QWidget类中编写了接受QEvent::LanguageChange()信号的函数,这样就实现了动态的切换。由于基于Ui创建的QWidget类自动会生成一个刷新语言的函数,所以这样就有两种情况:

  1)使用UI编辑器来自动生成界面的情况。

 connect(ui->china_rabtn,SIGNAL(toggled(bool)),this,SLOT(languageChina()));     connect(ui->engsh_rabtn,SIGNAL(toggled(bool)),this,SLOT(languageEnglish()));
void language::changeEvent(QEvent *e)//自动生成的代码{    QWidget::changeEvent(e);    switch (e->type())  {    case QEvent::LanguageChange://就是这个信号        ui->retranslateUi(this);//在此处刷新语言的        break;    default:        break;    }}void language::languageChina()//自己编写的槽函数{    translator.load("zh_CN",".");    qApp->installTranslator(&translator);}void language::languageEnglish()//自己编写的槽函数{    qApp->removeTranslator(&translator);}
 void retranslateUi(QWidget *language)//这个也是自动生成的代码    {        language->setWindowTitle(QApplication::translate("language", "Form", 0, QApplication::UnicodeUTF8));        china_rabtn->setText(QApplication::translate("language", "        \347\256\200\344\275\223\344\270\255\346\226\207", 0, QApplication::UnicodeUTF8));        engsh_rabtn->setText(QApplication::translate("language", "         English", 0, QApplication::UnicodeUTF8));        sav_btn->setText(QApplication::translate("language", "save", 0, QApplication::UnicodeUTF8));    } // retranslateUi

  2)不使用UI编辑器,自己通过亲自编程来设计应用程序界面的情况。

其实原理和第一种情况是一样的,只是changeEvent(QEvent *e)和retranslateUi(QWidget *language)这两个函数都要自己定义如下面所示:

protected:    void changeEvent(QEvent *e);private:    void retranslate(QWidget *parent=0);
函数定义如下:

void MainWindow::changeEvent(QEvent *e){    QWidget::changeEvent(e);    switch (e->type())  {    case QEvent::LanguageChange:        retranslate(this);        qDebug("MainWindow page");        break;    default:        break;    }}void MainWindow::retranslate(QWidget *parent){    his_btn->setText(QApplication::translate("mainwindow", "history", 0, QApplication::UnicodeUTF8));    ngv_btn->setText(QApplication::translate("mainwindow", "navigation", 0, QApplication::UnicodeUTF8));    cur_btn->setText(QApplication::translate("mainwindow", "current", 0, QApplication::UnicodeUTF8));    cancel_btn->setText(QApplication::translate("mainwindow", "quit", 0, QApplication::UnicodeUTF8));    fault_label->setText(QApplication::translate("mainwindow", "problem:", 0, QApplication::UnicodeUTF8));    fault_status->setText(QApplication::translate("mainwindow", "no problem", 0, QApplication::UnicodeUTF8));    comm_label->setText(QApplication::translate("mainwindow", "comstate:", 0, QApplication::UnicodeUTF8));    comm_status->setText(QApplication::translate("mainwindow", "normal", 0, QApplication::UnicodeUTF8));    time_label->setText(QApplication::translate("mainwindow", "datetime:", 0, QApplication::UnicodeUTF8));    //time_status->setText(QApplication::translate("parent", "no problem", 0, QApplication::UnicodeUTF8));}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Qt 为QPushButton、QLabel添加鼠标移入移出事件
Qt事件和事件过滤器
qt 事件机制
[Qt] postevent emit
QT 消息处理机制
Python快速入门系列:PyQt5 快速开发GUI-窗口类型以及主窗口创建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服