嵌入式Qt方案中文显示系列:国际化支持实现

上文提到了Qt的国际化支持方案,这里对这一方案进行简要的说明。

使用Qt的国际化支持和翻译机制功能来实现中文的显示,中文字库的支持还是必需的,然后就是使用的Qte库必须包含了翻译特性,不能将翻译特性给裁剪掉,即在qconfig-xxx.h配置文件中不能定义有如下的宏:

#define QT_NO_TRANSLATION

此外还需要使用Qt配套提供的QT Linguist语言工具来辅助实现翻译工作的完成。

Qt Linguist提供的工具

  • linguist     用来进行语言翻译的辅助图形界面工具,方便地进行语言的翻译,可提高翻译效率但非必须
  • lupdate     用来检查源文件并生成待翻译的TS格式文件的工具,它检查源文件使用了tr函数的地方
  • lrelease    用来将XML格式的TS翻译文件转换成QT使用的二进制格式的文件工具,以TS文件为输入

这三个工具的使用会涉及到两种格式的文件,即上面提到的TS文件和qm文件:

  • TS文件:是一个XML格式的文件,由lupdate工具以所有源文件为输入自动生成,之后需要进行人工的语言翻译工作;该工作既可以使用linguist工具来完成,也可以直接进行对文件使用文本编辑器来完成。一个TS文件的简单示例为: translation内的中文为人工翻译的,lupdate生成的初始文件该处为空。
  • <!DOCTYPE TS><TS>
    <context>
        <name>AlarmIOSet</name>
        <message>
            <source>Alarm IO Settings</source>
            <translation>报警IO设置</translation>
        </message>
    </context>
  • qm文件:是一个二进制格式的文件,由lrelease工具以翻译好的TS文件为输入自动生成,被应用程序加载使用。

国际化支持与翻译实现步骤

  1. 在应用程序中对所有需要外部展示的字符串使用翻译函数: QObject::tr()或者QApplication::translate()函数。
  2. 在项目的工程构建文件中,QT自身使用的.pro项目文件中添加TRANSLATIONS目标,你需要多少种语言翻译就添加多少个,每种语言会生成一个翻译文件。如:
  3. TRANSLATIONS = show_zh.ts \
                    show_fr.ts
  4. 在应用程序的main函数中安装翻译器和翻译文件,大概的代码为:
  5. int main(int argc, char *argv[])
    {
            QApplication app(argc, argv, QApplication::GuiServer);
    
            QTranslator translator(0);
            translator.load("show-zh.qm",".");
            app.installTranslator(&translator);
            
            //QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
            QTextCodec* codec = QTextCodec::codecForName("UTF-8");
            app.setFont(QFont("wenquanyi",22,87,FALSE,QFont::Unicode));
            app.setDefaultCodec(codec);
    
            UserLogin *user_login = new UserLogin(0,"User Login", WIN_FLAGS);
            app.setMainWidget(user_login);
    
            return app.exec();
    }
  6. 使用lupdate工具以项目管理文件如show.pro为输入生成相应的TS文件
  7. 对TS文件进行翻译,使用linguist工具或者直接编辑
  8. 使用lrelease工具以翻译好的TS文件作为输入生成相应的qm文件,就是在main函数中翻译器加载的文件
  9. 如果翻译文件使用的编码和源文件的不一致,可能还需要对翻译指定相应的编解码器,即使用类似以下的语句:
  10. QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
  11. 如果之后又在源文件中进行了代码修改和添加,只需要重复步骤4—6就可以了,lupdate工具只会更新当前的TS文件,即把源文件中新增的待翻译文本加入TS,而不会覆盖之前的翻译。

这样,就完成了显示内容的国际化支持实现,也就可以实现中文的显示,显然该方案更具有扩展性。在源代码中可以只使用英文来完成所有的编写,然后翻译工作留给翻译文件来完成。

你可能感兴趣的:(qt,翻译,中文显示,国际化支持,linguist)