Qt4.5多国语界面动态切换的实现
2010-08-27 14:54
507 查看
作者:wangxinus, <wangxinus@gmail.com>
来源:
http://wangxinus.cublog.cn
说明:
原创文章欢迎转载,交流请Email给作者
最近一直在折腾Qt,不过偶尔也会分分心,做了一些C++笔试题,发现自己的很多
基础知识还不牢固,可悲啊!
多国语界面的实现,在MFC中是很别扭的。以前在作MFC时,实现多国语言的界面,只有把资源文件做成各个语
言的资源DLL,在程序启动时,根据选择判断选择载入哪个DLL来获取资源。MFC的资源也是分语言的,在创建资源的时候要选择,但是这样的实现还有有弊
端。最根本的原因是MFC的资源文件不是Unicode编码的,而是不同语言的本地码,至少VC6是这样的。这样在中文系统中载入日文的资源,界面出现的
是乱码。
Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性。Qt本身提供的linguist工具,
就是来实现这个翻译过程的。实现多国语的步骤大体上说来有这么几步:
1、在需要被翻译的字符串前面标识tr,如QString
str=tr(“hello,world!”);
,这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是
加上tr的了,所以在翻译时也能看见。建议:在程序中的字符串使用英文,汉语等通过多国语翻译来实现,而不要采取把汉字写在代码中。
2、在工程文
件***.pro中,添加一项 TRANSLATIONS += ***.ts ****.ts
扩展名为.ts是翻译的源文件,表示生成这几个文件。一般我们会在命名中把区域加进去,更好的注释这些文件是用于什么语言的,比如中文大多会这样命名
myapp_zh_CN.ts, zh_CN表示的就是中国。
3、使用lupdate工具提取翻译源文件, 命令是这样的 #lupdate
***.pro ,lupdate会解析***.pro即工程文件,生成
TRANSLATIONS中的 ***.ts
几个文件,这些文件可以被
linguist
工具打开,按照提示一个一个的翻译成需要的文件,然后保存就OK,
linguist的使用很简单,一看界面基本就会了。上面提到的
这些工具都是Qt自带的。
4、使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度。使用方式
是#lrelease ***.pro,这个工具会提示你多少语句被翻译,多少被忽略了等。生成的文件是 ***.qm,于同名的
***.ts只是换了一个扩展名。而这才是我们程序需要使用到的文件。
5、使用***.qm文件。关于这个,我想还是摘抄书上的原文来说明一下:
需要说明的时,
一般我们使用设计器来设计界面UI,也就是程序源码中我们看到的 ***.ui文件,在载入翻译器后,我们应该调用
ui->retranslateUi() ,这个函数实际上就是把界面控件的text重新载入一遍,可以在
ui_***.cpp中看到该函数的实现。
5、在帮助文档中,关于QTranslator::load有这样一句话。
这段话明确的说明了,QTranslator在load以后,并没有把qm文件
中的数据拷贝一份,而是在需要的时候去查询字符串。如果qm在这期间被删除或修改,对程序都是有影响的。扩展开来,QTranslator必须保证要一直
有效,如果在函数中定义的局部变量,函数结束后就自动释放掉了,那么翻译工作就不能正常进行。所以建议在private中定义个成员变量
QTranslator* app_translator;来确保整个翻译工作的正确性。
如果你也喜欢Qt,有什么疑问和提议,我们可以
交流一下,欢迎联系。
来源:
http://wangxinus.cublog.cn
说明:
原创文章欢迎转载,交流请Email给作者
最近一直在折腾Qt,不过偶尔也会分分心,做了一些C++笔试题,发现自己的很多
基础知识还不牢固,可悲啊!
多国语界面的实现,在MFC中是很别扭的。以前在作MFC时,实现多国语言的界面,只有把资源文件做成各个语
言的资源DLL,在程序启动时,根据选择判断选择载入哪个DLL来获取资源。MFC的资源也是分语言的,在创建资源的时候要选择,但是这样的实现还有有弊
端。最根本的原因是MFC的资源文件不是Unicode编码的,而是不同语言的本地码,至少VC6是这样的。这样在中文系统中载入日文的资源,界面出现的
是乱码。
Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性。Qt本身提供的linguist工具,
就是来实现这个翻译过程的。实现多国语的步骤大体上说来有这么几步:
1、在需要被翻译的字符串前面标识tr,如QString
str=tr(“hello,world!”);
,这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是
加上tr的了,所以在翻译时也能看见。建议:在程序中的字符串使用英文,汉语等通过多国语翻译来实现,而不要采取把汉字写在代码中。
2、在工程文
件***.pro中,添加一项 TRANSLATIONS += ***.ts ****.ts
扩展名为.ts是翻译的源文件,表示生成这几个文件。一般我们会在命名中把区域加进去,更好的注释这些文件是用于什么语言的,比如中文大多会这样命名
myapp_zh_CN.ts, zh_CN表示的就是中国。
3、使用lupdate工具提取翻译源文件, 命令是这样的 #lupdate
***.pro ,lupdate会解析***.pro即工程文件,生成
TRANSLATIONS中的 ***.ts
几个文件,这些文件可以被
linguist
工具打开,按照提示一个一个的翻译成需要的文件,然后保存就OK,
linguist的使用很简单,一看界面基本就会了。上面提到的
这些工具都是Qt自带的。
4、使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度。使用方式
是#lrelease ***.pro,这个工具会提示你多少语句被翻译,多少被忽略了等。生成的文件是 ***.qm,于同名的
***.ts只是换了一个扩展名。而这才是我们程序需要使用到的文件。
5、使用***.qm文件。关于这个,我想还是摘抄书上的原文来说明一下:
切换语言分为两种情况: 1. 程序载入的时候,根据当前的区域设置,自动选择语言包(.qm) ,即可; 2. 要求在程序运行过程中动态切换语言,需要 第一种情况,一般在main函数中程序启动的部分加入如下代码: QString locale = QLocale::system().name()); // for example: zh_CN, en_US QTranslator *translator = new QTranslator(app); translator->load(QString("./ language/" + locale)); // 会在当前目录下的language目录下寻找,可以不带". qm"后缀名 app->installTranslator( translator ); // 安装翻译器 第二种情况, 我们假设有一个QComboBox连接了changeLang的 槽: connect(langCombo, SIGNAL(currentIndexChanged( int)), this, SLOT(changeLang(int)) ); // 载入不同的语言包 void WizarDialog::changeLang( int langIndex ) { QTranslator *translator = new QTranslator(qApp); switch( langCombo->currentIndex() ){ case 0: translator->load(QString("./ language/pt_BR")); break; case 1: translator->load(QString("./ language/en_US")); break; case 2: translator->load(QString("./ language/zh_CN")); default: break; } qApp->installTranslator( translator ); this->initGUI(); } // initGUI() 中会有大量的tr函数 void WizarDialog::initGUI() { this->setWindowTitle(tr(" RTA04W")); /* ...... */ } 这两种情况,也可以复合起来用。 |
一般我们使用设计器来设计界面UI,也就是程序源码中我们看到的 ***.ui文件,在载入翻译器后,我们应该调用
ui->retranslateUi() ,这个函数实际上就是把界面控件的text重新载入一遍,可以在
ui_***.cpp中看到该函数的实现。
5、在帮助文档中,关于QTranslator::load有这样一句话。
p, li { white-space: pre-wrap; }The data is not copied. The caller must be able to guarantee that data will not be deleted or modifiled. |
中的数据拷贝一份,而是在需要的时候去查询字符串。如果qm在这期间被删除或修改,对程序都是有影响的。扩展开来,QTranslator必须保证要一直
有效,如果在函数中定义的局部变量,函数结束后就自动释放掉了,那么翻译工作就不能正常进行。所以建议在private中定义个成员变量
QTranslator* app_translator;来确保整个翻译工作的正确性。
如果你也喜欢Qt,有什么疑问和提议,我们可以
交流一下,欢迎联系。
相关文章推荐
- Qt4.5多国语界面动态切换的实现(转载)
- Qt 国际化之二:多国语界面动态切换的实现
- Qt 国际化之二:多国语界面动态切换的实现
- Qt-界面动态图的实现
- Qt 界面实现多国语言的切换实例
- QT实现多国语言的动态切换
- QT实现多国语言的动态切换
- Qt实现多国语言(即界面翻译)可实时进行切换
- QT实现动态翻译和语言切换
- 实现QT的动态语言切换
- QT实现动态翻译和语言切换
- Qt 界面实现多国语言的切换实例
- Qt实现多国语言动态切换
- Fragment 实现tab页卡切换并保存界面状态,动态添加Fragment
- fragment中添加ViewPager实现界面切换,动态添加radiobutton
- QT实现多国语言的动态切换
- android编程实现局部界面动态切换的方法
- Qt实现动态切换语言
- Qt实现多国语言(即界面翻译)可实时进行切换
- Qt多语言实现和动态切换(国际化)