2、运行autoscan && mv configure.scan configure.ac && rm -f autoscan*
修改configure.ac,去掉AC_INIT后面括号里的东西,增加AM_INIT_AUTOMAKE(你的包名, 包版本号),并将AC_CONFIG_HEADER改为AM_CONFIG_HEADER,删除掉AC_CONFIG_FILES,改AC_OUTPUT为AC_OUTPUT(Makefile src/Makefile po/Makefile.in),用AC_CONFIG_FILES在automake时会报错。
3、注意加上你程序中用到的库和头文件检测语句,看起来应如下所示:
AC_INIT()
AM_INIT_AUTOMAKE(dsrc, 0.1)
AM_CONFIG_HEADER(config.h)
# Checks for programs.
AC_PROG_CC
AC_PROG_INTLTOOL
# Checks for libraries.
# PKG_CHECK_MODULES可直接在Makefile.am中引用$(xxx_CFLAGS)和$(xxx_LIBS)
PKG_CHECK_MODULES(xml2, [xml2])
PKG_CHECK_MODULES(openssl, [openssl])
AC_CHECK_LIB([pthread], [main])
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([arpa/inet.h libintl.h locale.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([inet_ntoa memset setlocale socket strcasecmp strncasecmp])
# gettext
GETTEXT_PACKAGE=dsrc
AC_SUBST(GETTEXT_PACKAGE)
ALL_LINGUAS="zh_CN"
AM_GLIB_GNU_GETTEXT
AC_OUTPUT([
Makefile
src/Makefile
po/Makefile.in
])
4、准备/Makefile.am
SUBDIRS = src po
dsrcdocdir = ${prefix}/doc/dsrc
dsrcdoc_DATA = \
README\
COPYING\
AUTHORS\
ChangeLog\
INSTALL\
NEWS
EXTRA_DIST = $(dsrcdoc_DATA)
其实这个内容非常简单,一看就明白了,上面所列的EXTRA_DIST为需要安装到/usr/share/doc下的东西,如果你还有其它文档可以加到这个列表中
5、准备src/Makefile.am
INCLUDES = -DLOCALEDIR=\""$(prefix)/share/locale"\"
AM_CFLAGS = -DDEBUG -g $(xml2_CFLAGS)
LIBS = $(xml2_LIBS) $(openssl_LIBS) -lpthread
# AM_LDFLAGS =
bin_PROGRAMS = dsrc
dsrc_SOURCES = main.c security.c XML_utils.c DSRC_handler.c DSRC_builder.c
# dsrc_CFLAGS =
# dsrc_LDFLAGS =
如果会生成多个执行文件可为bin_PROGRAMS增加文件名即可,以空格隔开,下面对每个执行文件需要的源文件定义为xxx_SOURCES即可,如果某执行文件编译参数以及链接参数也可以单独设置:xxx_CFLAGS、xxx_LDFLAGS,不过我建议库文件链接参数直接在configure.ac里AC_CHECK_LIB了事,来得方便点
6、创建automake需要的一些文件
touch AUTHORS NEWS README INSTALL ChangeLog
7、心动从现在开始
aclocal
autoconf
intltoolize
autoheader
automake --add-missing --gnu
8、正事要紧
给自己的程序添加gettext支持,关于gettext的详细介绍可参考其它文章,一般就是以下套路
#include <libintl.h>
#include <locale.h>
#define _(string) gettext(string)
#define N_(string) string
void
i18n_init(void)
{
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
}
通常程序在入口处就调用i18n_init(),在显示常量字符串的时候一般如fprintf(stdout, _("Hello World\n"));
9、创建po文件
创建并进入/po目录,创建POTFILES.in,内容为你需要提取源码中有需要翻译的字符串的源文件列表,每行一个文件,然后执行intltool-update --pot产生pot文件,如果将来你在维护代码中代码有变化或者在POTFILES.in中新增了源文件,可用intltool-update --maintain更新。
有了pot文件,现在需要产生各种语言的po文件,如msginit --locale=zh_CN产生中文po文件,如将来源文件有变化可以intltool-update zh_CN更新zh_CN.po,接下来翻译的工作就是你自己来做了。
要生成特定语言的mo文件,需要维护configure.ac中的ALL_LINGUAS,以空格分隔就可以了
10、测试
./configure --prefix=/usr
make
sudo make install
LANG="zh_CN.UTF-8" xxx
没有评论:
发表评论