[您也可以查看 單頁版本 的文件。]
翻譯已分為兩個網域。首先,翻譯傳送給連線用戶端伺服器訊息。此問題已 暫時擱置。其次,翻譯用戶端及其函式庫。
gettext 套件提供翻譯訊息的服務。它使用 xgettext 工具從來源中擷取字串進行翻譯。此動作透過擷取 _()、N_() 和 Q_() 巨集的引數來執行。_() 用於允許函式呼叫的內容中(通常為靜態初始值設定項以外的所有內容)。N_() 用於 _() 無法使用的任何地方。標記為 N_() 的字串需要在程式碼中參照時傳遞至 gettext 翻譯常式。例如,請參閱 subversion/svn/help-cmd.c 中標頭和尾端的處理方式。Q_() 用於具有單數和複數版本的訊息。
除了 _()、N_() 和 Q_() 巨集外,U_() 也用於標記不會翻譯的字串,因為一般而言翻譯內部錯誤訊息並無幫助。這只會影響大多數使用者永遠不會看到的不明確錯誤訊息(由 Subversion 中的錯誤或非常特殊的儲存庫損毀所造成)。使用 U_() 的原因是為了明確指出並非只是忘記 gettext 呼叫。
在使用直接呼叫 gettext 常式(*gettext 或 *dgettext)時,請記住大部分 Subversion 程式碼都是函式庫程式碼。因此,預設網域不一定是 Subversion 的網域。在函式庫程式碼中,您應該使用 gettext 函式的 dgettext 版本。網域名稱定義在 PACKAGE_NAME 定義中。
所有必要的在地化設定都由 svn_private_config.h(適用於 *nix)和 svn_private_config.hw(適用於 Windows)中的 ENABLE_NLS 條件控制。請務必將
#include "svn_private_config.h"
放入需要在地化的任何檔案的最後一個 include 中。
另外請注意,_()、Q_() 和 *gettext() 呼叫的傳回值是以 UTF-8 編碼;這表示它們應該翻譯成當前正在寫入的區域設定,作為任何形式的程式輸出。
GNU gettext 手冊 (https://gnu.dev.org.tw/software/gettext/manual/html_node/gettext_toc.html) 在其「準備程式來源」章節中提供了關於撰寫可翻譯程式的其他資訊。它的提示主要適用於字串組合。
目前可用的翻譯可以在 儲存庫的 po 區段 中找到。如果您想要開始進行尚未提供的翻譯,請聯絡 dev@subversion.apache.org。翻譯討論會在該清單中進行。
Makefile 建置目標 locale-gnu-*(用於維護 po 檔案)需要 GNU gettext 0.13 或更新版本。請注意,這並非編譯 *.po 檔案成 *.mo 檔案的人員的要求。
在開始新的翻譯之前,請聯絡 Subversion 開發郵件清單,以確保您不會重複工作。另外請注意,此專案強烈偏好由多於一人維護的翻譯:將您的意圖郵寄給清單可能有助於您找到支持者。
在那之後,您應該執行下列步驟
./autogen.sh
./configure
make locale-gnu-pot
subversion/po
目錄中執行 msginit --locale LOCALE -o LOCALE.po
。LOCALE 是用於識別您的語言環境的 ll[_LL] 語言和國家/地區代碼。步驟 (2) 和 (3) 會產生一個 Makefile;步驟 (4) 會產生 subversion/po/subversion.pot
Subversion 專案有一個 政策,不會在其檔案中放入名稱,因此請套用以下所述的兩個變更。
新產生的 .po 檔案中的標頭看起來像這樣
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
請用以下文字取代該區塊
# <Your language> translation for subversion package # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License.
.po 檔案中的第一個翻譯區塊包含兩行,如下所示
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
請用這兩行取代它們
"Last-Translator: Subversion Developers <dev@subversion.apache.org>\n" "Language-Team: YOUR LANGUAGE <dev@subversion.apache.org>\n"
待文件化
在提交至郵件清單或提交至儲存庫之前,請務必確保您的 po 檔案「編譯」。您可以在 Makefile 為基礎的系統上執行以下步驟來執行此動作
./autogen.sh
./configure
(搭配適當的引數)make locale
autogen.sh 步驟很重要,因為它會新增 po 檔案,作為「locale」建置目標的相依性。不過請注意,在你新增新的翻譯後,步驟 1 和 2 只需要執行一次。
請不要將大型 po 檔案寄送到郵寄清單。dev@subversion.apache.org 上有許多訂閱者連線速度較慢,不希望透過電子郵件收到大型檔案。請將 po 檔案放置在網路上某處供人下載,並張貼 URL 即可。如果您沒有可用的網站,請在 dev@ 上詢問,有人會協助您尋找位置。
當然,如果您有 Subversion 儲存庫的提交權限,您可以直接在那裡提交 po 檔案,假設所有其他需求都已滿足。
建置系統中基於 Makefile 的部分包含一個 make 目標,以利維護現有的 po 檔案。若要在具有 GNU gettext 的系統上更新 po 檔案,請執行
make locale-gnu-po-update
若只想更新特定語言,您可以使用
make locale-gnu-po-update PO=ll
其中 ll 是 po 檔案的名稱,不含副檔名 (例如 PO=sv)。
建議使用兩次提交來更新 .po;一次在「make locale-gnu-po-update」之後,另一次在翻譯完成之後。這有兩個好處
gettext(1)
會產生大量行號變更,這會讓產生的 diff 難以讓其他翻譯人員檢閱。透過兩次提交,所有行號變更都儲存在第一次提交中,而第二次提交則包含所有實際翻譯,沒有其他垃圾。編輯 trunk 中的 po 檔案相當簡單,但如果這些變更要轉移到發行分支,就會變得有點複雜。專案政策是不直接變更發行分支,提交到分支的所有內容都應從 trunk 合併。這也適用於 po 檔案。使用 svn merge
來執行這項工作可能會導致衝突和模糊訊息,這是因為 gettext 變更了行號和字串格式所致。
svn merge
執行分支更新時存在的任何複雜性。下列規則適用
建立 locale-gnu-po-update
上述清單是分支上 po 檔案允許的所有操作的完整列舉。
使用此指令可以將 YY.po 的 trunk 版本 X 的訊息合併到您的分支工作副本
svn cat -r X ^/subversion/trunk/subversion/po/YY.po | \ po-merge.py YY.po
在某些 gettext 實作中,我們必須確保 mo 檔案(無論是透過專案取得或是在本地端建立)都使用 UTF-8 編碼。此要求源自於 Subversion 內部使用 UTF-8、某些實作會翻譯成目前的語言環境,以及 bind_textdomain_codeset()
在不同實作之間無法移植的事實。
某些 gettext 實作會使用 msgid ""(空字串)的區段來保留管理資料。建議的標頭之一是「Last-Translator:」欄位。由於 Subversion 專案的政策是不在特定檔案中指名貢獻者,而是在儲存庫記錄訊息中給予肯定,因此您不得在此欄位中輸入您的姓名。
由於某些工具需要此欄位才能將 po 檔案視為有效(例如 Emacs PO 模式),因此您可以將「dev@subversion.apache.org」輸入此欄位。
此專案標準化引號的使用方式。有些翻譯團隊也這麼做。如果你的語言環境沒有翻譯團隊,或他們沒有標準化引號的使用方式,請遵循本指南其他地方的專案準則。如果他們有:請遵循 :-)