1.在所有需要采用双语或多语的地方采用QObject::tr("")将要显示的字符串包起来。
这里的字符串最好为英文,ASCII的编码在哪里都不会解码错。
tr()的作用之一是从.qm文件中取出与其所包含的内容对应的信息。
有些地方不宜采用tr(),比如定义某些变量使用的字符串,如:
static const char* strings[] = {T_TR_NOOP("Hello"),QT_TR_NOOP("World")};
可以采用QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们。
前者用于单个字 符串,后者用于多个字符串。
如果要使用printf/sprintf之类的函数动态生成字符串,需要替换为arg(),如:
QString s = tr("Button %1").arg(i);
这里的字符串最好为英文,ASCII的编码在哪里都不会解码错。
tr()的作用之一是从.qm文件中取出与其所包含的内容对应的信息。
有些地方不宜采用tr(),比如定义某些变量使用的字符串,如:
static const char* strings[] = {T_TR_NOOP("Hello"),QT_TR_NOOP("World")};
可以采用QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们。
前者用于单个字 符串,后者用于多个字符串。
如果要使用printf/sprintf之类的函数动态生成字符串,需要替换为arg(),如:
QString s = tr("Button %1").arg(i);
2.使用findtr命令为要翻译的所有文件生成一个.po文件。如:
findtr 1.cpp 2.cpp 3.cpp > 1.po
findtr 1.cpp 2.cpp 3.cpp > 1.po
3.打开这个1.po文件,主要修改以下几项:
3.1 编码方式: 将charset=iso-8859-1中的“iso-8859-1”替换为GBK或UTF-8。
在windows下修改时使用GBK,在linux下使用“UTF-8”
3.2 提取出的字符串: 提取出的字符串格式如下:
msgid "ExampleWidget::&File"
msgstr ""
其中ExampleWidget为文件的指定范围,在翻译时要去掉,最后变为
msgid "::&File"
msgstr "文件(&F)"
3.1 编码方式: 将charset=iso-8859-1中的“iso-8859-1”替换为GBK或UTF-8。
在windows下修改时使用GBK,在linux下使用“UTF-8”
3.2 提取出的字符串: 提取出的字符串格式如下:
msgid "ExampleWidget::&File"
msgstr ""
其中ExampleWidget为文件的指定范围,在翻译时要去掉,最后变为
msgid "::&File"
msgstr "文件(&F)"
4.使用qt提供的工具msg2qm将.po转化为.qm文件,如:
msg2qm 1.po 1.qm
一般这个工具放在qt安装目录的tools/msg2qm下,有时还需要make生成一下,最终的格式可能是:
./msg2qm 1.po 1.qm
msg2qm 1.po 1.qm
一般这个工具放在qt安装目录的tools/msg2qm下,有时还需要make生成一下,最终的格式可能是:
./msg2qm 1.po 1.qm
5.在程序中添加调用1.qm的代码:
QTranslator *translator = new QTranslator(0);
translator->load("1.qm",".");
qApp->installTranslator(translator);
QTranslator *translator = new QTranslator(0);
translator->load("1.qm",".");
qApp->installTranslator(translator);
此外,Qt 还提供了类似于 msgmerge 的工具 mergetr,它用于把新提取的信息文件和
已经翻译过的信息文件融合起来,在此不再赘述。
已经翻译过的信息文件融合起来,在此不再赘述。