ä»ä¹æ¯ I18N å L10N ï¼
I18N æ¯ internationalization ç缩åå½¢å¼ï¼æå³å¨ i å n ä¹é´æ 18 个åæ¯ï¼æ¬ææ¯æ软件çâå½é åâï¼ä¸ä¹ç±»ä¼¼ï¼L10N æ¯ localization ç缩åå½¢å¼ï¼æå³å¨ l å n ä¹é´æ 10 个åæ¯ï¼æ¬ææ¯æ软件çâæ¬å°åâã
I18N å L10N ä»ä½èæ¥ï¼å®ä»¬æä½åºå«ï¼
æç §è½¯ä»¶å¼åçæ¯ä¾ï¼æåç软件åªæè±æçæ¬ï¼æ ¹æ®éè¦ï¼ä½è åæ软件çé¢åæ档翻è¯æä¸åå½å®¶ãå°åºçè¯è¨çæ¬ãä½æ¯ç±äºå®ç°ç¿»è¯çéå¾ãç¿»è¯çå·¥ä½æ çãç¿»è¯çå¯éç¨æ§çå ç´ åä¸ç¸åï¼ä½¿ç¿»è¯å·¥ä½é¢ä¸´å¾å¤§å°å¢ï¼ä¹é»ç¢äºè½¯ä»¶çæ¨å¹¿ååºç¨ã为äºæ¹ä¾¿å°å°è½¯ä»¶ç¿»è¯æä¸åè¯è¨ççæ¬ï¼å°±éè¦ä¸å¥ç¿»è¯è§èåé ç¨å·¥å ·ï¼è¿å°±å¯¼è´äºâå½é åâæºå¶çåºç°ãä» ä» ç¿»è¯æ¯ä¸å¤çï¼åä¸ç§è¯è¨å¨ä¸åå½å®¶ãå°åºå¯è½åå¨å¤ä¸ªæ¯ç³»ï¼å®ä»¬å¨è¡¨è¾¾ä¹ æ¯ãè¯æ³ç»æçè³æåç§ç±»åç¼ç ä¸é½æä¸åï¼æ¹è¨æ´æ¯åå¥ç¾æªï¼éç¨çç¿»è¯å ¶è´¨éè¯å®æ¯ä¸é«çãæ¶åå°è®¡ç®æºé¢åï¼è¿åå¨æä½ä¹ æ¯ä¸çå·®å«ï¼èä¸å¯¹æç§è¯è¨æä¾å®ç¾çè¾å ¥ãæ¾ç¤ºãæå°ã ä¿åãä¼ è¾å¹¶éä¸ä»¶è½»èæ举çäºï¼è¿å°±å¯¼è´äºâæ¬å°åâæºå¶çåºç°ãç®èè¨ä¹ï¼âå½é åâæ¯âæ¬å°åâçä¸é¨åï¼ä¸»è¦æ¯æå½é åçå®ç°æºå¶åç¿»è¯å·¥ä½ï¼ âæ¬å°åâå å«âå½é åâï¼æ¯å¯¹âå½é åâçè¡¥å åå®åï¼å®è¿å æ¬ä¸ºå®ç°å¯¹æç§ç¹å®è¯è¨è¯å¥½çæ¯æèè¿è¡çæé对æ§çç¿»è¯è°æ´ä»¥å对软件è¿è¡çæè¡¥ä¸å·¥ä½ã
I18N å L10N çå½é ç»ç»æ¯ä»ä¹ï¼
I18N å L10N çå½é ç»ç»æ¯ Openi18n ç»ç»ï¼ å ¶åèº«æ¯ li18nux ç»ç»ãå®åæ¥æ¯å¶å® GNU/Linux èªç±æä½ç³»ç»ä¸è½¯ä»¶å ¨çåæ åçå½é 计åï¼åæ¥æ©å å° GNU/Linux ä¹å¤ææå¼æ¾æºä»£ç çææ¯é¢åï¼å èæ´å为 Open Internationalization Initiativeï¼ ç±éè¥å©ç»ç» Free Standards Group èµå©ï¼å¹¶ä¸ºä¸çå大ååææ¯æï¼å¯¹äº GNU/Linux ç³»ç»ä¸çå¤å½è¯è¨ æåå¤çææ¯åç¯å¢æå³å®æ§çå½±åãå个å¼æºè½¯ä»¶å¼åç»ç»é常é½æè´è´£âå½é åâåâæ¬å°åâå·¥ä½çåæ¯æºæã
I18N 主è¦ä½¿ç¨ä»ä¹å·¥å ·å·¥ä½ï¼
I18N 主è¦ä½¿ç¨ gettext 软件å 使软件å®ç°å½é åæ¯æãäºå®ä¸å®æ¯ä¸æ´å¥ I18N 解å³æ¹æ¡ã
ä»ä¹æ¯ GPLãLGPL å GFDLï¼å®ä»¬åæºä»£ç 以ååä¸éå®ä¹é´çå ³ç³»æ¯ä»ä¹ï¼
GPL æ¯ GNU General Public License (GNU éç¨å ¬å ±è®¸å¯è¯)ç缩åå½¢å¼ï¼LGPL æ¯ GNU Lesser General Public License (GNU 宽éç¨å ¬å ±è®¸å¯è¯)ç缩åå½¢å¼ï¼æ§ç§° GNU Library General Public License (GNU åºéç¨å ¬å ±è®¸å¯è¯)ï¼GFDL æ¯ GNU Free Documentation License (GNU èªç±æ档许å¯è¯)ç缩åå½¢å¼ãå®ä»¬æ¯èªç±è½¯ä»¶(Free Software)çéç¨çæ认è¯åè®®ï¼ç±èªç±è½¯ä»¶åºéä¼(FSF)å¶å®ååå¸ã
- åºäº GPL ç软件å 许åä¸åéå®ï¼ä½ä¸å 许å°éæºä»£ç ã
- å¦ææ¨å¯¹éµå¾ª GPL ç软件è¿è¡ä»»ä½æ¹å¨å/æå次å¼å并äºä»¥åå¸ï¼åæ¨ç产åå¿ é¡»ç»§æ¿ GPL åè®®ï¼ä¸å 许å°éæºä»£ç ã
- åºäº LGPL ç软件ä¹å 许åä¸åéå®ï¼ä½ä¸å 许å°éæºä»£ç ã
- å¦ææ¨å¯¹éµå¾ª LGPL ç软件è¿è¡ä»»ä½æ¹å¨å/æå次å¼å并äºä»¥åå¸ï¼ åæ¨ç产åå¿ é¡»ç»§æ¿ LGPL åè®®ï¼ä¸å 许å°éæºä»£ç ãä½æ¯å¦ææ¨çç¨åº 对éµå¾ª LGPL ç软件è¿è¡ä»»ä½è¿æ¥ãè°ç¨èä¸æ¯å å«ï¼åå 许å°éæºä»£ç ã
ä»ä¹æ¯ PO å MO æ件ï¼å®ä»¬æä½åºå«ï¼
PO æ¯ Portable Object (å¯ç§»æ¤å¯¹è±¡)ç缩åå½¢å¼ï¼MO æ¯ Machine Object (æºå¨å¯¹è±¡) ç缩åå½¢å¼ãPO æ件æ¯é¢åç¿»è¯äººåçãæåäºæºä»£ç çä¸ç§èµæºæ件ãå½è½¯ä»¶å级çæ¶åï¼ éè¿ä½¿ç¨ gettext 软件å å¤ç PO æ件ï¼å¯ä»¥å¨ä¸å®ç¨åº¦ä¸ä½¿ç¿»è¯ææå¾ä»¥ç»§æ¿ï¼åè½»ç¿»è¯ äººåçè´æ ãMO æ件æ¯é¢å计ç®æºçãç± PO æ件éè¿ gettext 软件å ç¼è¯èæçäºè¿å¶æ 件ãç¨åºéè¿è¯»å MO æ件使èªèº«ççé¢è½¬æ¢æç¨æ·ä½¿ç¨çè¯è¨ã
Â
Â
Linuxç³»ç»æ¬èº«å ·å¤å®åçå¤è¯è¨æ¯æä½ç³»ï¼å¯ä½¿åä¸ä¸ªå¯æ§è¡æ件æ¥æä¸åå°æ¹è¯è¨çå¾å½¢çé¢ãè¿å ¶ä¸æ¶åå°ä¸¤ä¸ªéè¦æ¦å¿µï¼å½é åä¸æ¬å°åã
å½é åæ¯æå°å¼åè åå 使ç¨çæ¯è¯ç¿»è¯æå¤ç§å ¶ä»çè¯è¨ãç±äºå®ç°ç¿»è¯çéå¾ãç¿»è¯çå·¥ä½æçãç¿»è¯çå¯éç¨æ§çå ç´ åä¸ç¸åï¼ä½¿ç¿»è¯å·¥ä½é¢ä¸´å¾å¤§å°å¢ï¼ä¹é»ç¢äºè½¯ä»¶çæ¨å¹¿ååºç¨ã为äºæ¹ä¾¿å°å°è½¯ä»¶ç¿»è¯æä¸åè¯è¨ççæ¬ï¼å°±éè¦ä¸å¥ç¿»è¯è§èåéç¨å·¥å ·ï¼äºæ¯å°±è¯çäºi18nå·¥å ·éãi18nå³âinternationalizationâç缩åå½¢å¼ï¼ä¸»è¦ä½¿ç¨gettext软件å å®ç°å½é åæ¯æã
æ¬å°åæ¯æå¯æ§è¡æ件è½å¤æ ¹æ®å½åçè¯è¨ç¯å¢éæ©å¾å½¢çé¢ä¸ä½¿ç¨çè¯è¨ãé¤è¯è¨ä»¥å¤ï¼å符ç¼ç ãè¯æ³ã度éåä½ãæ¥ææ¶é´æ ¼å¼ãé è¯»ä¹ æ¯ã使ç¨ä¹ æ¯çä¹æ¯éè¦èèçé®é¢ï¼å æ¤è®¾è®¡äºl10nå·¥å ·éãl10næ¯localizationç缩åå½¢å¼ï¼ä¸»è¦ä½¿ç¨locale软件å å®ç°æ¬å°åæ¯æã
å¨æ¦å¿µä¸ï¼æ¬å°åå å«å½é åï¼ä¸¤è ç¸è¾ ç¸æã
poæ件æ为å¯ç§»æ¤å¯¹è±¡ï¼moæ件æ为æºå¨å¯¹è±¡ãpoæ件æ¯é¢åç¿»è¯äººåãæåäºGlade项ç®çä¸ç§èµæºæ件ãå½è½¯ä»¶å级çæ¶åï¼éè¿ä½¿ç¨gettext软件å å¤çpoæ件ï¼å¯ä»¥å¨ä¸å®ç¨åº¦ä¸ä½¿ç¿»è¯ææå¾ä»¥ç»§æ¿ï¼å轻翻è¯äººåçè´æ ãmoæ件æ¯é¢å计ç®æºçãç±poæ件éè¿gettext软件å ç¼è¯èæçäºè¿å¶æ件ãç¨åºéè¿è¯»åmoæ件使èªèº«ççé¢è½¬æ¢æç¨æ·ä½¿ç¨çè¯è¨ã
-----------------
å ³äºGTK GETTEXT
gettext软件å æ¯GNUå·¥ç¨ä¸è§£å³å½é åé®é¢çéè¦å·¥å ·ï¼æ¯æC/C++åJAVAè¯è¨ï¼å®å¨å¼æº çåºç¨ç¸å½å¹¿æ³ï¼GNOME/GTK+çå½é åé®é¢é½æ¯ç¨å®æ¥è§£å³çï¼æ£å¸¸çæ åµä¸GNU/LINUXç³»ç»æ¯é»è®¤å®è£ è¿ä¸è½¯ä»¶å çã
   é¦å ï¼åºç¨ç¨åºè¦å å«ä¸¤ä¸ªå¤´æ件ï¼å¹¶ä¸åä¸ä¸å®ä¹ï¼
GTK1.2ç¨åºå½é åæ¥éª¤ æ两ç§æ¹æ³ 第ä¸ç§ï¼ä½¿ç¨gettext软件å é¦å å¨æºä»£ç å å ¥ç¸å ³ç头æ件å¦ä¸ï¼
#include <libintl.h>              //gettextæ¯æ
#include <locale.h>               //localeæ¯æ
ç¶åæ¯å®ä¹å®ï¼ä¸é¢çå®ä¹å½¢å¼å¨GNOME/GTK+ä¸åºç¨çæ åæ ¼å¼ï¼
#define _(string)Â Â Â Â Â Â Â Â gettext(string)
#define N_(string)Â Â Â Â Â Â Â string
Â
å¨ç¨åºç主å½æ°ä¸å å ¥ä¸é¢ç¸å ³å½æ°ï¼
//以ä¸å½æ°ç¨æ¥è®¾å®å½é
åç¿»è¯å
æå¨ä½ç½®
bindtextdomain(软件å
å,
localeæå¨ç®å½);
å¦ï¼bindtextdomain("hellogtk","/usr/share/locale/");
//以ä¸å½æ°ç¨æ¥è®¾å®å½é
åç¿»è¯å
å称ï¼çç¥äº.mo
textdomain(软件å
å);
å¦ï¼textdomain("hellogtk");
Â
ç¸å ³çåç¬¦ä¸²ä¿®æ¹ å°ä»£ç ä¸éè¦å½é å--å³å¤è¯è¨è¾åºçå符串æ¹å为_()å®ï¼ä»£ç å¦ä¸ï¼
gtk_window_set_title (GTK_WINDOW(window), _("Hello Gtk!"));
â¦â¦
label=gtk_label_new( _("Enter a message:") );
â¦â¦
button=gtk_button_new_with_label (_("Print"));
 çæç¸å ³æ件ä¸ç¿»è¯ å®æ以ä¸ä¿®æ¹åï¼æ§è¡å¦ä¸å½ä»¤ï¼ xgettext âa -o hellogtk.po hellogtk.c å®çåè½æ¯å°hellogtk.cä¸ç以ä¸å线å¼å§æ¬å·ä¸ï¼å¦å®å®ä¹æ示ï¼çå符串å å ¥å°hellogtk.poæ件ä¸ã  修æ¹hellogtk.poæ件 poæ件ç头é¨å¯ä»¥å å ¥è½¯ä»¶å çå称ãçæ¬ãç¿»è¯è çé®ä»¶å°åçï¼poæ件ä¸ä»¥#å¼å§çè¡ä¸ºæ³¨éå 容ï¼ä»¥ä¸ä¸ºçç¥äºå¤´é¨çhellogtk.poæ件å 容ï¼msgidåé¢çå 容为è±æï¼msgstråé¢çå 容为翻è¯çä¸æï¼ç¿»è¯å¥½åä¿å为UTF8æ ¼å¼ã 注ï¼ç³»ç»i18næ好æ¹ä¸ºzh_CN.GB2312ï¼ä¸ç¶ç¿»è¯çmsgsträ¼åä¸ä¸ã vi hellogtk.po  "Content-Type: text/plain; charset= CHARSET/n" "Content-Type: text/plain; charset= zh_CN.GB2312/n"
#: hellogtk.c:45
msgid "Hello Gtk!"
msgstr "ä½ å¥½ Gtk!"
#: hellogtk.c:54
msgid "Enter a message:"
msgstr "è¾å
¥ä¸ä¸ªä¿¡æ¯:"
#: hellogtk.c:64
msgid "Print"
msgstr "æå°"
 ä¸ä¸æ¥æ§è¡å½ä»¤ï¼ msgfmt -o hellogtk.mo hellogtk.po cp hellogtk.mo /usr/share/locale/zh_CN.GB2312/LC_MESSAGE gcc hellogtk.c âo hellogtk `gtk-config --cflags --libs` ./hellogtk å° hello.poæä»¶æ ¼å¼å为hello.moæ件ï¼è¿æ ·ç¨åºå¨è¿è¡æ¶å°±è½æ ¹æ®å½ålocaleç设å®æ¥æ£ç¡®è¯»åmoæ件ä¸çæ°æ®ï¼ä»èæ¾ç¤ºç¸å ³è¯è¨çä¿¡æ¯äºãå ³äº.moæ件çä½ç½®ï¼å¨REDHATä¸é»è®¤çç®å½æ¯/usr/share/localeãå°æ¤æ¥éª¤çæçmoæ件å¤å¶å°è¯¥çç®å½ä¸ï¼å°locale设为zh_CN.GB2312ï¼è¿è¡æ¤ç¨åºï¼æµè¯ç»æå°±å为ä¸æäºï¼å¦locale设为è±æåæ¾ç¤ºä»ä¸ºè±æä¿¡æ¯ã  éå½ï¼æºä»£ç #include<stdio.h> #include<gtk/gtk.h> #include <locale.h> #include <libintl.h> #define _(String) gettext(String) #define N_(String) (String)  static GtkWidget *entry; void PrintAndExit (GtkWidget *widget,GtkWidget *window) {  char *str;  str=gtk_entry_get_text(GTK_ENTRY(entry));  if (str !=(char *) NULL)       printf( "%s/n", str); }  void PrintByeAndExit (GtkWidget *widget,gpointer data) {  printf( _("Goodbye,Gtk!/n" ));  gtk_exit(0); }  int   main( int argc,char *argv[ ] ) {  GtkWidget *window, *label,*vbox,*hbox,*button,*separator;  gtk_set_locale ();  bindtextdomain("hellogtk","/usr/share/locale/");  textdomain("hellogtk");  gtk_init(&argc,&argv);   window=gtk_window_new (GTK_WINDOW_TOPLEVEL);  gtk_window_set_policy(GTK_WINDOW(window),FALSE,FALSE,FALSE);  gtk_signal_connect (GTK_OBJECT(window), "destroy",              GTK_SIGNAL_FUNC(PrintByeAndExit),NULL);  gtk_window_set_title (GTK_WINDOW(window), _("Hello Gtk!"));  gtk_container_border_width(GTK_CONTAINER(window),0);   vbox=gtk_vbox_new (FALSE,0);  gtk_container_add(GTK_CONTAINER(window),vbox);   hbox=gtk_hbox_new (FALSE,0);  gtk_box_pack_start (GTK_BOX (vbox),hbox, FALSE,FALSE,0);   label=gtk_label_new( _("Enter a message:") );  gtk_box_pack_start (GTK_BOX(hbox), label,FALSE,FALSE,0);  entry=gtk_entry_new ();  gtk_entry_set_text (GTK_ENTRY(entry),"");  gtk_editable_select_region(GTK_EDITABLE (entry),0,-1);  gtk_box_pack_start (GTK_BOX (hbox),entry,FALSE,FALSE,0);   separator=gtk_hseparator_new();  gtk_box_pack_start (GTK_BOX(vbox),separator,FALSE,FALSE,0);   button=gtk_button_new_with_label (_("Print"));  gtk_signal_connect_object(GTK_OBJECT(button),"clicked",              GTK_SIGNAL_FUNC(PrintAndExit),NULL);  gtk_box_pack_start (GTK_BOX(vbox),button,FALSE,FALSE,0);  GTK_WIDGET_SET_FLAGS (button,GTK_CAN_DEFAULT);  gtk_widget_grab_default (button);  gtk_widget_show_all (window);  gtk_main();  return(0); } 第äºç§æ¹æ³ï¼ä½¿ç¨èµæºæ件ï¼æ ¹æ®äºæä¿èå¸çæç« ã使ç¨Gtkç¼åä¸æ软件ãï¼ GTK/GNOME ç³»åwidgetsä¸, è¾å ¥åæ¾ç¤ºå·²ç»æ¯å½é åäºç. æ以ç¨å®ä»¬ç¼åä¸æ软件åå容æ. æ西æ软件æ¹åæä¸æ软件ä¹åå容æ. ·        å¨ç¨åºä¸å å« locale.h ·        å¨gtk_initå设置locale: gtk_set_locale() ·        æ¥çè°ç¨gtk_rc_add_default_file("rcfilename"),å ¶ä¸rcfilenameä¸å«æ缺ççfontset ·        å¦æä¸ç¨èµæºæ件, ååºå¯¹widget设置fontset ·        ç¼è¯ gcc `gtk-config --cflags` entry.c -o entry `gtk-config --libs` ·        ææ件gtkrc.zh æ·è´å°å½åç®å½ä¸ å¨gtkçtextç»ä»¶ä¸å¦æ设置äºfont,åä¸è½æ£å¸¸æ¾ç¤ºä¸æ.解å³çæ¹æ³æ¯æfontéæ¾(unref), ç¶åä½¿ç¨ gtk_fontset_load åä½é. 对äºå ¶å®ç»ä»¶ä¹æ¯å¦æ¤, æçç»ä»¶éè¦å æ·è´ä¸ä¸ª GtkStyle, ç¶åæä¸è¿°æ¹æ³è§£å³. ä¸é¢çç¨åºå¨æ¾ç¤ºä¸ææ¶æªä½¿ç¨ä¸æå¹³å°,è¾å ¥ä½¿ç¨çæ¯Chinputä¸çXIMåè®®æ¯æ,è¾åºç»æ: //file entry.c  #include <locale.h> #include <gtk/gtk.h>  int main (int argc, char *argv[]) {    GtkWidget *window;    GtkWidget *vbox;    GtkWidget *entry;    GtkWidget *text;    GtkWidget *button;     gtk_set_locale();    gtk_rc_add_default_file("./gtkrc.zh");    gtk_init (&argc, &argv);       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);    gtk_widget_set_usize( GTK_WIDGET (window), 200, 500);    gtk_window_set_title(GTK_WINDOW (window), "GTK Entry");    gtk_signal_connect(GTK_OBJECT (window), "delete_event",                       (GtkSignalFunc) gtk_exit, NULL);     vbox = gtk_vbox_new (FALSE, 0);    gtk_container_add (GTK_CONTAINER (window), vbox);    gtk_widget_show (vbox);     entry = gtk_entry_new_with_max_length (60);    gtk_entry_select_region (GTK_ENTRY (entry),                              0, GTK_ENTRY(entry)->text_length);    gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);    gtk_widget_show (entry);     text = gtk_text_new (NULL, NULL);    gtk_text_set_editable (GTK_TEXT (text), TRUE);    gtk_box_pack_start (GTK_BOX (vbox), text, TRUE, TRUE, 0);    gtk_widget_show(text);     button = gtk_button_new_with_label ("å ³éçªå£");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                                GTK_SIGNAL_FUNC(gtk_exit),                                GTK_OBJECT (window));    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);    gtk_widget_grab_default (button);    gtk_widget_show (button);       gtk_widget_show(window);     gtk_main();    return(0); }  >gcc entry.c -o entry `gtk-config --cflags --libs` >./entry Â