在Qtopia中新增國際化支援

2021-08-22 09:06:58 字數 2226 閱讀 1699

使用 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)。

在Qtopia中新增國際化支援

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

對在Qtopia中新增國際化支援一文補充

經過對qt的分析,發現實際上qt的原理是將各種文字編碼先轉化為utf8編碼,然翻譯為qm檔案來顯示本地字元 這裡不使用findstr msg2qm工具,而採用另外的qt工具lupdate lrelease linguist來完成本地化操作 以qt2 tutorial t1 作為中文翻譯例子 進行了少...

如何為C專案新增國際化po檔案

當你寫好c專案,並且在 中新增完類似 translate this words 這樣的前期工作後。我們就可以開始準備為專案新增po文件了。假設專案結構如下 src po docs test 1.將src目錄下需要翻譯的c檔案列表生成到po目錄下 find src name c po potfilee...