您的位置:首页 > 编程语言 > Qt开发

Qt学习——qt界面的国际化显示

2015-12-07 13:16 555 查看
对于使用Qt开发的应用软件来说,在软件界面上要显示的文字的来源有如下两种:
①开发人员使用的文字



由程序开发人员在编写源代码时,在源代码中加入的文字内容,例如:设置标题栏的标题,消息对话框中的消息等。这部分文字一般设定为软件使用者所使用的文字(即,中国人使用,就要让界面显示汉字,韩国人使用就要显示韩文)。
②Qt类库使用的文字



Qt所提供的类库中所包含的文字内容,这部分文字都是英文(Qt类库的源代码是用英文编写的),例如QFontDialog类,当我们调用该类生成一个字体对话框时,如果不加处理,所有的提示项,如标题栏题目,字形,字号等提示语言都会是英文。所以当我们在编程时使用到Qt的类库时,就需要把类库中的文字翻译为软件使用者能够通晓的文字。 

所以说,完成Qt软件开发的国际化翻译,需要重点解决以上两个方面的问题。首先先给出问题的解决办法,之后再做一下简单解释。

#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);

//解决开发人员使用的文字翻译问题
//设定程序开发人员所使用的文字编码格式,windows平台为GB18030或GB2312,其他平台一般为utf8

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
//解决Qt类库使用的文字翻译问题
//为应用程序加载翻译翻译器,翻译Qt类库中的文字
QTranslator tranlator;
tranlator.load("qt_zh_CN.qm","D:\\QtSDK\\Desktop\\Qt\\4.8.1\\mingw\\translations");
//tranlator.load("qt_ja.qm","D:\\QtSDK\\Desktop\\Qt\\4.8.1\\mingw\\translations");
app.installTranslator(&tranlator);

MainWindow w;
w.show();
return app.exec();
}

现在来解释一下,首先看以下几个函数。

QString QObject::tr(const char* sourceText, const char* disambiguation = 0, int n = -1) [static]

QObject::tr是QObject类所提供的一个静态成员函数。该函数的主要作用就是:将sourceText所指向的字符串文本,翻译成软件用户通晓的文字。其参数意义如下: 
sourceText :指定需要进行翻译的文字; 
disambiguation :该参数是一个注释,用于解释sourceText的含义。比如table一词既可以当做桌子翻译,又可以当成表格翻译,这时你就需要提供这个注释。或许你会问,使用翻译工具的时候不是有源代码吗?问题是,有可能人家不使用这个翻译工具,而使用别的工具,这样就不能保证会有这个源代码的预览;并且,你的程序不一定必须要发布源代码的;翻译人员往往只得到我们导出的ts文件,如果你加上注释,就可以方便翻译人员进行翻译。 
n:参数n用于指定字符串是否为复数。我们知道,很多语言,比如英语,很多名词的单复数形式是不相同的,为了解决这个问题,Qt在tr()函数中提供了一个参数n,中文没有复数的问题。 

一般使用的时候我们只需要提供第一个参数的值,例如:

void MainWindow::on_init()
{
this->setWindowTitle(tr("无标题 - 记事本"));
……
}

tr(“无标题 – 记事本”),则tr就会按照指定的编码格式进行字符的转换。
tr是用来按照指定的编码格式进行字符转换的,所以就要为tr指定所使用的文字编码集是哪个。

void QTextCodec::setCodecForTr ( QTextCodec * c ) [static]

QTextCodec::setCodecForTr()是QTextCodec类的静态函数,其功能就是用来设定tr函数所使用的文字编码集是哪个。其传入参数是一个QTextCodec对象的指针。对于文字编码集的获取,有专门的函数来得到,如下:

QTextCodec * QTextCodec::codecForName ( const char * name ) [static]

QTextCodec::codecForName()是QTextCodec类的静态函数,该函数会搜索所有安装的QTextCodec对象并返回一个最佳匹配的文字编码集名称。匹配时不区分大小写。如果没有找到相匹配的编解码器,返回0。 

所以,综上来说,用QTextCodec::codecForName()函数获取匹配的编解码器,之后用QTextCodec::setCodecForTr()函数为应用程序设定所使用的编解码器。最后调用QObject::tr函数实现文字的转换。 
====================================================================

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));      //尚未明确搞清楚是干什么用的
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

以上两个语句的功能类似。主要是用来设置使用QString类对象显示文字时,所需要进行的转换。 

简单回顾QString的中文问题 

QString 采用的unicode编码,在中文支持上不存在任何问题。 

“我是中文” 这是传统的 const char * 的窄字符串,当将窄字符串赋值到QString时,我们需要告诉它我们的窄串采用的何种编码(gbk?、utf-8?)。究竟何种编码主要取决于我们的源代码文件的编码(windows上一般是gbk,其他平台一般utf-8) 例子: 

QString s1 = “我是中文”; 

QString s2(“我是中文”); 

QString s3; s3 = “我是中文”;
s1、s2 用的是QString的构造函数QString ( const char * str ) 

s3 用的是QString的赋值操作符 QString & operator= ( const char * str) 

如果不指定编码,s1,s2,s3将全部都是(国内大多数人所称的)乱码。因为QString将这些const char *按照latin1来解释的,而不是用户期待的gbk或utf8。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

这两条语句中的一条可以解决问题,至于如何选择,此处不再重复。 
==================================================================== 

下面解决Qt类库中文字的转换问题,借助Qt的QTranslator类可以方便的解决这一问题。

QTranslator tranlator;
tranlator.load("qt_zh_CN.qm","D:\\QtSDK\\Desktop\\Qt\\4.8.1\\mingw\\translations");
//tranlator.load("qt_ja.qm ","D:\\QtSDK\\Desktop\\Qt\\4.8.1\\mingw\\translations");
app.installTranslator(&tranlator);

首先,创建一个QTranslator类的对象tranlator; 

其次,将对象tranlator和相应的qm文件相关联,qm文件就是Qt翻译文件。qm文件一般在Qt的安装目录下的translations目录下,qt_zh_CN.qm表示的是中文,qt_ja.qm表示的是日文; 

最后,在应用程序中加载关联了翻译文件的翻译类对象translator。这样就可以解决Qt类库中文字的转换。



至此,Qt的国际化翻译就告一段落。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息