如何使用gettext, po, mo製作多語言應用程序[轉]

 一、翻譯檔製作部分

1 、製作 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 <EMAIL@ADDRESS>/n"
"Language-Team: LANGUAGE <[email protected]>/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 <[email protected]>/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 <locale.h>
#include <libintl.h>
 
#define _ (STRING) gettext(STRING)
#define PACKAGE "test"
main ()
{
setlocale(LC_MESSAGES, "");
textdomain (PACKAGE);
printf(_ ( "This is English./n") );
}

 
再生成各locale目錄下名爲test.mo的翻譯檔即可。 
 
(2) 使用 gtk 的程序
方法一: 引用 <glib/gi18n .h>
 
關鍵代碼:
#include <gtk/gtk.h>
#include <glib/gi18n .h>
 
    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") );
...
 
 
方法二 :引用 <glib/gi18n -lib.h>
 
關鍵代碼:
#include <gtk/gtk.h>
#define GETTEXT_PACKAGE "test"
#include <glib/gi18n -lib.h>
 
 gtk_init (&argc, &argv);
...
gtk_window_set_title(GTK_WINDOW(dialog), _ ("hi") );
...


上述兩種方法是一樣的。
第一種中 gi18n .h將爲我們引用#include <libintl.h>,同時定義
#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)
{
#ifdef ENABLE_NLS
 bindtextdomain (GETTEXT_PACKAGE, GTK_LOCALEDIR);
 bindtextdomain (GETTEXT_PACKAGE "-properties", GTK_LOCALEDIR);
#    ifdef HAVE_BIND_TEXTDOMAIN_CODESET
 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 bind_textdomain_codeset (GETTEXT_PACKAGE "-properties", "UTF-8");
#    endif
#endif 
}
 
 
因此方法二中可以省略方法一中紅色高亮的兩行代碼。
 
3 )引用 xfce libxfce4util 庫的代碼
關鍵代碼:
#include <gtk/gtk.h>
#define GETTEXT_PACKAGE "test"
 #include <libxfce4util/libxfce4util.h>
 
 gtk_init (&argc, &argv);
...
 gtk_window_set_title(GTK_WINDOW(dialog), _ ("hi") );
...
 
其中, <libxfce4util/libxfce4util.h>   會進一步引用<libxfce4util/xfce-i18n.h>
這個頭文件中在定義了 GETTEXT_PACKAGE 之後會引用<glib/gi18n -lib.h>頭文件,否則將會使gettext失效。
 
libxfce4util/xfce-i18n.h內容:
#if defined(GETTEXT_PACKAGE)
#include <glib/gi18n -lib.h>
#else
#include <glib/gi18n .h>
#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) */


引用自:
http://blog.csdn.net/hwizhao/archive/2008/02/19/2106815.aspx
發佈了18 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章