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

纵然是瞬间 提交于 2019-12-03 03:26:33

上文提到了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,而不会覆盖之前的翻译。

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

    易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
    该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!