PostgreSQL 程式(伺服器和客戶端)可以使用您喜歡的語言顯示訊息 — 前提是這些訊息已經被翻譯。建立和維護翻譯過的訊息集需要那些精通自己的語言並希望為 PostgreSQL 專案做出貢獻的人的幫助。您完全不必成為程式設計師也能做到這一點。本節將解釋如何提供幫助。
我們不會評判您的語言技能 — 本節是關於軟體工具的。理論上,您只需要一個文字編輯器。但這僅僅是在您不想嘗試翻譯過的訊息的罕見情況下。配置原始碼樹時,請確保使用 --enable-nls
選項。這還會檢查 libintl 庫和 msgfmt
程式,所有終端使用者都需要它們。要測試您的工作,請遵循安裝說明中適用的部分。
如果您想開始一項新的翻譯工作,或者想進行訊息目錄合併(稍後會描述),您將分別需要 xgettext
和 msgmerge
程式,以及 GNU 相容的實現。稍後,我們將盡量安排,以便您使用打包好的原始碼分發版時,將不需要 xgettext
。(如果從 Git 工作,您仍然需要它。)目前推薦使用 GNU Gettext 0.10.36 或更高版本。
您本地的 gettext 實現應該附帶自己的文件。其中一些可能會在下面的內容中重複,但要了解更多細節,您應該查閱那裡。
原始(英文)訊息及其(可能)翻譯的等價物的配對儲存在 訊息目錄 中,每個程式(儘管相關程式可以共享一個訊息目錄)和每種目標語言都有一個。訊息目錄有兩種檔案格式:第一種是 “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 標誌。
好的,那麼如何建立一個 “空白” 的訊息目錄呢?首先,進入包含您想翻譯的訊息的程式的目錄。如果存在 nls.mk
檔案,則說明該程式已為翻譯做好準備。
如果已經有一些 .po
檔案,那麼已經有人進行了一些翻譯工作。檔名是
,其中 language
.polanguage
是 ISO 639-1 兩字母語言程式碼(小寫),例如 fr.po
表示法語。如果確實需要每種語言有多個翻譯工作,那麼檔名也可以是
,其中 language
_region
.poregion
是 ISO 3166-1 兩字母國家程式碼(大寫),例如 pt_BR.po
表示巴西的葡萄牙語。如果您找到了想要的語言,就可以開始處理該檔案了。
如果您需要開始一項新的翻譯工作,請先執行命令
make init-po
這將建立一個名為
的檔案。(progname
.pot.pot
是為了區別於 “生產中” 的 PO 檔案。T 代表 “模板”。)將此檔案複製到
並編輯它。為了讓新語言為人所知,還要編輯 language
.popo/LINGUAS
檔案,並在已列出的語言旁邊新增語言(或語言和國家)程式碼,例如:
de fr
(當然,可以出現其他語言。)
隨著底層程式或庫的更改,程式設計師可能會更改或新增訊息。在這種情況下,您無需從頭開始。而是執行命令
make update-po
這將建立一個新的空白訊息目錄檔案(您開始使用的 pot 檔案),並將其與現有的 PO 檔案合併。如果合併演算法不確定某個特定訊息,它會將其標記為 “fuzzy”(模糊),如上所述。新的 PO 檔案將以 .po.new
副檔名儲存。
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 節 可能會有所幫助。
如果您不知道訊息的含義,或者訊息含糊不清,請在開發人員郵件列表中詢問。很可能講英語的終端使用者也可能不理解它或覺得它含糊不清,所以最好改進該訊息。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。