GTK 多語言對應

2021-04-24 14:17:58 字數 4648 閱讀 6469

、製作po

(1)生成template檔案

xgettext -k_ -o ui_pref.pot ui.c

pref.pot head.

#, fuzzy

msgid ""

msgstr ""

"project-id-version: package version/n"

"report-msgid-bugs-to: /n"

"pot-creation-date: 2008-02-18 10:01+0800/n"

"po-revision-date: year-mo-da ho:mi+zone/n"

"last-translator: full name /n"

"language-team: language /n"

"mime-version: 1.0/n"

"content-type: text/plain; charset=charset/n"

"content-transfer-encoding: 8bit/n"

(2)生成lang.po檔案

假設編寫簡體中文的po檔,

cp ui_pref.pot zh_cn.po

vi zh_cn.po

將頭部的charset 改為 「utf-8」

頭部其餘部分按需要改寫或讓其保持原狀。

msgstr中字串改為msgid對應的翻譯。

例如:zh_cn.po 檔案

#, fuzzy

msgid ""

msgstr ""

"project-id-version: package version/n"

"report-msgid-bugs-to: /n"

"pot-creation-date: 2008-02-18 10:01+0800/n"

"po-revision-date: 2008-02-18 10:01+0800/n"

"last-translator: joyzhao /n"

"language-team: chinese/n"

"mime-version: 1.0/n"

"content-type: text/plain; charset=utf-8/n"

"content-transfer-encoding: 8bit/n"

#: ui.c:152

msgid "select backdrop image or list file"

msgstr "選擇背景"

#: ui.c:157

msgid "all files"

msgstr "所有檔案"

...

2

、生成lang.po

對應的package.mo

msgfmt -o package.mo lang.po

其中, package為應用程式中bindtextdomain繫結的檔名。

3

、copy mo

檔案到指定目錄

cp package.mo /usr/share/locale/zh_cn/lc_massages/

二、程式編寫部分

1)不引用

glib

、gtk

的程式

關鍵**:

#include

#include

#define _(string) gettext(string)

#define package "test"

main ()

再生成各locale目錄下名為test.mo的翻譯檔即可。 

(2)

使用gtk

的程式

方法一:引用

關鍵**:

#include

#include

gtk_set_locale();

//bindtextdomain (package, localedir);

//textdomain (package);

bindtextdomain ("test", "/usr/share/locale");

textdomain ("test");

gtk_init (&argc, &argv);

...gtk_window_set_title(gtk_window(dialog), _("hi"));

...}

方法二:引用

關鍵**:

#include

#define gettext_package "test"

#include

gtk_init (&argc, &argv);

...gtk_window_set_title(gtk_window(dialog), _("hi"));

...}

上述兩種方法是一樣的。

第一種中 gi18n.h將為我們引用#include ,同時定義

#define _(string) gettext (string)

而第二中方法中gi18n-lib.h必須在我們定義了 gettext_package 巨集之後才為我們定義

#define _(string) dgettext (gettext_package, string)

由於gtk_init(); -->gtk_init_check() -->gtk_parse_args() -->gettext_initialization ()

gettext_initialization的**實現:

static void

gettext_initialization (void)

因此方法二中可以省略方法一中紅色高亮的兩行**。

3)引用

xfce libxfce4util

庫的**

關鍵**:

#include

#define gettext_package "test"

#include

gtk_init (&argc, &argv);

...gtk_window_set_title(gtk_window(dialog), _("hi"));

...}

其中,  會進一步引用

這個標頭檔案中在定義了 gettext_package 之後會引用標頭檔案,否則將會使gettext失效。

libxfce4util/xfce-i18n.h內容:

#if defined(gettext_package)

#include

#else

#include

#endif

#if !defined(gettext_package)

#ifdef gettext

#undef gettext

#endif

#ifdef dgettext

#undef dgettext

#endif

#ifdef dcgettext

#undef dcgettext

#endif

#ifdef ngettext

#undef ngettext

#endif

#ifdef dngettext

#undef dngettext

#endif

#ifdef dcngettext

#undef dcngettext

#endif

#define gettext(s)                                            (s)

#define dgettext(domain,s)                                    (s)

#define dcgettext(domain,s,type)                              (s)

#define ngettext(msgid, msgid_plural, n)                      (((n) > 0) ? (msgid) : (msgid_plural))

#define dngettext(domainname, msgid, msgid_plural, n)         (((n) > 0) ? (msgid) : (msgid_plural))

#define dcngettext(domainname, msgid, msgid_plural, n, type) (((n) > 0) ? (msgid) : (msgid_plural))

#endif /* !defined(gettext_package) */

軟體多語言

locale是指特定於某個國家或地區的一組設定,包括字符集,數字 貨幣 時間和日期的格式等。在windows中,每個locale可以用乙個32位數字表示,記作lcid。在winnt.h中可以看到lcid的組成。它的高16位表示字元的排序方法,一般為0。在它的低16位中,低10位是primary la...

多語言切換

專案中應用到了多語言切換,鞏固一下。貼上 大家一起學習。廢話不多說直接上 1 新增多語言 在res values 下預設有個strings,需要多種語言就來建立幾個strings,values右鍵 new 乙個 values res file file name 就是strings director...

Qt 筆記 多語言

1 使用命令 lupdate no obsolete main.pro 作用 將main.pro檔案內的所有源程式檔案中的被tr 包裝的字串打包成.ts檔案,此檔案可以使用qt的qt linguist開啟並翻譯 2 使用命令 lrelease main.pro 作用 通過.ts檔案生成.qm檔案,此...