荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店