荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: zzt (好好学习,天天向上), 信区: Linux
标 题: [CPOP]I18N程式实作说明(fwd)
发信站: BBS 荔园晨风站 (Tue Jan 25 11:46:59 2000), 转信
【 以下文字转载自 zzt 的信箱 】
【 原文由 zzt.bbs@bbs.zd.dhs.org 所发表 】
发信人: brianhsu.bbs@bbs.ntu.edu.tw (古墓剑仙), 看板: TW-Linux
标 题: [CPOP]I18N程式实作说明(fwd)
发信站: 台大计中椰林风情站 (Sat Oct 9 14:29:15 1999)
转信站: E1!news.clinux.cz.js.cn!newsfeed.berkeley.edu!dispose.news.demon.net!de
一、I18N简介
在Linux及FreeBSD的世界中,对於双位元语系的支援(如
中文)一向不几麽好,因此在使用中文上是一大问题。但是近来因I18
N的标准被提出,而使的Linux世界中出现中文更为容易。
这篇文章是较属实作性质,对理论基础只略为提过。若您有兴趣,可以参
考居士及小虫的文章。
在一个遵守I18N的程式中,固然会在程式码中写入所要显示的讯息,
但这只会在找不到相同语系对应的讯息档时,才用原来程式设计者所写的
语言。而因为经过特殊的处理,因此在执行程式时并不会直接显示程式设
计师所写的讯息,而会先去找一个目前系统所设定语系的讯息档。如果找
不到,才会去显示程式码中的讯息。
现在我们就来用GTK入门引导手册的Hello World来做如何
把未I18N的程式做I18N。
/************范 例 开 始(未I18N)**************/
#include <gtk/gtk.h>
void hello (GtkWidget *widget, gpointer *data)
{
g_print ("Hello World\n");
}
void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello World!");
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main ();
return 0;
}
/************************范 例 结 束***********************************/
因为我们接下来要用到一些locale.h及libintl.h中的东西,所以请在程式一开
头加上#include <locale.h>及#include <libintl.h>。
再接著,我们为了方便起见,加一行#define _(STRING) gettext(STRING)来让
程式读到_(字串)时,并不直接显示字串内容,而是用gettext来处理。
第三部,我们要定义我们要用的mo档名称,请加入一行#define PACKEG "HelloWorld"
一般来说,我们都把PACKAGE的名称定程和程式名称相同。
接下来我们就要开始定义我们要用的语系了,请在int main (int argc, char *argv[]
)
的区块中下gtk_init (&argc, &argv);的下一行加入setlocale(LC_ALL, "");以及再加
一行textdomain(PACKAGE);
现在我们要开始做些正事了,我们可以看到在程式中有一行g_print ("Hello
World\n");
我们把他改成g_print (_("Hello World\n"));接下来再把button =
gtk_button_new_with_
label ("Hello World!");改成button = gtk_button_new_with_label (_("Hello
World!"));
这样就差不多了,下面是改过的程式:
/************范 例 开 始(I18N)**************/
#include <gtk/gtk.h>
#include <locale.h>
#include <libintl.h>
#define _(STRING) gettext(STRING)
#define PACKAGE "HelloWorld"
void hello (GtkWidget *widget, gpointer *data)
{
g_print (_("Hello World\n"));
}
void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
setlocale(LC_ALL, "");
textdomain(PACKAGE);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label (_("Hello World!"));
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main ();
return 0;
}
/************************范 例 结 束***********************************/
这样子我们就差不多完成了,现在我们要开始做翻译的工作了。现在我们要先回
到文字模示下,再切换到您程式的档案目录中。
接下来我们要开始make这个程式,看看有无错误,请打:
gcc -Wall -g HelloWorld.c -o hello_world -L/usr/X11R6/lib -lglib -lgdk
-lgtk -lX11 -lXext -lm `gtk-config --cflags`
要自己打这一大串是因为这个程式并没有Makefile这个档,如果你要改的程式已
经很不错了,请您直接照他的说明来编译即可。
再来我们打入./hello_world来测试。我们可以看到按钮上的是英文,按下後也
会显示Hello World,也是英文的。
接著请打xgettext -o [您定义的PACKAGE名称.po] -a [程式档名]例如本例如果
存成HelloWorld那就打xgettext -o HelloWorld.po -a HelloWorld.c ,现在我
们可以看到目录下多出了一个HelloWorld.po档,现在我们成功一步了。
这样子我们I18N的工作完成了,接下来要开始作L10N的工作了,请接著
看在下所写的L10N介绍。
---------------------------------------
L10N的还在写,大约明天就可以出来了。
--
~ Brian Hsu (古墓剑仙)
'v' E-Mail : brianhsu@heloo.com.tw
// \\ CLDP Project : http://www.linux.org.tw/CLDP/
/( )\ CLE Project : http://cle.linux.org.tw/CLE/
^`~'^ 站 在 巨 人 的 肩 膀 向 前 眺 望
--
☆ [Origin:椰林风情] [From: 202.39.153.241] [Login: **] [Post: 60]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.11]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店