嵌入式Qt方案中文顯示系列:國際化支持實現

上文提到了Qt的國際化支持方案,這裏對這一方案進行簡要的說明。 shell

使用Qt的國際化支持和翻譯機制功能來實現中文的顯示,中文字庫的支持仍是必需的,而後就是使用的Qte庫必須包含了翻譯特性,不能將翻譯特性給裁剪掉,即在qconfig-xxx.h配置文件中不能定義有以下的宏: app

#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,而不會覆蓋以前的翻譯。

這樣,就完成了顯示內容的國際化支持實現,也就能夠實現中文的顯示,顯然該方案更具備擴展性。在源代碼中能夠只使用英文來完成全部的編寫,而後翻譯工做留給翻譯文件來完成。 工具

相關文章
相關標籤/搜索