國際化

支援多種語言

Doxygen 內建支援多種語言。這表示 Doxygen 產生的文字片段可以用英文以外的語言(預設值)產生。輸出語言是透過設定檔(預設名稱為 Doxyfile)中的組態選項 OUTPUT_LANGUAGE 來選擇的。若要在註解區塊內切換語言,可以使用 \~ 命令。

目前(版本 1.13.0),支援 42 種語言(依字母順序排序):南非語、阿拉伯語、亞美尼亞語、巴西葡萄牙語、保加利亞語、加泰隆尼亞語、中文、繁體中文、克羅埃西亞語、捷克語、丹麥語、荷蘭語、英語、世界語、芬蘭語、法語、德語、希臘語、印地語、匈牙利語、印尼語、義大利語、日語 (+En)、韓語 (+En)、拉脫維亞語、立陶宛語、馬其頓語、挪威語、波斯語、波蘭語、葡萄牙語、羅馬尼亞語、俄語、塞爾維亞語、塞爾維亞語西里爾文、斯洛伐克語、斯洛維尼亞語、西班牙語、瑞典語、土耳其語、烏克蘭語和越南語。

下表包含有關支援語言的資訊。它按語言的字母順序排序。狀態欄位是從來源產生的,並大致顯示翻譯器最後更新的版本。

語言 維護者 聯絡地址 (將 at 和 dot 取代) 狀態
南非語 Johan Prinsloo johan at zippysnoek dot com 1.6.0
阿拉伯語 Moaz Reyad
Muhammad Bashir Al-Noimi
[已辭職]
mbnoimi at gmail dot com
1.4.6
亞美尼亞語 Armen Tangamyan armen dot tangamyan at anu dot edu dot au 1.8.0
巴西葡萄牙語 Fabio "FJTC" Jun Takada Chino jun-chino at uol dot com dot br 最新
保加利亞語 Kiril Kirilov kpkirilov at abv dot bg 1.9.4
加泰隆尼亞語 Maximiliano Pin
Albert Mora
max dot pin at bitroit dot com
[無法連線]
1.8.0
中文 Lian Yang
Li Daobing
Wei Liu
lian dot yang dot cn at gmail dot com
lidaobing at gmail dot com
liuwei at asiainfo dot com
最新
繁體中文 Daniel YC Lin
Gary Lee
dlin dot tw at gmail dot com
garywlee at gmail dot com
1.8.15
克羅埃西亞語 Boris Bralo boris dot bralo at gmail dot com 1.8.2
捷克語 Petr Přikryl prikryl at atlas dot cz 1.9.6
丹麥語 Poul-Erik Hansen
Erik Søe Sørensen
pouhan at gnotometrics dot dk
eriksoe+doxygen at daimi dot au dot dk
1.8.0
荷蘭語 Dimitri van Heesch doxygen at gmail dot com 最新
英語 Dimitri van Heesch doxygen at gmail dot com 最新
世界語 Ander Martínez ander dot basaundi at gmail dot com 1.8.4
芬蘭語 Antti Laine antti dot a dot laine at tut dot fi 1.6.0
法語 David Martinet
Xavier Outhier
Benoît BROSSE
contact at e-concept-applications dot fr
xouthier at yahoo dot fr
Benoit dot BROSSE at ingenico dot com
1.9.5
德語 Peter Grotrian
Jens Seidel
Peter dot Grotrian at pdv-FS dot de
jensseidel at users dot sf dot net
1.8.15
希臘語 Paul Gessos gessos dot paul at yahoo dot gr 最新
印地語 Harsh Rathod hrathore50 at ymail dot com 1.9.4
匈牙利語 Ákos Kiss
Földvári György
akiss at users dot sourceforge dot net
[無法連線]
1.8.15
印尼語 Hendy Irawan ceefour at gauldong dot net 1.8.0
義大利語 Alessandro Falappa
Ahmed Aldo Faisal
alex dot falappa at gmail dot com
aaf23 at cam dot ac dot uk
1.8.15
日語 Suzumizaki-Kimikata
Hiroki Iseri
Ryunosuke Satoh
Kenji Nagamatsu
Iwasa Kazmi
szmml at h12u.com
goyoki at gmail dot com
sun594 at hotmail dot com
[無法連線]
[無法連線]
1.8.15
日語En 請參閱日語   基於英文
韓語 Kim Taedong
SooYoung Jung
Richard Kim
fly1004 at gmail dot com
jung5000 at gmail dot com
[無法連線]
1.8.15
韓語En 請參閱韓語   基於英文
拉脫維亞語 Lauris lauris at nix.lv 1.8.4
立陶宛語 Tomas Simonaitis
Mindaugas Radzius
Aidas Berukstis
-- 正在尋找維護者 --
[無法連線]
[無法連線]
[無法連線]
[請嘗試協助尋找人員。]
1.4.6
馬其頓語 Slave Jovanovski slavejovanovski at yahoo dot com 1.6.0
挪威語 Lars Erik Jordet lejordet at gmail dot com 1.4.6
波斯語 Ali Nadalizadeh nadalizadeh at gmail dot com 1.7.5
波蘭語 Piotr Kaminski
Grzegorz Kowal
Krzysztof Kral
Marek Ledworowski
[無法連線]
[無法連線]
krzysztof dot kral at gmail dot com
mledworo at gmail dot com
最新
葡萄牙語 Rui Godinho Lopes
Fabio "FJTC" Jun Takada Chino
[已辭職]
jun-chino at uol dot com dot br
最新
羅馬尼亞語 Ionut Dumitrascu
Alexandru Iosup
reddumy at yahoo dot com
aiosup at yahoo dot com
1.8.15
俄語 Brilliantov Kirill Vladimirovich
Alexandr Chelpanov
brilliantov at byterg dot ru
cav at cryptopro dot ru
最新
塞爾維亞語 Dejan Milosavljevic [無法連線] 1.6.0
塞爾維亞語西里爾文 Nedeljko Stefanovic stenedjo at yahoo dot com 1.6.0
斯洛伐克語 Kali+Laco Švec
Petr Přikryl
[斯洛伐克語顧問]
prikryl at atlas dot cz
1.8.15
斯洛維尼亞語 Matjaž Ostroveršnik matjaz dot ostroversnik at ostri dot org 1.4.6
西班牙語 Bartomeu
Francisco Oltra Thennet
David Vaquero
bartomeu at loteria3cornella dot com
[無法連線]
david at grupoikusnet dot com
1.9.6
瑞典語 Björn Palmqvist bjorn.palmqvist at aidium.se 1.9.6
土耳其語 Emin Ilker Cetinbas niw3 at yahoo dot com 1.7.5
烏克蘭語 Olexij Tkatchenko
Petro Yermolenko
[已辭職]
python at i dot ua
1.8.4
越南語 Dang Minh Tuan tuanvietkey at gmail dot com 1.6.0

清單上的大多數人都表示他們也很忙於做其他事情,因此如果您想協助加速進度,請讓他們(或我)知道。

如果您想為尚未列出的語言新增支援,請閱讀下一節。

將新語言新增至 Doxygen

這份簡短的 HOWTO 說明如何將新語言的支援新增至 Doxygen

只需按照以下步驟操作

  1. 告訴我您想為哪種語言(假設為 您的語言)新增支援。如果沒有其他人正在處理該語言的支援,您將被指派為該語言的維護者。
  2. doxygen/src/config.xml 檔案中的 OUTPUT_LANGUAGE 部分的適當位置,新增下列行
          <value name='YourLanguage'/>
    
  3. 建立 doxygen/src/translator_en.h 的副本,並將其命名為 doxygen/src/translator_<您的 2 個字母的國家/地區代碼>.h。我將在本文件的其餘部分使用 xx(而大寫版本為 XX)。
  4. 編輯 doxygen/src/language.cpp:新增下列程式碼

    #include<translator_xx.h>
    

    現在,在 setTranslator() 中新增

    case OUTPUT_LANGUAGE_t::YourLanguage: theTranslator = new TranslatorYourLanguage; break;
    
  5. 編輯 doxygen/src/translator_xx.h
    • 使用支援 UTF-8 的編輯器,並使用 UTF-8 模式(非 BOM 模式)開啟檔案。
    • TRANSLATOR_EN_H 重新命名為 TRANSLATOR_XX_H 兩次(即在檔案開頭的 #ifndef#define 前置處理器命令中)。
    • TranslatorEnglish 重新命名為 TranslatorYourLanguage
    • 在成員 idLanguage() 中,將「english」變更為您的語言名稱(僅使用小寫字元)。根據語言的不同,您可能還希望變更成員函數 latexLanguageSupportCommand() 和其他函數(當您開始工作時,您會認出它們)。
    • 編輯所有由以 tr 開頭的成員函數傳回的字串。請盡量符合標點符號和大寫字母!若要輸入特殊字元(帶有重音符號),您可以
      • 如果您的鍵盤支援,請直接輸入它們。請記住,預期會使用 UTF-8 編碼儲存文字。Doxygen 會將字元轉譯為正確的 {\LaTeX},並將 HTML 和 man 輸出保留為 UTF-8。
      • 使用 HTML 程式碼,例如 &auml; 表示帶有 umlauta (即 ä)。請參閱 HTML 規格以取得程式碼。
  6. 編輯 doxygen/doc/maintainers.txt,並將自己新增至維護者清單,如下所示
    TranslatorYourLanguage
    <您的姓名>:<您的點電子郵件在您的點網域>
  7. 透過給定適當的建置命令(例如:make docs)來建置文件。
  8. 現在,您可以在設定檔中使用 OUTPUT_LANGUAGE = 您的語言名稱,以您的語言產生輸出。
  9. 慣用的方式是在 GitHub 上複製 Doxygen 儲存庫並建立提取請求。或者,將 translator_xx.h 傳送給我,以便我可以將其新增至 Doxygen。同時傳送您的姓名和電子郵件地址,以包含在 maintainers.txt 清單中。

維護語言

新版本的 Doxygen 可能會使用新的翻譯句子。在這種情況下,Translator 類別需要實作新的方法 – 其介面會變更。當然,英文句子需要翻譯成其他語言。至少,與語言相關的翻譯類別必須實作新的方法;否則,Doxygen 甚至無法編譯。等待所有語言維護者翻譯新的句子並傳送結果,這將不是非常實際。以下文字說明如何使用翻譯器配接器來解決此問題。

翻譯器配接器的角色。每當 Translator 類別介面在新版本中變更時,新的類別 TranslatorAdapter_x_y_z 會新增至 translator_adapter.h 檔案(此處的 x、y 和 z 是對應於 Doxygen 目前官方版本的數字)。先前衍生自 Translator 類別的所有翻譯器現在都衍生自這個配接器類別。

TranslatorAdapter_x_y_z 類別會實作新的必要方法。如果新方法取代某些類似但已過時的方法(例如,如果參數數量變更,和/或較舊方法的功能已變更或豐富),TranslatorAdapter_x_y_z 類別可能會使用已過時的方法來取得結果,而該結果在目標語言中盡可能接近較舊的結果。如果無法做到,則會使用英文翻譯器取得結果(預設翻譯),而這(根據定義)始終是最新的。

例如,當引入具有參數(以判斷第一個字母的大小寫和單複數形式)的新 trFile() 方法,以取代沒有引數的較舊方法 trFiles() 時,下列程式碼會出現在其中一個翻譯器配接器類別中

    /*! This is the default implementation of the obsolete method
     * used in the documentation of a group before the list of
     * links to documented files.  This is possibly localized.
     */
    virtual QCString trFiles()
    { return "Files"; }

    /*! This is the localized implementation of newer equivalent
     * using the obsolete method trFiles().
     */
    virtual QCString trFile(bool first_capital, bool singular)
    {
      if (first_capital && !singular)
        return trFiles();  // possibly localized, obsolete method
      else
        return english.trFile(first_capital, singular);
    }

trFiles() 不存在於 TranslatorEnglish 類別中,因為它已被移除為已過時。但是,它一直使用到現在,並且其呼叫已由

    trFile(true, false)

在 Doxygen 原始檔中取代。可能,許多語言翻譯器都實作了已過時的方法,因此在這些情況下,使用相同的語言相關結果是完全合理的。TranslatorEnglish 不實作舊方法。它衍生自抽象的 Translator 類別。另一方面,其他語言的舊翻譯器不實作新的 trFile() 方法。因此,它會衍生自另一個基底類別 – TranslatorAdapter_x_y_zTranslatorAdapter_x_y_z 類別必須實作新的必要 trFile() 方法。但是,如果未實作 trFiles() 方法,則不會編譯翻譯器配接器。這是在翻譯器配接器類別中實作舊方法的原因(使用從 TranslatorEnglish 中移除的相同程式碼)。

最簡單的方法是將參數傳遞給英文翻譯器並返回其結果。然而,適配器在一個特殊情況下使用舊的 trFiles() 方法——當新的 trFile(true, false) 被調用時。這是在引入新方法時最常使用的情況,如上所述。儘管這看起來可能過於複雜,但該技術允許核心來源的開發人員更改翻譯器介面,而使用者甚至可能不會注意到此更改。當然,當新的 trFile() 使用不同的參數時,將返回英文結果,並且非英語使用者會注意到。在這裡,語言翻譯器的維護者至少應該實現那個特定的方法。

語言翻譯器的基底類別會說些什麼?如果語言翻譯器類別繼承自任何適配器類別,則需要進行維護。在這種情況下,語言翻譯器被認為不是最新的。另一方面,如果語言翻譯器直接繼承自抽象類別 Translator,則語言翻譯器是最新的。

翻譯器適配器類別會被鏈接起來,使得較舊的翻譯器適配器類別使用更新一步的翻譯器適配器作為基底類別。較新的適配器執行的適配工作比舊的少。最舊的適配器類別(間接)繼承自所有適配器類別。適配器類別的名稱被選為使其後綴衍生自不需要適配器的前一個官方doxygen版本。這樣,可以大致說出語言翻譯器類別上次更新的時間,詳情請見下文。

最新的翻譯器適配器繼承自抽象類別 TranslatorAdapterBase,而 TranslatorAdapterBase 直接繼承自抽象類別 Translator。它僅添加私有的英文翻譯器成員,以便在適配器類別內輕鬆實現預設翻譯,並且它還強制執行一個方法,用於通知使用者語言翻譯不是最新的(因為這樣,生成的文件中的某些句子可能會以英文顯示)。

一旦最舊的適配器類別不再被任何語言翻譯器使用,就可以從doxygen專案中移除它。維護者應盡量達到使用最少數量的翻譯器適配器類別的狀態。

為了簡化受支援語言的語言翻譯器類別的維護,開發了 translator.py Python 腳本(位於 doxygen/doc 目錄中)。它從每個語言的源文件中提取有關過時方法和新方法的重要資訊。這些資訊儲存在翻譯器報告 ASCII 文件(translator_report.txt)中。

您可以找到這個文件,連結為 translator_report.txt

查看語言翻譯器的基底類別,腳本還會猜測翻譯器的狀態 - 請參閱上面帶有語言的表格的最後一欄。當生成doxygen文檔時,會自動調用 translator.py。您也可以隨時手動運行該腳本,如果您認為它可以幫助您。當然,您沒有被強制使用腳本的結果。您可以通過查看適配器類別及其基底類別來找到相同的資訊。

我應該如何更新我的語言翻譯器?首先,您應該是語言維護者,或者您應該讓他們知道這些更改。以下文字是為語言維護者作為主要受眾撰寫的。

更新語言時可以採取幾種方法。如果您不是非常忙,您應該始終選擇最激進的方法。當更新所花費的時間比您預期的長得多時,您始終可以決定使用一些合適的翻譯器適配器,以便稍後完成更改,並仍然使您的翻譯器正常工作。

更新語言翻譯器最激進的方法是讓您的翻譯器類別直接繼承自抽象類別 Translator,並為需要實現的方法提供翻譯 - 如果您忘記實現某些方法,編譯器會告訴您。如果您有疑問,請查看 TranslatorEnglish 類別,以識別已實現方法的用途。查看先前使用的適配器類別有時可能會有所幫助,但它也可能具有誤導性,因為適配器類別也會實現過時的方法(請參閱先前的 trFiles() 示例)。

換句話說,最新的語言翻譯器根本不需要 TranslatorAdapter_x_y_z 類別,您也不需要實現任何其他內容,只需實現 Translator 類別所需的方法(即 Translator 的純虛擬方法 - 它們以 =0; 結尾)。

如果一切編譯順利,請嘗試運行 translator.py,並查看 doxygen/doc 目錄下的翻譯器報告(ASCII 文件)。只有當腳本沒有檢測到任何特殊內容時,您的翻譯器才會被標記為最新。如果翻譯器使用 Translator 基底類別,則可能仍然存在與您的源代碼相關的一些註解。在這種情況下,翻譯器會被標記為幾乎最新。也就是說,過時的方法(根本沒有使用)可能會在您的語言部分中列出。只需刪除它們的程式碼(然後再次運行 translator.py)。此外,當您忘記將翻譯器類別的基底類別更改為較新的適配器類別或直接更改為 Translator 類別時,您也會收到通知。

如果您沒有時間完成所有更新,您仍然應該從上面描述的最激進的方法開始。您始終可以將基底類別更改為實現所有尚未實現方法的翻譯器適配器類別。

如果您希望逐步更新您的翻譯器,請查看 TranslatorEnglishtranslator_en.h 文件)。在內部,您會找到類似 new since 1.2.4 的註解,它們總是分隔在所述版本中實現的一些方法。請實現註解下方的這組方法,該註解使用與您的翻譯器適配器類別相同的版本號。(例如,如果您的翻譯器類別沒有實現註解 new since 1.2.4 下方的方法,則必須使用 TranslatorAdapter_1_2_4。當您實現它們時,您的類別應該使用較新的翻譯器適配器。

偶爾運行 translator.py 腳本,並給它您的 xx 標識(來自 translator_xx.h)以縮短翻譯器報告(也產生得更快)——它將僅包含與您的翻譯器相關的資訊。一旦您達到基底類別應更改為較新的適配器的狀態,您將在翻譯器報告中看到該註解。

警告:不要忘記編譯 doxygen 以確定它是否可編譯。translator.py 不會檢查所有內容是否相對於編譯器正確。因此,它有時可能會對必要的基底類別說謊。

最過時的語言翻譯器會導致實現過於複雜的適配器。因此,doxygen 開發人員可能會決定從 TranslatorEnglish 類別派生此類翻譯器,該類別根據定義始終為最新。

這樣做時,所有缺少的程式碼都將被英文翻譯取代。這表示未實現的方法將始終返回英文結果。此類翻譯器會使用單字 obsolete 標記。您應該將其視為 真的過時。無法猜測上次更新的時間。

通常,有可能從過時的方法中構建更好的結果。因此,如果可能,應使用翻譯器適配器類別。另一方面,為真正過時的翻譯器實現適配器會帶來過多的維護和運行時開銷。

前往 下一節 或返回 索引