7一/090
Linux下国际化编程(Gettext、i18n)
参考:http://blog.chinaunix.net/u1/59571/showart_1670949.html
一、编写程序
对于国际化程序的编写,终端程序和图形界面程序是不同的,但是后期的翻译步骤是一致的。
终端程序只有gettext函数,可以通过预编译(#define)来简化,而glib中的gi18n.h提供了_()宏,比较方便。把所有文本放在_()中间即可。
下面编写两个示例来说明。
终端程序:
#include#include #include #define _(STRING) gettext(STRING) int main () { setlocale (LC_ALL, ""); bindtextdomain ("test", "./locale/"); textdomain ("test"); printf (_("This is English.\n")); return 0; }
GTK+程序:
#include#include #include #define GETTEXT_PACKAGE "gi18n" #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),运行的程序效果不同哦~
源码见这里:http://cid-162cb1a1d5fea75d.skydrive.live.com/self.aspx/.Public/i18n.7z
(第一次用skydrive,不知道会不会很麻烦……)
