|
|
本节描述如何在属于
PostgreSQL
版本的程序或者库里面支持本地语言.
目前它只适用于 C 语言.
向程序中增加 NLS 支持
-
把下面的代码插入到程序的开头∶
#ifdef ENABLE_NLS
#include <locale.h>
#endif
...
#ifdef ENABLE_NLS
setlocale(LC_ALL, "");
bindtextdomain("
progname
", LOCALEDIR);
textdomain("
progname
");
#endif
(这里的
progname
实际上可以
自由选择.)
-
如果发现一条需要翻译的信息,那么就需要插入一个对
gettext()
的调用.比如
fprintf(stderr, "panic level %d\n", lvl);
会改成
fprintf(stderr, gettext("panic level %d\n"), lvl);
(如果没有配置 NLS,那么
gettext
会定义成一个无操作.)
这么干会出现一堆东西.一种常用的缩写是
#define _(x) gettext((x))
如果程序通过一个或者少数几个函数做了大量的通讯,
比如后端里的
elog()
,
那么也可以用另外一个方法.然后你另这些函数在所有输入值上
内部调用
gettext
.
-
在带程序源代码的目录里加一个文件
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. */
这些注释都拷贝到信息表文件里,这样翻译者就可以看见它们了.
|