↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

10.2. 给程序员 #

本节描述如何在属于 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))
    

    如果该程序的大部分通信都是通过一个或少数几个函数完成的, 例如后端中的 elog(),另一种可行的解决办法是让这个函数 在内部对所有输入值调用 gettext。

  3. 在包含程序 源码的目录中添加一个文件 nls.mk。这个文件将作为 makefile 读取。这里需要 进行下列变量赋值:

    CATALOG_NAME

    程序名,如 textdomain() 调用中 所提供的那样。

    AVAIL_LANGUAGES

    已有翻译的列表——开始时为空。

    GETTEXT_FILES

    包含可翻译字符串的 文件的列表,即那些用 gettext 或替代 方案标记的文件。最终, 这将包括该程序几乎所有 源文件。如果这个列表 太长,可以让第一个 “文件” 是 +, 第二个词是一个每行包含一个 文件名的文件。

    GETTEXT_TRIGGERS

    为翻译者 生成消息目录的工具需要 知道哪些函数调用包含 可翻译字符串。默认 情况下只有 gettext() 调用是已知的。如果你用了 _ 或其他标识符,需要在此 列出它们。如果可翻译 字符串不是第一个 参数,条目的形式应为 func:2(表示 第二个参数)。

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

为了便于翻译消息,这里有一些指导原则:

  • 不要因为偷懒而像下面这样在运行时拼接句子:

    printf("Files where %s.\n", flag ? "copied" : "removed");
    

    句子中的词序在其他语言里可能不同。

  • 出于类似的原因,这样也不行:

    printf("copied %d file%s", n, n!=1 ? "s" : "");
    

    因为它假定了复数形式的构造方式。如果你以为可以这样解决:

    if (n==1)
        printf("copied 1 file");
    else
        printf("copied %d files", n):
    

    那就会失望了。有些语言的复数形式不止两种, 而且规则相当特殊。将来我们可能会为此提供一个解决方案, 但目前最好从设计上彻底避开这个问题。可以 这样写:

    printf("number of copied files: %d", n);
    
  • 如果你想向翻译者传达某些信息,例如一条消息应如何与其他输出对齐, 就在该字符串出现之前放置一个以 translator 开头的注释,例如:

    /* translator: This message is not what it seems to be. */
    

    这些注释会被复制到消息目录文件中,这样翻译者就能看到它们。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。