Qt实现动态切换语言
2012-07-16 20:02
459 查看
要想实现动态切换语言,必须掌握动态切换语言的原理。
原理其实就是把显示的语言文字做成不同的字库文件,然后在程序中动态的加载字库文件而已。比如说我要中文显示,那么我就先做一个中文字库文件,然后在程序中将这个中文字库文件加载到程序中,前提是这个文件必须包括你要显示的文字的全部,要不然有些文字就不能正确显示。
那么现在有几个问题需要思考: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.怎样加载这个文件?
3.怎样实现动态切换?
我完成以上两步之后采用信号-槽机制来进行加载文件,但是就是不能动态改变语言。后来在网上找到一点提示:在系统调用完installTranslator函数之后,程序当中所有的QWidget以及其子类都会接受到QEvent::LanguageChange()信号。基于此,我就在QWidget类中编写了接受QEvent::LanguageChange()信号的函数,这样就实现了动态的切换。由于基于Ui创建的QWidget类自动会生成一个刷新语言的函数,所以这样就有两种情况:
1)使用UI编辑器来自动生成界面的情况。
2)不使用UI编辑器,自己通过亲自编程来设计应用程序界面的情况。
其实原理和第一种情况是一样的,只是changeEvent(QEvent *e)和retranslateUi(QWidget *language)这两个函数都要自己定义如下面所示:
原理其实就是把显示的语言文字做成不同的字库文件,然后在程序中动态的加载字库文件而已。比如说我要中文显示,那么我就先做一个中文字库文件,然后在程序中将这个中文字库文件加载到程序中,前提是这个文件必须包括你要显示的文字的全部,要不然有些文字就不能正确显示。
那么现在有几个问题需要思考: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)); }
相关文章推荐
- Qt实现动态切换语言
- QT实现多国语言的动态切换
- Qt实现多国语言动态切换
- QT实现动态翻译和语言切换
- Qt多语言实现和动态切换(国际化)
- QT实现多国语言的动态切换
- Qt的国际化示例程序以及步骤--实现Qt程序的动态切换语言功能
- 实现QT的动态语言切换
- QT实现多国语言的动态切换
- QT实现多国语言的动态切换
- QT实现动态翻译和语言切换
- Qt学习笔记--动态切换语言
- Qt4.5多国语界面动态切换的实现(转载)
- Qt4.5多国语界面动态切换的实现
- c++实现动态多国语言的动态切换
- Qt之动态语言切换
- Qt实现多国语言(即界面翻译)可实时进行切换
- 程序实现多国语言的动态切换解决方案
- Qt实现多国语言(即界面翻译)可实时进行切换
- QT国际化动态语言切换的实现(原创) (2012-02-20 11:23:20)