Doxygen 內建支援多種語言。這表示 Doxygen 產生的文字片段可以用英文以外的語言(預設值)產生。輸出語言是透過設定檔(預設名稱為 Doxyfile)中的組態選項 OUTPUT_LANGUAGE 來選擇的。若要在註解區塊內切換語言,可以使用 \~ 命令。
目前(版本 1.13.0),支援 42 種語言(依字母順序排序):南非語、阿拉伯語、亞美尼亞語、巴西葡萄牙語、保加利亞語、加泰隆尼亞語、中文、繁體中文、克羅埃西亞語、捷克語、丹麥語、荷蘭語、英語、世界語、芬蘭語、法語、德語、希臘語、印地語、匈牙利語、印尼語、義大利語、日語 (+En)、韓語 (+En)、拉脫維亞語、立陶宛語、馬其頓語、挪威語、波斯語、波蘭語、葡萄牙語、羅馬尼亞語、俄語、塞爾維亞語、塞爾維亞語西里爾文、斯洛伐克語、斯洛維尼亞語、西班牙語、瑞典語、土耳其語、烏克蘭語和越南語。
下表包含有關支援語言的資訊。它按語言的字母順序排序。狀態欄位是從來源產生的,並大致顯示翻譯器最後更新的版本。
|
清單上的大多數人都表示他們也很忙於做其他事情,因此如果您想協助加速進度,請讓他們(或我)知道。
如果您想為尚未列出的語言新增支援,請閱讀下一節。
這份簡短的 HOWTO 說明如何將新語言的支援新增至 Doxygen
只需按照以下步驟操作
您的語言
)新增支援。如果沒有其他人正在處理該語言的支援,您將被指派為該語言的維護者。doxygen/src/config.xml
檔案中的 OUTPUT_LANGUAGE 部分的適當位置,新增下列行<value name='YourLanguage'/>
doxygen/src/translator_en.h
的副本,並將其命名為 doxygen/src/translator_<您的 2 個字母的國家/地區代碼>.h
。我將在本文件的其餘部分使用 xx
(而大寫版本為 XX
)。編輯 doxygen/src/language.cpp
:新增下列程式碼
#include<translator_xx.h>
現在,在 setTranslator()
中新增
case OUTPUT_LANGUAGE_t::YourLanguage: theTranslator = new TranslatorYourLanguage; break;
doxygen/src/translator_xx.h
TRANSLATOR_EN_H
重新命名為 TRANSLATOR_XX_H
兩次(即在檔案開頭的 #ifndef
和 #define
前置處理器命令中)。TranslatorEnglish
重新命名為 TranslatorYourLanguage
idLanguage()
中,將「english」變更為您的語言名稱(僅使用小寫字元)。根據語言的不同,您可能還希望變更成員函數 latexLanguageSupportCommand()
和其他函數(當您開始工作時,您會認出它們)。tr
開頭的成員函數傳回的字串。請盡量符合標點符號和大寫字母!若要輸入特殊字元(帶有重音符號),您可以ä
; 表示帶有 umlaut
的 a
(即 ä
)。請參閱 HTML 規格以取得程式碼。doxygen/doc/maintainers.txt
,並將自己新增至維護者清單,如下所示make docs
)來建置文件。OUTPUT_LANGUAGE = 您的語言名稱
,以您的語言產生輸出。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_z
。TranslatorAdapter_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 類別時,您也會收到通知。
如果您沒有時間完成所有更新,您仍然應該從上面描述的最激進的方法開始。您始終可以將基底類別更改為實現所有尚未實現方法的翻譯器適配器類別。
如果您希望逐步更新您的翻譯器,請查看 TranslatorEnglish
(translator_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
標記。您應該將其視為 真的過時。無法猜測上次更新的時間。
通常,有可能從過時的方法中構建更好的結果。因此,如果可能,應使用翻譯器適配器類別。另一方面,為真正過時的翻譯器實現適配器會帶來過多的維護和運行時開銷。