首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

怎么使用gettext, po, mo制作多语言应用程序[转]

2012-07-24 
如何使用gettext, po, mo制作多语言应用程序[转]引用自:http://blog.csdn.net/hwizhao/archive/2008/02/19

如何使用gettext, po, mo制作多语言应用程序[转]

引用自:

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.#, fuzzymsgid ""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 文件?#, fuzzymsgid ""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:152msgid "Select backdrop image or list file"msgstr "选择背景图片"?#: ui.c:157msgid "All Files"msgstr "所有文件"...?2 、生成lang.po 对应的PACKAGE.momsgfmt -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

热点排行