工程地址

automake语言国际化

最初工程目录结构

$ ls -l
total 16
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 build-aux
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 m4
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 po
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 src
$ ls -l src/
total 4
-rw-rw-r--. 1 fedora fedora 572 May 10 10:38 main.cpp

源文件剖析

$ cat src/main.cpp
#include <glib/gi18n.h>
#include <locale.h>
#include <stdio.h>
#include "config.h" int main(int argc, char *argv[])
{
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
printf(_("gettext"));
return 0;
}

将工程改造成automake

运行autoscan & 修改configure.ac文件

与中级篇不同点

  • 使用AM_GLIB_GNU_GETTEXT宏代替AM_GNU_GETTEXT宏
  • 使用PKG_CHECK_MODULES获取glib-2.0库的编译连接参数

运行aclocal

生成autoconf所需的宏文件aclocal.m4

$ aclocal

运行autoconf

根据configure.ac生成configure脚本

$ autoconf

运行autoheader

生成 config.h.in 文件,用于生成 config.h 文件,此文件保存了configure.ac中定义的宏,可被程序使用

$ autoheader

编写Makefile.am

顶层目录的Makefile.am
  • Makefile.ambuild-aux/gitlog-to-changelog 以及 AUTHORS.in 取自 Virt Viewer ,可以当做模板来使用
  • 一般情况下我们只需要根据 configure.acAC_CONFIG_FILES 来修改 Makefile.am 模板的 SUBDIRS 来决定需要生成Makefile的子目录,每个Makefile.am只需要包含子目录即可,如果有嵌套目录需要生成Makefile,则在子目录的Makefile.am设置 SUBDIRS
  • 这边的Makefile.am比中级篇更加简洁
$ cat Makefile.am
NULL = ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src po EXTRA_DIST = \
build-aux/gitlog-to-changelog \
AUTHORS.in \
$(NULL) DISTCLEAN_FILES = \
$(NULL) MAINTAINERCLEANFILES = \
$(srcdir)/AUTHORS \
$(srcdir)/INSTALL \
aclocal.m4 \
config.h.in \
m4/intltool.m4 \
m4/libtool.m4 \
m4/ltoptions.m4 \
m4/ltsugar.m4 \
m4/ltversion.m4 \
m4/lt~obsolete.m4 \
build-aux/compile \
build-aux/config.guess \
build-aux/config.rpath \
build-aux/config.sub \
build-aux/depcomp \
build-aux/install-sh \
build-aux/ltmain.sh \
build-aux/missing \
$(NULL) dist-hook: gen-ChangeLog gen-AUTHORS # Generate the ChangeLog file (with all entries since the switch to git)
# and insert it into the directory we're about to use to create a tarball.
if OS_WIN32
.PHONY: gen-ChangeLog gen-AUTHORS nsis
else
.PHONY: gen-ChangeLog gen-AUTHORS
endif gen-ChangeLog:
if test -d .git || test -d ../.git; then \
$(top_srcdir)/build-aux/gitlog-to-changelog \
> $(distdir)/cl-t; \
rm -f $(distdir)/ChangeLog; \
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
fi gen-AUTHORS:
$(AM_V_GEN)if test -d $(srcdir)/.git; then \
out="`cd $(srcdir) && git log --pretty=format:'%aN <%aE>' | sort -u`" && \
perl -p -e "s/#authorslist#// and print '$$out'" \
< $(srcdir)/AUTHORS.in > $(distdir)/AUTHORS-tmp && \
mv -f $(distdir)/AUTHORS-tmp $(distdir)/AUTHORS ; \
fi if OS_WIN32
.PHONY: nsis
nsis:
make -C $(builddir)/data virt-viewer-$(VERSION).exe
endif
src目录的Makefile.am
$ cat src/Makefile.am
NULL =
SUBDIRS = EXTRA_DIST = \
$(NULL) DISTCLEANFILES = bin_PROGRAMS = glibGettext
glibGettext_LDADD = glibGettext_CPPFLAGS = \
$(NULL) glibGettext_CXXFLAGS = -ggdb3 -Wall -MMD -fpermissive -g
MAINTAINERCLEANFILES = COMMON_LIBS = \
$(GLIB2_LIBS) \
$(NULL) # linux下程序运行的当前目录不确定所以无法使用相对路径
if !OS_WIN32
COMMON_CPPFLAGS = \
-DLOCALE_DIR=\""$(datadir)/locale"\" \
$(GLIB2_CFLAGS) \
$(NULL)
else
COMMON_CPPFLAGS = \
-DLOCALE_DIR=\""./../share/locale"\" \
$(GLIB2_CFLAGS) \
$(NULL)
endif glibGettext_SOURCES = \
main.cpp \
$(NULL) glibGettext_LDFLAGS = \
$(COMMON_LIBS) \
$(NULL) glibGettext_CPPFLAGS += \
$(COMMON_CPPFLAGS) \
$(NULL)

创建automake必要文件

COPYING 文件可以从一些开源项目下面复制过来,其他文件NEWSREADMEChangeLogAUTHORS使用 touch 命令生成

运行automake

生成 Makefile.in 文件

$ automake -a

编辑po/POTFILES.in文件

填入需要进行国际化字符转换的源文件,即包含文件中包含 _() 的源文件

$ cat po/POTFILES.in
src/main.cpp

执行autogen.sh

  • autogen.sh 取自 Virt Viewer ,可以当做模板来使用
  • 根据实际情况修改 echo "Now type 'make' to compile glibGettext." 即可

生成po文件

  • 执行 make -C po/ update-po 生成程序对应的POT文件 gettext.pot
  • 在po目录下执行 msginit --locale zh_CN.utf8 生成对应语言的PO文件
  • 编辑PO文件完成翻译
  • 创建 LINGUAS 文件,并填入PO文件中的"Language"属性
  • 此处和中级篇一致

运行make

  • 不需要拷贝gettext.h文件
# Linux平台下
$ ./autogen.sh
$ make
$ sudo make install
# windows平台下
$ ./autogen.sh
$ mingw32-configure
$ make
$ sudo make install

测试glibGettext

# Linux平台下
$ LANG=en_GB glibGettext
English
$ LANG=zh_CN glibGettext
中文
  • 怎么把fedora下编译的程序部署到windows平台会在其他章节介绍
# windows平台下
C:\Program Files (x86)\test\bin>set LANG=en_GB
C:\Program Files (x86)\test\bin>glibGettext.exe
English

Automake使用(高级)的更多相关文章

  1. 大型项目使用Automake/Autoconf完成编译配置

    http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...

  2. C实战:项目构建Make,Automake,CMake

    C实战:项目构建Make,Automake,CMake 在本系列文章<C实战:强大的程序调试工具GDB>中我们简要学习了流行的调试工具GDB的使用方法.本文继续"C实战" ...

  3. C实战:项目构建Make,Automake,CMake【转】

    转自:https://blog.csdn.net/dc_726/article/details/48978849 版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎访问 http://blog. ...

  4. 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

    第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...

  5. Spring Boot高级

    Spring Boot高级内容概要一.Spring Boot与缓存二.Spring Boot与消息三.Spring Boot与检索四.Spring Boot与任务五.Spring Boot与安全六.S ...

  6. 大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)

    使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefi ...

  7. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  8. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

  9. 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...

随机推荐

  1. Django创建项目及app

    主要环境为python3.5,编译环境为pycharm 首先已经安装好Django相关的组件 1.首先创建Django程序: windows系统下pycharm创建步骤: File->New P ...

  2. WordPress用户角色及其权限管理编辑插件:User Role Editor汉化版

    如果Wordpress默认的用户角色及权限不能满足您的需求,又觉得修改代码编辑用户权限太麻烦.那不妨试试User Role Editor,Wordpress用户角色及其权限管理编辑插件. User R ...

  3. POJ - 2251 Dungeon Master 【BFS】

    题目链接 http://poj.org/problem?id=2251 题意 给出一个三维地图 给出一个起点 和 一个终点 '#' 表示 墙 走不通 '.' 表示 路 可以走通 求 从起点到终点的 最 ...

  4. ZOJ - 3866 Cylinder Candy 【数学】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3866 思路 积分 参考博客 https://blog.csdn. ...

  5. 构建工具是如何用 node 操作 html/js/css/md 文件的

    构建工具是如何用 node 操作 html/js/css/md 文件的 从本质上来说,html/js/css/md ... 源代码文件都是文本文件,文本文件的内容都是字符串,对文本文件的操作其实就是对 ...

  6. c语言学习的第13天2

    #include <stdio.h> #include <malloc.h> void f(int **q) { *q=(int *)malloc(sizeof(int)); ...

  7. Mysql转换表存储引擎的三种方式

    或许会有一些场景需要改变表的存储引擎,例如存储日志的表如果几乎只有insert和少量的select操作,为了追求更好的插入性能有可能会需要把存储引擎更换为MyISAM.但是,本文不建议在同一个数据库中 ...

  8. 我所理解的RESTful Web API [设计篇]【转】

    原文:http://www.cnblogs.com/artech/p/restful-web-api-02.html <我所理解的RESTful Web API [Web标准篇]>Web服 ...

  9. Unity-2017.2官方实例教程Roll-a-ball(二)

    声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/97b630a23234 上一节Unity-2017.2官方实例教程Roll ...

  10. BZOJ-3940:Censoring(AC自动机裸题)

    Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have p ...