国际化编程

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设为英文则显示仍为上面的英文信息。

posted @ 2017-05-09 14:28  luizp  阅读(660)  评论(0编辑  收藏  举报