原文地址:http://blog.csdn.net/hwizhao/archive/2008/02/19/2106815.aspx
一、翻译档制作部分
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 <LL@li.org>\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 <joyzhao@linpus.com>\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) */ |
***********************************************************************************
1.最近在最wget的源码,发现它一样支持国际化语言:如
[xiaodao@myfedora src]$ locale
LANG=zh_CN.UTF-8 //locale为中文
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[xiaodao@myfedora src]$ wget --version
GNU Wget 1.10.2 (Red Hat modified)
Copyright (C) 2005 Free Software Foundation, Inc.
此程序发布的目的是希望它会有用,但它不作任何保证;
甚至没有可售性或适用于特定目的的保证。
详情请查看 GNU General Public License。
最初由 Hrvoje Niksic <
hniksic@xemacs.org> 编写。//支持中文
[xiaodao@myfedora src]$
export LC_ALL=en.UTF-8 //将locale设为英文
[xiaodao@myfedora src]$
locale //查看locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=zh_CN.UTF-8
LC_CTYPE="en.UTF-8"
LC_NUMERIC="en.UTF-8"
LC_TIME="en.UTF-8"
LC_COLLATE="en.UTF-8"
LC_MONETARY="en.UTF-8"
LC_MESSAGES="en.UTF-8"
LC_PAPER="en.UTF-8"
LC_NAME="en.UTF-8"
LC_ADDRESS="en.UTF-8"
LC_TELEPHONE="en.UTF-8"
LC_MEASUREMENT="en.UTF-8"
LC_IDENTIFICATION="en.UTF-8"
LC_ALL=en.UTF-8
[xiaodao@myfedora src]$
wget --version GNU Wget 1.10.2 (Red Hat modified)
Copyright (C) 2005 Free Software Foundation, Inc.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
[xiaodao@myfedora wget-1.11.1]$ ls
AUTHORS INSTALL NEWS config.log configure.bat mkinstalldirs stamp-h.in
COPYING MAILING-LIST README config.rpath configure.in msdos tests
ChangeLog Makefile autogen.sh config.status doc po util
ChangeLog.README Makefile.bak autom4te.cache config.sub install-sh src windows
DISTFILES Makefile.in config.guess configure m4 stamp-h
其中po目录正是语言文件
[xiaodao@myfedora wget-1.11.1]$ ls po
Makefile POTFILES.in cs.po en_GB.po eu.po gl.po id.po nl.po ro.po sr.po vi.po
Makefile.in be.po da.po eo.po fi.po he.po it.po pl.po ru.po sv.po zh_CN.po
Makefile.in.in bg.po de.po es.po fr.po hr.po ja.po pt.po sk.po tr.po zh_TW.po
POTFILES ca.po el.po et.po ga.po hu.po nb.po pt_BR.po sl.po uk.po
其中zh_CN.po就是中文语言文件,并且是文本文件,可以用vim查看
[xiaodao@myfedora po]$ export LC_ALL=zh_CN.UTF-8
[xiaodao@myfedora po]$ vi zh_CN.po
呵呵,是中国人翻译的.那如果我们自己要制作这些文件呢?
3.制作mo文件
[xiaodao@myfedora wget-1.11.1]$ xgettext -k_ -o zh_CN.pot src/*.c //生成pot文件,复制它生成zh_CN.po并编辑它
[xiaodao@myfedora wget-1.11.1]$ cp zh_CN.pot zh_CN.po
将po文件打包成mo文件放在/usr/share/locale/zh_CN/LC_MASSAGES/下
[xiaodao@myfedora wget-1.11.1]$ msgfmt -o wget.mo zh_CN.po //po文件是文本文件用于开发,而mo文件不是文本文件,它才是最终为用户使用
最后复制到/usr/share/locale/zh_CN/LC_MESSAGES/
[xiaodao@myfedora wget-1.11.1]$ cp wget.mo usr/share/locale/zh_CN/LC_MESSAGES/