分类:
2007-07-29 19:40:31
Qt 自从版本(2.2.4)以来,实际上就对国际化的支持已经相当完善。 在文本显示上,Qt 使用了Unicode 作为内部编码,可以同时支持多种编码。 为 Qt 增加一种编码的支持也比较方便,只要 增加该编码和Unicode的转换编码便可以了。 Qt 目前支持ISO标准编码ISO 8859-1, ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,ISO 8859-9,和 ISO 8859-15(对于阿拉伯语和希伯来语的支持正在开发之中),中文GBK/Big5,日文 eucJP/JIS/ShiftJIS,韩文eucKR,俄文KOI8-R。 当然也可以直接使用UTF8编码。
Qt 使用了自己定义的Locale机制,在编码支持和信息文件(Message File)的翻译上弥补 了目前Unix上所普遍采用Locale和gettext的不足之处。 Qt 的这种机制可以使 Qt 的同一 组件(QWidget)上同时显示不同编码的文本。 比如,Qt 的标签上可以同时使用中文简体 和中文繁体文本。
在文本输 入上,Qt 采用了XIM(X Input Method)标准协议,可以直接使用XIM输入服务器。 由于目前的绝大多数输入服务器都是针对单一语言的,所以在 Qt 的标准输入组件( QLineEdit,QMultiLineEdit)中的输入受到单一编码的限制,Qt 还不支持动态切换编码 输入的支持,这是它的不足之处。
使用 Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。 比如要编写一中文界面的 Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。 这样,程序还可以根据Locale的不同,支持多种语言。下面介绍如何在 Qt 程序中标注字符串,如何提取并翻译文本。像普通的国际化过程一样, Qt 使用了类似GNU gettext一样的函数 QObject::tr(),它 用于从Qt的信息文件 .qm 中取出信息,这些信息是经过 Qt 的工具处理的。 Qt 在处理编码时还使用了 QTranslator 类,可用于指定整个应用软件的信息文件。
QPopupMenu* popup; |
static const char* strings[] = { |
QStings s; |
QString s = tr( "Button %1" ).arg(i); |
findtr [filename].cpp > i18n.po |
.... |
接
下来是文本翻译过程,在 Qt 中翻译信息文件时应该注意以下事项:
(1) 提取的 信息文件的编码是iso-8859-1,在翻译成某种语言(编码)时应该 注意改动它的 字符集,比如对中文GB2312和Big5编码,应该是, "Content-Type: text/plain; charset=gb2312\n"或者"Content-Type: text/plain; charset=big5\n"。
(2) 提取的信息有一个范围,比如上面的文件指定的范围是 ExampleWidget, 在翻译 前应该把它去掉,变成 msgid "::&File"。
(3) 被翻译的字符串可能含有加速键 符号,如 "&File"中的"F",如果翻译成中文最好保留该信息,它可以翻译成 "文件(&F)"。
> msg2qm i18n_gb.po i18n_gb.qm |
QTranslator *translator = new QTranslator(0); |
char *string = "中文和English混和字符串!" |
qApp->setDefaultCodec( QTextCodec::codecForName("GBK") ); |
如果使Qt根据Locale的环境变量取得字符集,可以使用
QString::fromLocal8Bit(str)。
例子请下载: qt-i18n-example.tar.gz