54.2. 对于程序员

54.2.1. Mechanics

本节描述了如何在 PostgreSQL 发行版中的程序或库中实现本地语言支持。当前,它仅适用于 C 程序。

为程序添加 NLS 支持

#ifdef ENABLE_NLS
#include <locale.h>
#endif

...

#ifdef ENABLE_NLS
setlocale(LC_ALL, "");
bindtextdomain("progname", LOCALEDIR);
textdomain("progname");
#endif

(* progname *实际上可以自由选择.)

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

将更改为:

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

(如果未配置 NLS 支持,则gettext被定义为无操作.)

这往往会增加很多混乱。一种常见的快捷方式是使用:

#define _(x) gettext(x)

如果程序通过一个或几个功能(例如,后端中的ereport())进行大量通信,则另一种解决方案是可行的。然后,在所有 Importing 字符串上内部使此函数调用gettext

构建系统将自动负责构建和安装消息目录。

54 .2.2. 信息撰写准则

这是编写易于翻译的消息的一些准则。

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

句子中的单词 Sequences 在其他语言中可能有所不同。同样,即使您记得在每个片段上调用gettext(),这些片段也可能无法分别翻译。最好复制一些代码,以使每个要翻译的消息都是一个连贯的整体。在运行时,仅数字,文件名和类似的运行时变量应插入到消息文本中。

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);

如果您真的想构造一个适当的多元消息,可以对此进行支持,但是这有点尴尬。在ereport()中生成主要或详细错误消息时,您可以编写如下内容:

errmsg_plural("copied %d file",
              "copied %d files",
              n,
              n)

第一个参数是适合英语单数形式的格式字符串,第二个参数是适合英语复数形式的格式字符串,第三个参数是确定使用哪种复数形式的整数控制值。照常按照格式字符串对后续参数进行格式化。 (通常,复数控制值也将是要格式化的值之一,因此必须将其写入两次.)在英语中,* n 是否为 1 或 1 无关紧要,但是在其他语言中,可以有很多不同的复数形式。译者将这两种英语形式视为一个整体,并有机会提供多个替代字符串,并且根据 n *的运行时值来选择适当的替代字符串。

如果您需要将不直接发送到errmsgerrdetail报告的消息复数,则必须使用基础函数ngettext。请参阅 gettext 文档。

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

这些 Comments 将复制到消息目录文件中,以便翻译人员可以看到它们。

上一章 首页 下一章