2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

56.1. 致翻譯人員 #

PostgreSQL 程式(伺服器和客戶端)可以使用您喜歡的語言顯示訊息 — 前提是這些訊息已經被翻譯。建立和維護翻譯過的訊息集需要那些精通自己的語言並希望為 PostgreSQL 專案做出貢獻的人的幫助。您完全不必成為程式設計師也能做到這一點。本節將解釋如何提供幫助。

56.1.1. 要求 #

我們不會評判您的語言技能 — 本節是關於軟體工具的。理論上,您只需要一個文字編輯器。但這僅僅是在您不想嘗試翻譯過的訊息的罕見情況下。配置原始碼樹時,請確保使用 --enable-nls 選項。這還會檢查 libintl 庫和 msgfmt 程式,所有終端使用者都需要它們。要測試您的工作,請遵循安裝說明中適用的部分。

如果您想開始一項新的翻譯工作,或者想進行訊息目錄合併(稍後會描述),您將分別需要 xgettextmsgmerge 程式,以及 GNU 相容的實現。稍後,我們將盡量安排,以便您使用打包好的原始碼分發版時,將不需要 xgettext。(如果從 Git 工作,您仍然需要它。)目前推薦使用 GNU Gettext 0.10.36 或更高版本。

您本地的 gettext 實現應該附帶自己的文件。其中一些可能會在下面的內容中重複,但要了解更多細節,您應該查閱那裡。

56.1.2. 概念 #

原始(英文)訊息及其(可能)翻譯的等價物的配對儲存在 訊息目錄 中,每個程式(儘管相關程式可以共享一個訊息目錄)和每種目標語言都有一個。訊息目錄有兩種檔案格式:第一種是 PO 檔案(Portable Object 的縮寫),它是一個具有特殊語法的純文字檔案,翻譯人員會編輯它。第二種是 MO 檔案(Machine Object 的縮寫),它是一個從相應的 PO 檔案生成的二進位制檔案,並在國際化程式執行時使用。翻譯人員不處理 MO 檔案;事實上幾乎沒有人處理。

訊息目錄檔案的副檔名不出所料地是 .po.mo。基礎名稱要麼是附帶它的程式的名稱,要麼是檔案所屬的語言,具體取決於情況。這有點令人困惑。例如 psql.po(psql 的 PO 檔案)或 fr.mo(法語的 MO 檔案)。

PO 檔案的檔案格式在此處說明

# comment

msgid "original string"
msgstr "translated string"

msgid "more original"
msgstr "another translated"
"string can be broken up like this"

...

msgid 行從程式原始碼中提取。(不一定如此,但這是最常見的方式。)msgstr 行最初為空,由翻譯人員填入有用的字串。字串可以包含 C 風格的跳脫字元,並且可以像此處所示那樣跨越多行。(下一行必須從行首開始。)

# 字元表示註釋。如果 # 字元後面緊跟著空格,那麼這是翻譯人員維護的註釋。也可能存在自動註釋,其 # 字元後面緊跟著非空格字元。這些由各種處理 PO 檔案的工具維護,旨在幫助翻譯人員。

#. automatic comment
#: filename.c:1023
#, flags, flags

#. 風格的註釋是從訊息使用的原始檔中提取的。程式設計師可能為翻譯人員插入了資訊,例如關於預期的對齊。#: 註釋指示了訊息在原始碼中使用的確切位置。翻譯人員不必檢視程式原始碼,但如有關於正確翻譯的疑問,則可以檢視。#, 註釋包含描述訊息的標誌。目前有兩個標誌:fuzzy(模糊)如果在程式原始碼更改後訊息可能已過時,則設定為此標誌。然後翻譯人員可以驗證它並可能刪除模糊標誌。請注意,模糊訊息不會提供給終端使用者。另一個標誌是 c-format,它表示訊息是一個 printf 風格的格式模板。這意味著翻譯也應該是一個具有相同數量和型別佔位符的格式字串。有一些工具可以驗證這一點,它們依賴於 c-format 標誌。

56.1.3. 建立和維護訊息目錄 #

好的,那麼如何建立一個 空白 的訊息目錄呢?首先,進入包含您想翻譯的訊息的程式的目錄。如果存在 nls.mk 檔案,則說明該程式已為翻譯做好準備。

如果已經有一些 .po 檔案,那麼已經有人進行了一些翻譯工作。檔名是 language.po,其中 languageISO 639-1 兩字母語言程式碼(小寫),例如 fr.po 表示法語。如果確實需要每種語言有多個翻譯工作,那麼檔名也可以是 language_region.po,其中 regionISO 3166-1 兩字母國家程式碼(大寫),例如 pt_BR.po 表示巴西的葡萄牙語。如果您找到了想要的語言,就可以開始處理該檔案了。

如果您需要開始一項新的翻譯工作,請先執行命令

make init-po

這將建立一個名為 progname.pot 的檔案。(.pot 是為了區別於 生產中 的 PO 檔案。T 代表 模板。)將此檔案複製到 language.po 並編輯它。為了讓新語言為人所知,還要編輯 po/LINGUAS 檔案,並在已列出的語言旁邊新增語言(或語言和國家)程式碼,例如:

de fr

(當然,可以出現其他語言。)

隨著底層程式或庫的更改,程式設計師可能會更改或新增訊息。在這種情況下,您無需從頭開始。而是執行命令

make update-po

這將建立一個新的空白訊息目錄檔案(您開始使用的 pot 檔案),並將其與現有的 PO 檔案合併。如果合併演算法不確定某個特定訊息,它會將其標記為 fuzzy(模糊),如上所述。新的 PO 檔案將以 .po.new 副檔名儲存。

56.1.4. 編輯 PO 檔案 #

PO 檔案可以使用常規文字編輯器進行編輯。也有一些專門的 PO 檔案編輯器,它們可以透過特定於翻譯的功能來幫助這個過程。Emacs 有一個(不出所料的)PO 模式,它可能非常有用。

翻譯人員只能更改 msgstr 指令後面的引號之間的區域,添加註釋,並修改 fuzzy 標誌。

PO 檔案不需要完全填寫。如果沒有可用翻譯(或翻譯為空),軟體將自動回退到原始字串。提交不完整的翻譯以包含在原始碼樹中沒有問題;這為其他人撿起您的工作留下了空間。但是,我們鼓勵您在進行合併後優先刪除模糊條目。請記住,模糊條目不會被安裝;它們只作為可能正確翻譯的參考。

以下是一些在編輯翻譯時需要注意的事項

  • 確保如果原始字串以換行符結尾,則翻譯字串也以換行符結尾。同樣,製表符等也是如此。

  • 如果原始字串是 printf 格式字串,翻譯也必須是。翻譯還必須具有相同數量和順序的格式說明符。有時語言的自然規則會使這不可能或至少很尷尬。在這種情況下,您可以修改格式說明符,如下所示:

    msgstr "Die Datei %2$s hat %1$u Zeichen."
    

    然後,第一個佔位符將實際使用列表中的第二個引數。digits$ 需要緊跟在 % 之後,在任何其他格式修飾符之前。(此功能實際上存在於 printf 系列函式中。您可能以前沒聽說過它,因為它除了訊息國際化之外幾乎沒有其他用途。)

  • 如果原始字串包含語言上的錯誤,請報告它(或在程式原始碼中自己修復),然後正常翻譯。當程式原始碼更新後,可以合併更正後的字串。如果原始字串包含事實錯誤,請報告它(或自己修復),並且不要翻譯它。相反,您可以在 PO 檔案中用註釋標記該字串。

  • 保持原始字串的風格和語調。特別是,不是句子的訊息(cannot open file %s)可能不應該以大寫字母開頭(如果您的語言區分大小寫)或以句點結尾(如果您的語言使用標點符號)。閱讀 第 55.3 節 可能會有所幫助。

  • 如果您不知道訊息的含義,或者訊息含糊不清,請在開發人員郵件列表中詢問。很可能講英語的終端使用者也可能不理解它或覺得它含糊不清,所以最好改進該訊息。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。