参考: http://blog.chinaunix.net/u1/59571/showart_1670949.html

编写程序

对于国际化程序的编写,终端程序和图形界面程序是不同的,但是后期的翻译步骤是一致的。

终端程序只有gettext函数,可以通过预编译(#define)来简化,而glib中的gi18n.h提供了 _() 宏,比较方便。把所有文本放在 _() 中间即可。

下面编写两个示例来说明。

终端程序:

#include <stdio.h>
#include <libintl.h>
#include <locale.h>
#define _(STRING) gettext(STRING)
int main () {
    setlocale (LC_ALL, "");
    bindtextdomain ("test", "./locale/");
    textdomain ("test");
    printf (_("This is English.\n"));
    return 0;
}

GTK+程序:

#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <stdio.h>

#define GETTEXT_PACKAGE "ubuntu-tweak"
#define LOCALEDIR "./locale"

int main(int argc,char **argv)
{
    GtkWidget *window;
    gtk_init (&argc, &argv);
    bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
    textdomain (GETTEXT_PACKAGE);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW(window), _("help"));
    g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}

二、生成po文件

$ xgettext -k_ -o lang.po ./*.c

三、编辑po文件

将头部的CHARSET改为“UTF–8”,在msgstr后加入翻译。

四、生成mo文件

$ msgfmt -o test.mo lang.po

注意test是你程序中的GETTEXT_PACKAGE名字。

五、移动mo文件

先建立 locale/zh_CN/LC_MASSAGES/ 这个文件夹,然后把mo文件移动过去,注意locale是你程序中的LOCALEDIR。

六、运行程序

呵呵,看看效果吧,在不同的locale下(可修改$LANG),运行的程序效果不同哦~

源码下载

(第一次用skydrive,不知道会不会很麻烦……)

评论