准备你的项目
在下面的说明中我们假定你不直接使用gettext,而是使用专门为GNOME编写的intltool。intltool使用gettext()从源代码中提取字符串,但是intltool也从其他文件(例如桌面菜单详情、glade的GUI资源文件)中提取字符串写入到标准的gettext.pot/.po文件中。
我们还假设你正在使用自动构建工具(例如:automake和autoconf)构建你的项目,并且你正在使用来自gnome-common的./autogen.sh或与之类似的autogen.sh文件,在这里它负责初始化intltool。
gnome-common的autogen.sh的替代方案可能如下所示:
#! /bin/sh -e test -n "$srcdir" || srcdir=`dirname "$0"` test -n "$srcdir" || srcdir=. autoreconf --force --install --verbose --warnings=all "$srcdir" echo "Running intltoolize --copy --force --automake" intltoolize --copy --force --automake test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
在你项目的根目录下创建一个名称为po的子文件夹。该目录将包含你的所有翻译。在其中创建一个名为LINGUAS和一个名为POTFILES.in的文件。通常做法是在po文件夹再创建一个ChangeLog文件以便翻译人员跟踪翻译更改。
LINGUAS包含按字母顺序排列的代码列表,这些代码标识程序已翻译的语言(以#开头的行是注释将被忽略)。LINGUAS文件中每个位于代码列表中语言都需要有与之对应的.po文件。因此如果你的程序有德语和日语翻译,你的LINGUAS应如下所示:
# keep this file sorted alphabetically, one language code per line de ja
(此外,你的po文件夹必须有包含德语和日语翻译的ja.po和de.po文件)
POTFILES.in是一个开始于项目根目录,包含所有被标记为需要翻译字符串的文件路径列表。例如你的项目源代码位于src子目录中,其中有两个文件包含有需要被翻译的字符串,则你的POTFILES.in可能如下所示:
src/main.cc src/other.cc
如果你直接使用gettext,则你只能标记源代码文件中的字符串为需要被翻译。如果你使用intltool,则可以对多种格式的文件中的字符串进行标记,如GladeUI文件、XML、.desktop文件等。因此如果你使用Glade设计了应用程序UI,则你还需要将.glade添加到你的POTFILES.in列表中。
现在已经有了放置翻译的地方,你需要初始化intltool和gettext。将一下代码添加到你的configure.ac,将"programname"替换为你的程序的名称:
IT_PROG_INTLTOOL([0.35.0]) GETTEXT_PACKAGE=programname AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"], [The domain to use with gettext]) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.17]) PROGRAMNAME_LOCALEDIR=[${datadir}/locale] AC_SUBST(PROGRAMNAME_LOCALEDIR)
PROGRAMNAME_LOCALEDIR将在稍后被Makefile.am文件使用。以定义在源代码中初始化gettext时将用到的宏。
AM_GLIB_GNU_GETTEXT已由AM_GNU_GETTEXT和AM_GNU_GETTEXT_VERSION替代,且AM_GLIB_GNU_GETTEXT已被弃用,不应在任何新代码中使用。
在顶层Makefile.am中:
- 将po添加到SUBDIRS变量中。如果没有这个,在构建程序时不会生成和安装翻译。
-
定义INTLTOOL_FILES为:
INTLTOOL_FILES = intltool-extract.in \ intltool-merge.in \ intltool-update.in
- 将INTLTOOL_FILES添加到EXTRA_DIST文件列表。这样可以确保执行make dist时这些文件包含在源压缩包中。
-
更新你的DISTCLEANFILES:
DISTCLEANFILES = ... intltool-extract \ intltool-merge \ intltool-update \ po/.intltool-merge-cache
-
根据包含可翻译字符串的文件类型,添加以下代码:
desktopdir = $(datadir)/applications desktop_in_files = programname.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@
在你的src/Makefile.am中,更新你的AM_CPPFLAGS以添加以下预处理宏定义:
AM_CPPFLAGS = ... -DPROGRAMNAME_LOCALEDIR=\"${PROGRAMNAME_LOCALEDIR}\"
在你的源代码中初始化gettext时将使用这个宏。