50.2. 寄语程序员

50.2.1. 机理

本节描述如何在属于 PostgreSQL 版本的程序或者库里面支持本地语言。 目前它只适用于 C 语言。

向程序中增加 NLS 支持

  1. 把下面的代码插入到程序的开头:

    #ifdef ENABLE_NLS
    #include <locale.h>
    #endif
    
    ...
    
    #ifdef ENABLE_NLS
    setlocale(LC_ALL, "");
    bindtextdomain("progname", LOCALEDIR);
    textdomain("progname");
    #endif

    (这里的 progname 实际上可以自由选择。)

  2. 如果发现一条需要翻译的消息,那么就需要插入一个对 gettext() 的调用。比如

    fprintf(stderr, "panic level %d\n", lvl);

    会改成

    fprintf(stderr, gettext("panic level %d\n"), lvl);

    (如果没有配置 NLS ,那么 gettext 会定义成空操作。)

    这么干会出现一堆东西。一种常用的缩写是

    #define _(x) gettext(x)

    如果程序只通过一个或者少数几个函数做大部分的消息传递,比如后端里的 ereport() , 那么也可以用另外一个方法。在这些函数的内部对所有输入字符串调用 gettext

  3. 在程序源代码所在的目录里加一个文件 nls.mk 。 这个文件将被当做 makefile 读取。在这里需要做下面一些变量的赋值:

    CATALOG_NAME

    那些在 textdomain() 调用里提供的程序的名字。

    AVAIL_LANGUAGES

    提供的翻译的语言列表,开始的时候是空的。

    GETTEXT_FILES

    一列包含可翻译字符串的文件,也就是那些用 gettext 或者其它相应手段标记了的文件。 最终,这里会包括几乎所有的程序源文件。如果列表太长,你可以把第一个"文件"写成一个 + 和第二个词组成,第二个词是一个文件,在这个文件里每行包含一个文件名。

    GETTEXT_TRIGGERS

    生成给翻译者使用的消息表的工具,以便知道哪些函数调用包含可翻译字符串。 缺省时只知道 gettext() 调用。 如果你使用了 _ 或其它标识符,那么你需要把它们列在这里。 如果可翻译字符串不是第一个参数,那么该项需要是这样的形式:func:2 (用于第二给参数)。 如果函数支持多个消息,那么该项看起来就像这样:func:1,2(识别单个和多个消息参数)。

编译系统将自动制作和安装消息表。

50.2.2. 消息书写指导

这里是一些关于如何书写易于翻译的消息的指导: