返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

46.2. 寄语程序员

发布于 2019-09-30 03:13:45 字数 2451 浏览 1033 评论 0 收藏 0

46.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 (用于第二给参数)。

制作系统将自动处理制作和安装信息表。

46.2.2. 消息书写指导

这里是一些如何书写消息就可以简化消息翻译方面的指导:

  • 不要偷懒在运行时构造语句,比如像

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

    语句里这样的单词顺序会让其它语言很难翻译。而且,即使你记得在每个片断上调用 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);
  • 如果你想和翻译者进行交流,比如说一条信息是如何与其它输出对齐的,那么在该字符串出现之前,放上一条以 translator 开头的注释,比如

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

    这些注释都拷贝到信息表文件里,这样翻译者就可以看见它们了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文