天天看點

Qt/Embedded中文化

方案一 2 樓

環境配置:

Qt/Embedded 3.3.3 (其他版本應該大同小異)

        |-----> 在主控端上存放路徑為:/opt/workspace/embedde/Qt/qte-3.3.3-target

        |-----> 在目标機上存放路徑為:/usr/lib/qt-3.3.3/

Qt/X11      3.3   (主要用其中的lupdate,lrelease和lingust工具)

步驟:

1)編寫并編譯應用程式,使用Qt/Embedded的i18n支援,讓應用程式支援多種語言顯示;

2)使用lupdate,lrelease和lingust工具,生成.ts和.qm等i18n需要的檔案;

3)使用makeqpf工具生成中文字型檔案;

4)設定locale,并應用指定字型運作應用程式。

Step 1:編寫并編譯應用程式,使用Qt/Embedded的i18n支援,讓應用程式支援多種語言顯示

  代碼: [複制到剪貼闆]  
  1. #include <qapplication.h>
  2. #include <qlabel.h>
  3. #include <qtextcodec.h>
  4. int main (int argc, char * argv[])
  5. {
  6.         QApplication    app(argc, argv);
  7.         QTranslator     translator;
  8.         translator.load(QString("lang_") + QTextCodec::locale(), qApp->applicationDirPath());
  9.         app.installTranslator(&translator);
  10.         QLabel * label = new QLabel(QObject::tr("Hello, World!"), 0);
  11.         app.setMainWidget(label);
  12.         label->show();
  13.         return app.exec();
  14. }

在上面的代碼中,比較重要的有兩處:

第一處在12-19行,為應用程式生成一個translator,使其支援多種語言。而重中之重則是translator.load()。它指明translator所要加載的.qm(後面步驟會說明.qm檔案的生成方法)檔案的位置。

如果你想使用系統的locale來決定translator所需要使用的語言檔案,那麼你就使用下面的代碼:

  代碼: [複制到剪貼闆]  
  1.         translator.load(QString("lang_") + QTextCodec::locale(), qApp->applicationDirPath());

QTextCodec::locale()會根據系統環境變量LANG目前的值來決定加載的檔案名稱,例如目前lang_zh.qm"的檔案,找到後将其内容加入記憶體中。

如果覺得麻煩不想設定locale,那麼也可以直接指定語言檔案的位置:

  代碼: [複制到剪貼闆]  
  1.         translator.load(QString("lang_zh.qm"), qApp->applicationDirPath());

第二處在25行,生成QLabel時,将Label字元串用QObject::tr()括起來。這是為了同志translator,該字元串會用多種語言顯示,而後面用到的lupdate等工具也是通過這個标志來搜尋源檔案需要翻譯的字元串的。

好,編譯生成應用程式:(大家編譯上應該沒Qt/Embedded及應用程式應該沒有什麼問題了,是以我在這裡隻列出步驟不詳細說明了)

host# export QTDIR=/opt/workspace/embedded/Qt/qte-3.3.3-target/

host# qmake -project -o lang.pro

host# qmake -spec $QTDIR/mkspecs/qws/linux-arm-g++ -o Makefile

host# make

Step 2:使用lupdate,lrelease和lingust工具,生成.ts和.qm等i18n需要的檔案;編寫并編譯應用程式,使用Qt/Embedded的i18n支援,讓應用程式支援多種語言顯示

在上一步中生成的lang.pro檔案中加入TRANSLATIONS的定義,内容如下:

  代碼: [複制到剪貼闆]  
  1. ######################################################################
  2. # Automatically generated by qmake (1.07a) Sun Nov 27 10:27:52 2005
  3. ######################################################################
  4. TEMPLATE = app
  5. CONFIG -= moc
  6. INCLUDEPATH += .
  7. # Input
  8. SOURCES += main.cpp
  9. # Translation
  10. TRANSLATIONS += lang_zh.ts

最後一行就是TRANSLATIONS的定義,lupdate會根據這個定義将目前目錄中所有源檔案中的需要翻譯的字元串提取出來放在main_zh.ts檔案中。我們執行:

host# lupdate -verbose lang.pro

Updating 'lang_zh.ts'...

0 known, 1 new and 0 obsoleted messages

host#

此時目錄中會生成一個lang_zh.ts的XML格式的檔案,内容如下:

  代碼: [複制到剪貼闆]  
  1. <!DOCTYPE TS><TS>
  2. <context>
  3.     <name>QObject</name>
  4.     <message>
  5.         <source>Hello, World!</source>
  6.         <translation type="unfinished"></translation>
  7.     </message>
  8. </context>
  9. </TS>。

我們可以看到Hello, World!出現在該檔案中。下面我們要做的就是翻譯,你可以用lingust,也可以自己翻譯。

Linugst是Qt自帶的翻譯工具,一般RedHat 9.0安裝Qt後都有該工具,在QT/Embedded源碼目錄的tools中也有該工具。使用方法很簡單,我就不詳細說明了。(如果不會用的話,你還是會火星去吧,地球不适合你!)

自己翻譯就是在lang_zh.ts檔案中直接修改,針對"Hello, World!",我們隻要在相應的<translation></translation>中加入翻譯的内容即可。

不管你用什麼方法翻譯,翻譯後的檔案内容應該如下:

  代碼: [複制到剪貼闆]  
  1. <!DOCTYPE TS><TS>
  2. <context>
  3.     <name>QObject</name>
  4.     <message>
  5.         <source>Hello, World!</source>
  6.         <translation type="unfinished">你好,世界!</translation>
  7.     </message>
  8. </context>
  9. </TS>

OK,執行lrelease,生成相應.qm檔案:

host# lrelease -verbose lang.pro

Updating 'lang_zh.qm'...

0 finished, 1 unfinished and 0 untranslated messages

host#

OK,大功告成,趕緊運作一下應用程式:

target# export QTDIR=/usr/lib/qt-3.3.3

target# export QWS_MOUSE_PROTO=LinuxTP:/dev/h3600_ts

target# export QWS_KEYBOARD=Mx1AdsKeypad:/dev/i2c_keypad

target# ./lang -qws

“暈,怎麼是方格!!!shit!”

(呵呵,你太心急了,後面還有兩步沒有做,正常情況下應該顯示不了中文,如果顯示中文了,趕緊去買彩票吧,說不定能種頭獎!)

Step 3:使用makeqpf工具生成中文字型檔案

預設情況下Qt/Embedded在lib/fonts目錄下已經提供了一種可以顯示中文的字型庫,UniFont,其中包含以下幾個檔案:

unifont_160_50.qpf

unifont_160_50_t10.qpf

unifont_160_50_t15.qpf

unifont_160_50_t5.qpf

unifont.bdf

qpf檔案時Qt/Embedded專用的一種适合嵌入式字型,是一種位圖字型,每個檔案隻包含一種尺寸的字型,不能縮放,相應帶來的好處就是占用的磁盤 空間很小,一般隻有600K到1M。一般情況下我們使用這個unifont就可以顯示中文了,效果很不錯。當然如今什麼都要個性化,如果你不喜歡這個字 體,我們下面就自己生成一個中文字型。

在Qt/Embedded的lib/fonts目錄中有一個fontdir的配置檔案,内容如下:

  代碼: [複制到剪貼闆]  
  1. ...
  2. # Unifont is available in source form from http://czyborra.com/unifont/
  3. unifont unifont.bdf BDF n 50 160 u
  4. ...

每一行是關于一種字型的設定,對應列的定義如下:

<字型名稱> <字型檔案名> <字型渲染類型> <是否斜體> <是否粗體> <尺寸> <字型标志> [尺寸清單]

其中,

<字型渲染類型>:可以為TTF,BDF,QPF三種類型;

<是否斜體>:y表示為斜體,n表示正常體;

<是否粗體>:50表示正常體,75表示粗體;

<标志>:a使用ASCII字元集,u使用unicode字元集,s使用鋸齒平滑(anti-aliased);

<尺寸>:0,則系統從[尺寸清單]中提取可以轉換的字型尺寸;

下面我們使用windows下的提供的一種TrueType的字型練練手,我們就以華文細黑字型為例(我個人比較喜歡華文細黑,在我的桌上型電腦上顯示效果很不錯,不過在嵌入系統上顯示的一般):

将stxihei.ttf放到/usr/lib/qt-3.3.3/lib/fonts/目錄中(注意這個是目标機的目錄,不要混淆了),然後編輯該目錄中的fontdir檔案,在檔案最後加入下面的内容:

  代碼: [複制到剪貼闆]  
  1. #Chinese Fonts
  2. stxihei stxihei.ttf FT n 50 140 su

(注意:字型标志一定要加上u,說明使用unicode字元集,不然顯示出現“方塊”什麼的,不要說沒提醒你!)

如果你想使用TrueType字型,那麼這樣的配置就OK了,可以跳過下面的内容直接進入最後一步。

下面我們将TTF字型轉換成QPF字型。Qt/Embedded提供了一個十分友善的工具來完成這項工作makeqpf,該工具放在源碼目錄tools/makeqpf中。

makeqpf通過讀取$QTDIR中的lib/fonts/fontdir來擷取需要轉換的字型資訊,然後生成相應的QPF字型。

使用makeqpf,你可以直接運作:

target# makeqpf

然後點選你想轉換的字型,轉換成功之後,你會在螢幕上看見轉後的字型的顯示效果。

或者你可以運作:

target# makeqpf <font_name> [charset range](例如makeqpf stxihei 0-ff,4e00-fa29)

轉換指定字型中指定範圍内的字元字型。

我們以上述的“stxihei stxihei.ttf FT n 50 140 su”為例,通過在makeqpf中點選stxihei來生成一個華文細黑的QPF檔案,檔案名稱為“stxihei_140_50.qpf”,再次修改 fontdir檔案,注視掉原有的關于stxihei配置,加入新的字型資訊:

  代碼: [複制到剪貼闆]  
  1. #Chinese Fonts
  2. #stxihei stxihei.ttf FT n 50 140 su
  3. stxihei stxihei_140_50.qpf QPF n 50 140 su

OK,現在基本的配置都完成了,趕緊運作一下應用程式:

target# export QTDIR=/usr/lib/qt-3.3.3

target# export QWS_MOUSE_PROTO=LinuxTP:/dev/h3600_ts

target# export QWS_KEYBOARD=Mx1AdsKeypad:/dev/i2c_keypad

target# ./lang -qws

“汗!怎麼還是方格![email protected]#$%...”

Step 4:設定locale,并應用指定字型運作應用程式

如果你剛才在代碼中使用QTextCodec::locale()來決定使用.qm檔案,那麼首先:

target# export LANG=zh

然後最後檢查一下,在目标機上應該有以下内容:

1)$QTDIR/lib/fonts/stxihei_140_50.qpf(或者是stxihei.ttf);

2)$QTDIR/lib/fonts/fontdir中應該有以下的配置:

stxihei stxihei_140_50.qpf QPF n 50 140 su(或者stxihei stxihei.ttf FT n 50 140 su);

3)應用程式目錄下應該有lang_zh.qm檔案。

哈,激動人心的時刻到了,運作:

target# ./lang -qws -font stxihei

或者:

target# ./lang -qws -font unifont

在Qt/Embedded中每個QApplication應用程式啟動時如果不加-font的參數,它會使用預設的字型“Helvetica”,是以除非你應用程式中指定了QApplication對象的字型,否則,就看“方塊”吧。

“其實大多數人就差最後一步,結果被騙看完了整篇文章。嘿嘿,對此我深表遺憾”

Qt/Embedded中文化

繼續閱讀