[您也可以查看 單頁版本 的文件。]

本地化 (l10n)

翻譯已分為兩個網域。首先,翻譯傳送給連線用戶端伺服器訊息。此問題已 暫時擱置。其次,翻譯用戶端及其函式庫。

在地化概觀

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 開發郵件清單,以確保您不會重複工作。另外請注意,此專案強烈偏好由多於一人維護的翻譯:將您的意圖郵寄給清單可能有助於您找到支持者。

在那之後,您應該執行下列步驟

Unix (GNU gettext)

  1. 檢出 Subversion(請參閱 INSTALL 以取得更多資訊)
  2. 執行 ./autogen.sh
  3. 執行 ./configure
  4. 執行 make locale-gnu-pot
    目前僅支援 GNU gettext Makefile 為基礎的系統執行此步驟
  5. 在工作副本的 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"

Unix(非 GNU gettext)

待文件化

Windows

請參閱 問題 #1977

驗證您的 po 檔案

在提交至郵件清單或提交至儲存庫之前,請務必確保您的 po 檔案「編譯」。您可以在 Makefile 為基礎的系統上執行以下步驟來執行此動作

  1. 執行 ./autogen.sh
  2. 執行 ./configure(搭配適當的引數)
  3. 執行 make locale

autogen.sh 步驟很重要,因為它會新增 po 檔案,作為「locale」建置目標的相依性。不過請注意,在你新增新的翻譯後,步驟 1 和 2 只需要執行一次。

提交您的 po 檔案

請不要將大型 po 檔案寄送到郵寄清單。dev@subversion.apache.org 上有許多訂閱者連線速度較慢,不希望透過電子郵件收到大型檔案。請將 po 檔案放置在網路上某處供人下載,並張貼 URL 即可。如果您沒有可用的網站,請在 dev@ 上詢問,有人會協助您尋找位置。

當然,如果您有 Subversion 儲存庫的提交權限,您可以直接在那裡提交 po 檔案,假設所有其他需求都已滿足。

更新現有的 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 難以讓其他翻譯人員檢閱。透過兩次提交,所有行號變更都儲存在第一次提交中,而第二次提交則包含所有實際翻譯,沒有其他垃圾。
  • 如果某種語言有多位翻譯者(這是專案高度建議的),您就不會冒著花費數小時工作,最後才發現其他翻譯者已在您完成時完成工作的風險。當您嘗試執行第一次提交時,您會立即注意到其他人正在處理 .po 檔案,因為 svn 會告訴您檔案已過時。

維護分支

編輯 trunk 中的 po 檔案相當簡單,但如果這些變更要轉移到發行分支,就會變得有點複雜。專案政策是不直接變更發行分支,提交到分支的所有內容都應從 trunk 合併。這也適用於 po 檔案。使用 svn merge 來執行這項工作可能會導致衝突和模糊訊息,這是因為 gettext 變更了行號和字串格式所致。

以下的架構消除了使用 svn merge 執行分支更新時存在的任何複雜性。下列規則適用
  • 翻譯更新會傳送至 trunk
  • 分支上需要且曾經存在於 trunk 上的訊息會從 trunk 合併
  • 分支上的 po 檔案允許 2 項大量操作
    • 建立 locale-gnu-po-update
    • 合併來自 trunk 的訊息(請見下方)
  • 在任何版本中從未存在於 trunk 上的剩餘少數訊息會在分支上翻譯
  • 訊息選項(例如模糊)可以調整

上述清單是分支上 po 檔案允許的所有操作的完整列舉。

使用此指令可以將 YY.po 的 trunk 版本 X 的訊息合併到您的分支工作副本

  svn cat -r X ^/subversion/trunk/subversion/po/YY.po | \
    po-merge.py YY.po

po 和 mo 檔案的要求

在某些 gettext 實作中,我們必須確保 mo 檔案(無論是透過專案取得或是在本地端建立)都使用 UTF-8 編碼。此要求源自於 Subversion 內部使用 UTF-8、某些實作會翻譯成目前的語言環境,以及 bind_textdomain_codeset() 在不同實作之間無法移植的事實。

為了滿足此要求,po 檔案必須使用 UTF-8 編碼。如果目標系統上的 gettext 實作不支援 bind_textdomain_codeset(),建置系統會透過移除 po 檔案標頭中的 Content-Type 標頭來確保 mo 檔案採用 UTF-8。請注意,某些 msgfmt 工具不喜歡缺少字元集標示符,因此會產生類似「無法執行字元集轉換」的警告。您可以安心忽略這些警告。

空字串 msgid 區段的慣例

某些 gettext 實作會使用 msgid ""(空字串)的區段來保留管理資料。建議的標頭之一是「Last-Translator:」欄位。由於 Subversion 專案的政策是不在特定檔案中指名貢獻者,而是在儲存庫記錄訊息中給予肯定,因此您不得在此欄位中輸入您的姓名。

由於某些工具需要此欄位才能將 po 檔案視為有效(例如 Emacs PO 模式),因此您可以將「dev@subversion.apache.org」輸入此欄位。

翻譯小組

翻譯專案試圖組織翻譯嘗試,並為各種套件取得翻譯人員。某些小組有準則來刺激不同套件之間的一致性。

單引號與雙引號

此專案標準化引號的使用方式。有些翻譯團隊也這麼做。如果你的語言環境沒有翻譯團隊,或他們沒有標準化引號的使用方式,請遵循本指南其他地方的專案準則。如果他們有:請遵循 :-)

錯誤訊息慣例

由於翻譯人員通常會看到程式碼中的所有錯誤訊息,因此了解本文件中有一個關於此類別字串的特殊區段非常重要。此處與引號相同:對於你的語言翻譯團隊沒有明確訂定政策的所有重點,都應遵守。