一、翻译档制作部分
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>,同时定义
第一种中 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.youkuaiyun.com/hwizhao/archive/2008/02/19/2106815.aspx
本文详细介绍了一个项目的国际化流程,包括翻译档的制作、po档与mo档的生成过程,以及不同编程环境下国际化支持的实现方法。
761

被折叠的 条评论
为什么被折叠?



