准备你的项目

在下面的说明中我们假定你不直接使用gettext,而是使用专门为GNOME编写的intltoolintltool使用gettext()从源代码中提取字符串,但是intltool也从其他文件(例如桌面菜单详情、glade的GUI资源文件)中提取字符串写入到标准的gettext.pot/.po文件中。

我们还假设你正在使用自动构建工具(例如:automakeautoconf)构建你的项目,并且你正在使用来自gnome-common./autogen.sh或与之类似的autogen.sh文件,在这里它负责初始化intltool

gnome-commonautogen.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.pode.po文件)

POTFILES.in是一个开始于项目根目录,包含所有被标记为需要翻译字符串的文件路径列表。例如你的项目源代码位于src子目录中,其中有两个文件包含有需要被翻译的字符串,则你的POTFILES.in可能如下所示:

src/main.cc
src/other.cc

如果你直接使用gettext,则你只能标记源代码文件中的字符串为需要被翻译。如果你使用intltool,则可以对多种格式的文件中的字符串进行标记,如GladeUI文件、XML、.desktop文件等。因此如果你使用Glade设计了应用程序UI,则你还需要将.glade添加到你的POTFILES.in列表中。

现在已经有了放置翻译的地方,你需要初始化intltoolgettext。将一下代码添加到你的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_GETTEXTAM_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时将使用这个宏。