<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 50.2\. 寄語程序員 ## 50.2.1\. 機理 本節描述如何在屬于 PostgreSQL 版本的程序或者庫里面支持本地語言。 目前它只適用于 C 語言。 **向程序中增加 NLS 支持** 1. 把下面的代碼插入到程序的開頭: ``` #ifdef ENABLE_NLS #include &lt;locale.h&gt; #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` (用于第二給參數)。 如果函數支持多個消息,那么該項看起來就像這樣:`func:1,2`(識別單個和多個消息參數)。 編譯系統將自動制作和安裝消息表。 ## 50.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); ``` 如果你真的要構造一條恰當的復數形消息,也是支持的,但形式上有一點笨拙。 比如當通過`ereport()`生成一條概要或者詳細消息時,你可以這樣寫: ``` errmsg_plural("copied %d file", "copied %d files", n, n) ``` 第一個參數是對應英文單數形的格式字符串,第二個參數是對應英文復數形的格式字符串,第三個參數是決定是否是復數形的一個整數值。 隨后的參數和通常一樣對應與格式字符串中的參數值。(通常,控制復數形的值也是格式字符串中的其中一個參數。) 英語中只關心`_n_`是不是1,但其它語言中可能有多個復數形。 針對英文中作為一組的2個格式字符串,翻譯者能夠為根據`_n_`的運行值選中的恰當的那個提供多個替代字符串。 如果你需要一條不直接調用`errmsg`或`errdetail`的復數形消息, 必須使用下層的`ngettext`函數。具體參考gettext的文檔。 * 如果你想和翻譯者進行交流,比如說一條消息是如何與其它輸出對齊的,那么在該字符串出現之前,放上一條以 `translator` 開頭的注釋,比如 ``` /* translator: This message is not what it seems to be. */ ``` 這些注釋都拷貝到消息表文件里,這樣翻譯者就可以看見它們了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看