44.2. 寄語程序員

44.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(用於第二給參數)。

製作系統將自動處理製作和安裝訊息資料表。

44.2.2. 消息書寫教學

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