| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 44. 本地語言支援 | 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. */
這些註釋都拷貝到訊息資料表文件裡,這樣翻譯者就可以看見它們了.