46.2. 寄語程序員

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

    如果程序通過一個或者少數幾個函數做了大量的通訊, 比如後端裡的 elog(), 那麼也可以用另外一個方法.然後你另這些函數在所有輸入值上內部調用 gettext

  3. 在帶程序源代碼的目錄裡加一個文件 nls.mk. 這個文件將被當做 makefile 讀取.在這裡需要做下面一些變量的 賦值︰

    CATALOG_NAME

    程序的名字,就是那些在 textdomain() 調用裡提供的。

    AVAIL_LANGUAGES

    提供的翻譯的語言列表 -- 開始的時候是空的。

    GETTEXT_FILES

    一列包含可翻譯字串的文件,也就是那些用 gettext 或者其它相應手段標記了的文件。最終,這裡會包括幾乎所有的程序源文件。 如果列表太長,你可以把第一個"文件"寫成一個 +和第二個詞組成,第二個詞是一個文件,在這個文件裡每行包含一個文件名。

    GETTEXT_TRIGGERS

    生成給翻譯者使用的信息表的工具,以便知道哪些函數調用包含可翻譯字串。 缺省時只知道 gettext() 調用。 如果你使用了 _ 或其它標識符,那麼你需要把它們列在這裡。 如果可翻譯字串不是第一個參數,那麼該項需要是下面的形式: func:2(用于第二給參數)。

制作系統將自動處理制作和安裝信息表。

46.2.2. 消息書寫指導

這裡是一些如何書寫消息就可以簡化消息翻譯方面的指導: