Qt 國際化程式設計

2021-09-30 10:10:03 字數 3225 閱讀 8335

qstring locale = qlocale::system().name();

qtranslator translator;
translator.load(qstring("arrowpad_") + locale);
面說一下qt國際化程式設計的操作步驟:

1、編寫源**

2、在*.pro檔案中新增translations += *.ts ,有多少中語言就新增多少個ts檔案。

3、執行lupdate *.pro 生成ts檔案。lupdate會根據源**中的內容提取出待翻譯的字段,然後生成ts檔案,ts檔案是xml格式的。

4、用qt linguist開啟ts檔案,並翻譯相應字段

5、執行lrelease *.pro生成qm檔案。lrelease會根據ts檔案生成二進位制的qm翻譯檔案。

6、在*.qrc檔案中新增qm檔案的路徑,並編譯源**

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 還不支援動態切換編碼輸入的支援,這是它的不足之處。

1. qt 的文字顯示

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

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

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

對於絕大多數情況,可以用上述方法處理。不過有時在定義某些變數中使用的字串,不能使用上述方法,但是為了讓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程式直接呼叫。

此外,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),

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

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

qt國際化程式設計

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

Qt 國際化程式設計

qt 目前的版本 2.2.4 對國際化的支援已經相當完善。在文字顯示上,qt 使用了unicode 作為內部編碼,可以同時支援多種編碼。為 qt 增加一種編碼的支援也比較方便,只要 增加該編碼和unicode的轉換編碼便可以了。qt 目前支援iso標準編碼iso 8859 1,iso 8859 2,...

QT國際化支援

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