所谓的国际化,就是将让自己的程序在不同的计算机环境中有不同的信息提示,大的软件如Windows XP有英文版,也有中文版。小的软件如下面的程序:
int main()
{
printf("hello, world!\n");
}
如何能让该程序在英文环境中显示“hello, world!”而在中文环境中显示“世界,你好!”?最简单的方法是直接修改源代码,重新编译。假如该程序要有几十种语言的版本,就要有几十份源码。这非常的难于维护。于是GNU提供了Gettext作为解决方案。
下面的介绍,只是入门级别的使用说明,如果你是老鸟,也欢迎指出错误。
本文以gcc作为编译器,所有的环境配置都是在Windows XP,Dev-C++下完成,如果你使用其它的编译器,配置略有不同,应该不会有太大的差别。
整个的环境的构建需要以下的工具:
安装完Gettext后,还要作少许的配置,首先把C:\Program Files\GnuWin32\bin添加到PATH环境变量中。然后把include目录下的libintl.h拷贝到Dev-C++的include目录下,lib目录下的libintl.a拷贝到Dev-C++的lib目录下。当然你可以不那么作,但是配置要复杂一些。
启动Dev-C++,新建一个空工程,然后在Project|Project Options|parameters|linker中加入../../../Dev-Cpp/lib/libintl.lib。在该工程内添加源码文件gettext_test.c,源码如下:
#include <stdio.h>
#include <locale.h>
#include <libintl.h>
#define _(string) gettext(string)
int
main (int argc, char *argv[])
{
setlocale (LC_ALL, "");
/**
告诉该程序到gettext_test.mo中去找其它语音的信息。
*/
textdomain ("gettext_test");
/**
到当前目录中的language目录下去找
*/
bindtextdomain ("gettext_test", "language");
if(argc < 2)
{
printf(_("not enough parameter!\n"));
printf(_("usage: %s username\n"), argv[0]);
exit(1);
}
printf (_("welcome to world of gettext, %s!\n"), argv[1]);
return 0;
}
|

|
包含Gettext的头文件。
|
|

|
定义宏,为了少敲几个字符。gettext()是Gettext中的一个函数。
|
|

|
将系统运行的语言环境设置为程序运行的环境,在我的机器是中文环境。
|
|

|
告诉该程序到gettext_test.mo中去找输出语言的信息。关于gettext_test.mo是什么,下面要讲到。
|
|

|
告诉程序到当前目录的language目录下去找gettext_test.mo文件。
|
该程序和背景说明章节中的程序有明显的不同是把所有的字符串信息用_()包围起来,实际上是把它们作为gettext()的参数。编译运行该程序,
假定该程序名是gettext_test.exe,如果直接运行gettext_test.exe,它会输出英文字符串提示参数不够,给出程序的使用方
法。
可是这个国际化还差很远啊,是的,下面还有一系列的工作要作:
-
在源码gettext_test.c的目录下运行xgettext --keyword=_ -o gettext_test.po gettext_test.c,就会得到一个文本文件gettext_test.po。
-
用任意一个文本编辑器,如记事本打开它,跳过前面的一些文件头的信息,会发现程序中所有用_()包含的字符串都以下面的形式出现:
#: gettext_test.c:26
#, c-format
msgid "usage: %s username\n"
msgstr ""
只要在msgstr后面的引号中填入对应语言的翻译即可,例如这一句可以改为:
#: gettext_test.c:26
#, c-format
msgid "usage: %s username\n"
msgstr "使用方法:%s 用户名\n"
-
保存好翻译后运行命令:msgfmt -o language/zh_CN/LC_MESSAGES/gettext_test.mo gettext_test.po。这样就生成了语言包的二进制格式,根据程序中的设置,该程序会到当前目录的language子目录中寻找语言包,所以gettext_test.po最终放置的位置是当前目录/language/zh_CN/LC_MESSAGES。zh_CN表示中文,如果你建立了如法文等其它的语言包,还需要建立fr目录等。
-
再次运行程序,看看输出的信息是不是中文的?应该是。