Qt 國際化程式設計

2021-09-30 10:14:11 字數 3675 閱讀 9712

qt 目前的版本(2.2.4)對國際化的支援已經相當完善。 在文字顯示上,qt 使用了unicode 作為內部編碼,可以同時支援多種編碼。 為 qt 增加一種編碼的支援也比較方便,只要 增加該編碼和unicode的轉換編碼便可以了。 qt 目前支援iso標準編碼iso 8859-1, iso 8859-2,iso 8859-3,iso 8859-4,iso 8859-5,iso 8859-7,iso 8859-9,和 iso 8859-15(對於阿拉伯語和希伯來語的支援正在開發之中),中文gbk/big5,日文 eucjp/jis/shiftjis,韓文euckr,俄文koi8-r。 當然也可以直接使用utf8編碼。

qt 使用了自己定義的locale機制,在編碼支援和資訊檔案(message file)的翻譯上彌補 了目前unix上所普遍採用locale和gettext的不足之處。 qt 的這種機制可以使 qt 的同一 元件(qwidget)上同時顯示不同編碼的文字。 比如,qt 的標籤上可以同時使用中文簡體 和中文繁體文字。

在文字輸入上,qt 採用了xim(x input method)標準協議,可以直接使用xim輸入伺服器。 由於目前的絕大多數輸入伺服器都是針對單一語言的,所以在 qt 的標準輸入元件( qlineedit,qmultilineedit)中的輸入受到單一編碼的限制,qt 還不支援動態切換編碼 輸入的支援,這是它的不足之處。

使用 qt 編寫國際化的程式,最好不要在程式中直接使用特殊編碼的文字。 比如要 編寫一中文介面的 qt 程式,應該在程式中使用英文,程式編寫完成後,把文字提取 出來翻譯。 這樣,程式還可以根據locale的不同,支援多種語言。 下面介紹如何在 qt 程式中標註字串,如何提取並翻譯文字。

像普通的國際化過程一樣,qt 使用了類似gnu gettext一樣的函式 qobject::tr(),它 用於從qt的資訊檔案 .qm 中取出資訊,這些資訊是經過 qt 的工具處理的。 qt在處理 編碼時還使用了 qtranslator 類,可用於指定整個應用軟體的 的資訊檔案。

下面是一段使用了 qobject::tr()的**,它建立了乙個彈出選單,選單項是"quit", 它被放置在選單條上,在選單條上顯示的是標籤"file"。

qpopupmenu* popup;

popup = new qpopupmenu( this );

menubar->insertitem( tr("&file"),popup );

對於絕大多數情況,可以用上述方法處理。不過有時在定義某些變數中使用的字元 串,不能使用上述方法,但是為了讓qt提取並翻譯該字串,必須用 某種方法標誌出 來。qt 定義了 qt_tr_noop() 和 qt_translate_noop() 來標誌它們。前者用於單個字 符串,後者用於多個字串。比如,

static const char* strings = ;

有時需要使用printf/sprintf之類的函式動態生成字串,比如,

qstings s;

s.sprintf( "button %d",i );

but->settext( s );

對這種使用方式的國際化是使用 arg() 函式。

qstring s = tr( "button %1" ).arg(i);

but->settext( s );

提取上述資訊的方法是使用 qt 提供的工具 findtr 命令:

findtr [filename].cpp > i18n.po

它類似於gnu的 xgettext,上述檔案的提取資訊檔案內包含,

....

"content-type: text/plain; charset=iso-8859-1\n"

#: i18n.cpp:34

msgid "examplewidget::&file"

msgstr ""

...

接下來是文字翻譯過程。 在qt中翻譯資訊檔案時應該注意以下事項: (1) 提取的 資訊檔案的編碼是iso-8859-1,在翻譯成某種語言(編碼)時應該 注意改動它的 字符集,比如對中文gb2312和big5編碼,應該是, "content-type: text/plain; charset=gb2312\n"或者"content-type: text/plain; charset=big5\n"。 (2) 提取的資訊有乙個範圍,比如上面的檔案指定的範圍是 examplewidget, 在翻譯 前應該把它去掉,變成 msgid "::&file"。(3) 被翻譯的字串可能含有加速鍵 符號,如 "&file"中的"f",如果翻譯成中文最好保留該資訊,它可以翻譯成 "檔案(&f)"。

對於翻譯後的檔案(比如上面的翻譯檔案存為 i18n_gb.po),必須使用 qt 提供的 工具 msg2qm 把它轉換為 .qm 檔案才能使用,

> msg2qm i18n_gb.po i18n_gb.qm

它類似於gnu的 msgfmt 命令。翻譯後的檔案可以用qt程式直接呼叫。

qtranslator *translator = new qtranslator(0);

translator->load("i18n_gb.qm",".");

此外,qt 還提供了類似於 msgmerge 的工具 mergetr,它用於把新提取的資訊 檔案和已經翻譯過的資訊檔案融合起來,在此不再贅述。

在 qt 中也可以直接使用 qtextcodec 來轉換字串的編碼,這為在qt下開發純 中文軟體帶來了便利條件,不過這種方法不符和國際化/本地化的習慣,

char *string = "中文和english混和字串!"

qtextcodec* gbk_codec = qtextcodec::codecbyname("gbk");

qstring gbk_string = codec->tounicode(string);

qlabel *label = new qlabel(gbk_string);

如果使程式只支援一種編碼,也可以直接把整個應用程式的編碼設定為gbk編碼, 然後在字串之前 加tr(qobject::tr),

qlabel *label = new qlabel( tr("中文標籤") );

如果使qt根據locale的環境變數取得字符集,可以使用qstring::fromlocal8bit(str)。

本節的例子請參見 qt-i18n-example.tar.gz

回頁首在輸入方面,qt 的輸入條(qlineedit)和編輯區(qmultilineedit)都支援 xim,只要配 合相應的輸入伺服器,便可以輸入中文/日文/韓文。目前有許多支援xim的軟體,比如 中文: chinput/xcin/rfinput/q9,日文: kinput2/skkinput,韓文: ami/hanim。

經過 mizilinux 補丁的qt-2.2.0 支援 onthespot 輸入風格,並且把它作為 預設的輸 入風格。請參見

qt 中的任何乙個 widget 都可以接受輸入,只要它可以有鍵盤聚焦(keyboard focus)。所以對特殊 widget 的輸入處理只需要截獲鍵盤輸入,獲取從xim伺服器 來的字串。 對於overthesport風格的支援,重新整理xim輸入伺服器的位置即可。

回頁首

在列印方面,xwindow下的 qt 生成postscript並使用lpr列印。 它含有qprinter類, 可以方便地支援輸出頁面的控制。 對於中文列印,必須修正postscript檔案的輸出 部分。

qt國際化程式設計

下面說一下qt國際化程式設計的操作步驟 1 編寫源 2 在 pro檔案中新增translations ts 有多少中語言就新增多少個ts檔案。3 執行lupdate pro 生成ts檔案。lupdate會根據源 中的內容提取出待翻譯的字段,然後生成ts檔案,ts檔案是xml格式的。4 用qt lin...

Qt 國際化程式設計

qstring locale qlocale system name qtranslator translator translator.load qstring arrowpad locale 面說一下qt國際化程式設計的操作步驟 1 編寫源 2 在 pro檔案中新增translations ts...

QT國際化支援

為了是我們的qt程式支援如中文等其他語言,通常的做法是在需要翻譯的地方顯示的用tr標記,所以你在閱讀其他人編寫的源程式時會看到很多字串做了tr標記,這樣做是有原因的。1.在hello.pro檔案中增加 translations hello zh cn.ts 2.進入工程目錄,執行 lupdate h...