分类: LINUX
2008-05-05 12:07:02
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)。