51.2. 给编程者

51.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

    程序名实际上可以自由选择)。

  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或另一种替代方案标记的文件。最终,这将包括该程序近乎所有的源文件。如果这个列表太长你可以让第一个"file"变成一个+并且第二个词变成一个包含那些文件名的文件,第二个词指向的文件中每个文件名一行。

    GETTEXT_TRIGGERS

    为翻译者产生在其上工作的消息目录的工具需要知道,哪些函数调用包含可翻译的字符串。默认情况下,只有gettext()调用是已知的。如果你使用_或其他标识符,你需要在这里列出它们。如果可翻译的字符串不是第一个参数,该条目需要是形式func:2(用于第二个参数)。如果你有一个支持复数消息的函数,该条目应该看起来像func:1,2(标识单数和复数消息参数)。

构建系统将自动处理消息目录的编译和安装。

51.2.2. 消息书写指南

下面是一些书写已于翻译的消息的指南。