| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 46. 本地語言支持 | Fast Forward | Next |
本節描述如何在屬于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 讀取.在這裡需要做下面一些變量的 賦值︰
程序的名字,就是那些在 textdomain() 調用裡提供的。
提供的翻譯的語言列表 -- 開始的時候是空的。
一列包含可翻譯字串的文件,也就是那些用 gettext 或者其它相應手段標記了的文件。最終,這裡會包括幾乎所有的程序源文件。 如果列表太長,你可以把第一個"文件"寫成一個 +和第二個詞組成,第二個詞是一個文件,在這個文件裡每行包含一個文件名。
生成給翻譯者使用的信息表的工具,以便知道哪些函數調用包含可翻譯字串。 缺省時只知道 gettext() 調用。 如果你使用了 _ 或其它標識符,那麼你需要把它們列在這裡。 如果可翻譯字串不是第一個參數,那麼該項需要是下面的形式: func:2(用于第二給參數)。
制作系統將自動處理制作和安裝信息表。
這裡是一些如何書寫消息就可以簡化消息翻譯方面的指導:
不要偷懶在運行時構造語句,比如象
printf("Files where %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. */
這些注釋都拷貝到信息表文件裡,這樣翻譯者就可以看見它們了.