、製作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檔案,此...