PostgreSQL 程式(伺服器和客戶端)可以用您喜歡的語言發出訊息 - 如果訊息已被翻譯的話。建立和維護翻譯後的訊息集需要精通自己語言且願意為 PostgreSQL 貢獻的人的幫助。您完全不需要成為程式設計師就可以做到這一點。本節說明如何提供幫助。
我們不會評價您的語言技能 - 本節是有關軟體工具的。理論上,您只需要一個文字編輯器。但這只有在您不想嘗試翻譯後的訊息這種不太可能的情況下才是這樣。當您配置來源樹時,請務必使用 --enable-nls
選項。這也將檢查 libintl 函式庫和 msgfmt
程式,所有終端使用者無論如何都需要它們。要測試您的工作,請遵循安裝說明中適用的部分。
如果您想開始一項新的翻譯工作,或者想進行訊息目錄合併(稍後會描述),您將需要一個與 GNU 相容的實作中的程式 xgettext
和 msgmerge
。稍後,我們將嘗試安排,以便如果您使用封裝的來源發行版,您將不需要 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
。然後,翻譯人員可以驗證這一點,並可能移除 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
代表 「範本 (template)」。)將此檔案複製到
並進行編輯。為了讓大家知道可以使用新的語言,也請編輯 language
.popo/LINGUAS
檔案,並將語言(或語言和國家/地區)代碼新增到已列出的語言旁邊,例如:
de fr
(當然,也可以出現其他語言。)
隨著底層程式或函式庫的變更,程式設計師可能會修改或新增訊息。在這種情況下,您不需要從頭開始。而是執行以下指令:
make update-po
這將建立一個新的空白訊息目錄檔案(您開始使用的 pot 檔案),並將其與現有的 PO 檔案合併。如果合併演算法不確定特定的訊息,它會將其標記為 「模糊 (fuzzy)」,如上所述。新的 PO 檔案將以 .po.new
副檔名儲存。
PO 檔案可以使用一般的文字編輯器進行編輯。也有一些專為 PO 檔案設計的編輯器,可以利用特定於翻譯的功能來協助您進行翻譯。Emacs 有一個 PO 模式(毫不意外),它非常有用。
翻譯人員應該只修改 msgstr 指令之後的引號之間的區域、新增註解,以及修改 fuzzy 旗標。
PO 檔案不需要完全填寫。如果沒有可用的翻譯(或空的翻譯),軟體將自動回復為原始字串。提交不完整的翻譯以包含在原始碼樹中沒有問題;這讓其他人有機會接手您的工作。但是,建議您優先在合併後移除模糊 (fuzzy) 的條目。請記住,模糊 (fuzzy) 的條目將不會被安裝;它們僅作為正確翻譯的參考。
以下是在編輯翻譯時需要牢記的一些事項:
請確保如果原始字串以換行符號結尾,則翻譯也以換行符號結尾。Tab 鍵等也是如此。
如果原始字串是 printf
格式字串,則翻譯也需要是。翻譯也需要在相同的順序中具有相同的格式指定符。有時,語言的自然規則使這變得不可能,或者至少很尷尬。在這種情況下,您可以像這樣修改格式指定符:
msgstr "Die Datei %2$s hat %1$u Zeichen."
然後,第一個預留位置實際上將使用列表中的第二個參數。
需要緊接在 % 之後,在任何其他格式操作符之前。(此功能實際上存在於 digits
$printf
系列函式中。您之前可能沒有聽說過它,因為除了訊息國際化之外,幾乎沒有使用它的地方。)
如果原始字串包含語言錯誤,請回報該錯誤(或在程式原始碼中自行修正),然後正常翻譯。更正後的字串可以在程式原始碼更新後合併進來。如果原始字串包含事實錯誤,請回報該錯誤(或自行修正),並且不要翻譯它。相反,您可以在 PO 檔案中使用註解標記該字串。
保持原始字串的風格和語氣。具體來說,不是句子的訊息(cannot open file %s
)可能不應該以大寫字母開頭(如果您的語言區分大小寫),也不應該以句號結尾(如果您的語言使用標點符號)。閱讀 第 54.3 節可能會有所幫助。
如果您不知道訊息的含義,或者如果訊息含糊不清,請在開發人員郵寄清單中提問。說英語的最終使用者也可能無法理解或覺得它含糊不清,因此最好改進訊息。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 回報文件問題。