国际化编程
gettext软件包
上面的程序运行是主窗口显示为英文,我们完全可以将其改为中文,这样单一的语言版本不适于应用的国际化,GTK+中用gettext软件包来实现国际化,使这一问题变得非常简单。gettext软件包是GNU工程中解决国际化问题的重要工具,目前版本是0.11.x,支持C/C++和JAVA语言,它在开源界应用相当广泛,GNOME/GTK+的国际化问题都是用它来解决的,正常的情况下GNU/LINUX系统是默认安装这一软件包的。
代码实现
首先是在源代码中加入相关的C语言头文件如下:
#include <libintl.h> //gettext支持 #include <locale.h> //locale支持
然后是定义宏,下面的定义形式在GNOME/GTK+中应用的标准格式:
#define PACKAGE "hello" //软件包名 #define LOCALEDIR "./locale" //locale所在目录 #define _(string) gettext(string) #define N_(string) string
在程序的主函数中加入下面相关函数:
bindtextdomain(PACKAGE,LOCALEDIR); //以上函数用来设定国际化翻译包所在位置 textdomain(PACKAGE); //以上函数用来设定国际化翻译包名称,省略了.mo
相关的字符串修改
将代码中需要国际化--即多语言输出的字符串改写为_()宏,代码如下:
gtk_window_set_title(GTK_WINDOW(window),_("Hello World!")); ... ... button=gtk_button_new_with_label(_("Hello World!")); g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(on_button_clicked),(gpointer)(_("Hello, the Free World!"))); ... ...
生成相关文件与翻译
完成以上修改后,执行如下命令:xgettext -k_ -o hello.po hello.c,它的功能是将hello.c中的以下划线开始括号中(如宏定义所示)的字符串加入到hello.po文件中。po文件的头部可以加入软件包的名称、版本、翻译者的邮件地址等,po文件中以#开始的行为注释内容,以下为省略了头部的hello.po文件内容,msgid后面的内容为英文,msgstr后面的内容为翻译的中文,翻译好后保存为UTF8格式。
#: hello.c:26 hello.c:29 msgid "Hello World!" msgstr "你好世界!" #: hello.c:31 msgid "Hello, the Free World!" msgstr "你好,自由的世界!"
下一步执行命令:msgfmt -o hello.mo hello.po将 hello.po文件格式化为hello.mo文件,这样程序在运行时就能根据当前locale的设定来正确读取mo文件中的数据,从而显示关语言的信息了。关于.mo文件的位置,本程序设在./locale目录下的中文目录zh_CN下的LC_MESSAGES目录下,即./locale/zh_CN/LC_MESSAGES 目录下,在REDHAT中默认的目录是/usr/share/locale。将此步骤生成的mo文件复制到相应的目录下,将locale设为简体中文,再运行此程序,测试结果就变为中文了(如下图),如locale设为英文则显示仍为上面的英文信息。