Doxygen は多言語サポートを内蔵しています。これは、doxygen によって生成されるテキスト断片が、英語(デフォルト)以外の言語で作成できることを意味します。出力言語は、設定ファイル(デフォルト名および Doxyfile として知られています)の OUTPUT_LANGUAGE 設定オプションを通じて選択されます。コメントブロック内で言語を切り替えるには、\~ コマンドを使用できます。
現在(バージョン 1.13.0)、42 の言語がサポートされています(アルファベット順):アフリカーンス語、アラビア語、アルメニア語、ブラジルポルトガル語、ブルガリア語、カタロニア語、中国語、中国語(繁体字)、クロアチア語、チェコ語、デンマーク語、オランダ語、英語、エスペラント語、フィンランド語、フランス語、ドイツ語、ギリシャ語、ヒンディー語、ハンガリー語、インドネシア語、イタリア語、日本語 (+En)、韓国語 (+En)、ラトビア語、リトアニア語、マケドニア語、ノルウェー語、ペルシア語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、セルビア語、セルビア語(キリル文字)、スロバキア語、スロベニア語、スペイン語、スウェーデン語、トルコ語、ウクライナ語、ベトナム語。
サポートされている言語に関する情報の表を以下に示します。言語ごとにアルファベット順にソートされています。ステータス列はソースから生成されたもので、翻訳者が最後に更新されたバージョンをおおよそ示しています。
|
リスト上のほとんどの人が他のことにも忙しいと述べているので、物事を迅速に進めるのを手伝いたい場合は、(彼らまたは私に)知らせてください。
まだリストにない言語のサポートを追加したい場合は、次のセクションをお読みください。
この簡単な HOWTO では、doxygen に新しい言語のサポートを追加する方法について説明します。
次の手順に従ってください
YourLanguage
)を教えてください。他の誰もその言語のサポートに取り組んでいない場合、あなたがその言語のメンテナに割り当てられます。doxygen/src/config.xml
ファイルに次の行を追加します。<value name='YourLanguage'/>
doxygen/src/translator_en.h
のコピーを作成し、doxygen/src/translator_<your_2_letter_country_code>.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
に 2 回リネームします(つまり、ファイルの先頭にある #ifndef
および #define
プリプロセッサコマンド内)。TranslatorEnglish
を TranslatorYourLanguage
にリネームします。idLanguage()
で、"english" を言語の名前に変更します(小文字のみを使用)。言語によっては、メンバー関数 latexLanguageSupportCommand()
やその他の関数も変更したい場合があります(作業を開始すると認識できます)。tr
で始まるメンバー関数によって返されるすべての文字列を編集します。句読点と大文字小文字を一致させるようにしてください!特殊文字(アクセント付き)を入力するには、次のいずれかの方法を使用できます。ä
; のような HTML コードを、umlaut
付きの a
(つまり、ä
)に使用します。コードについては、HTML 仕様を参照してください。doxygen/doc/maintainers.txt
を編集し、次のようにメンテナのリストに自分を追加します。make docs
)を実行してドキュメントをビルドします。OUTPUT_LANGUAGE = your_language_name
を使用して、あなたの言語で出力を生成できます。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()
を置き換えるために導入されたとき、次のコードが翻訳アダプタークラスの 1 つに表示されました。
/*! 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()
を 1 つの特別なケースで使用します – 新しい trFile(true, false)
が呼び出された場合。これは、新しいメソッドが導入された時点で最も使用されていたケースです – 上記を参照してください。これは複雑すぎるように見えるかもしれませんが、この手法により、コアソースの開発者は Translator インターフェースを変更できますが、ユーザーは変更に気付かない場合があります。もちろん、新しい trFile()
が異なる引数で使用される場合、英語の結果が返され、英語以外のユーザーに気付かれます。ここで、言語翻訳のメンテナは、少なくともその特定のメソッドを実装する必要があります。
言語翻訳者の基本クラスは何を意味しますか? 言語翻訳者クラスがアダプタークラスを継承する場合、メンテナンスが必要です。そのような場合、言語翻訳者は最新ではないと見なされます。一方、言語翻訳者が抽象クラス Translator
から直接派生している場合、言語翻訳者は最新です。
翻訳アダプタークラスはチェーン化されており、古い翻訳アダプタークラスは、1 つ新しい翻訳アダプターを基本クラスとして使用します。新しいアダプターは、古いアダプターよりも適応作業が少なくなります。最も古いアダプタークラスは、(間接的に)すべてのアダプタークラスから派生しています。アダプタークラスの名前は、そのサフィックスが、アダプターを必要としなかった doxygen の以前の公式バージョンから派生するように選択されています。これにより、言語翻訳者クラスが最後に更新された時期をおおよそ言うことができます – 以下の詳細を参照してください。
最新の翻訳アダプターは、抽象 TranslatorAdapterBase
クラスから派生しており、抽象 Translator
クラスから直接派生しています。アダプタークラス内のデフォルト翻訳の簡単な実装のためにプライベート英語翻訳者メンバーを追加するだけで、言語翻訳が最新ではないことをユーザーに通知するための 1 つのメソッドの実装も強制します(そのため、生成されたファイルの一部の文が英語で表示される場合があります)。
最も古いアダプタークラスが言語翻訳者のいずれにも使用されなくなると、doxygen プロジェクトから削除できます。メンテナは、翻訳アダプタークラスの数を最小限に抑えた状態に到達するように努める必要があります。
サポートされている言語の言語翻訳者クラスのメンテナンスを簡素化するために、translator.py
Python スクリプトが開発されました(doxygen/doc
ディレクトリにあります)。各言語のソースファイルから、廃止されたメソッドと新しいメソッドに関する重要な情報を抽出します。情報は、翻訳者レポート ASCII ファイル(translator_report.txt
)に保存されます。
このファイルは translator_report.txt
として見つけることができます。
言語翻訳者の基本クラスを見ると、スクリプトは翻訳者のステータスも推測します – 上の言語の表の最後の列を参照してください。translator.py
は、doxygen ドキュメントが生成されるときに自動的に呼び出されます。スクリプトが役立つと感じたらいつでも手動でスクリプトを実行することもできます。もちろん、スクリプトの結果を使用することを強制されるわけではありません。アダプタークラスとその基本クラスを見ることで、同じ情報を見つけることができます。
言語翻訳者を更新するにはどうすればよいですか? まず、あなたが言語メンテナであるか、変更について彼/彼女に知らせる必要があります。次のテキストは、主な対象読者として言語メンテナ向けに書かれています。
言語を更新するときに取るべきアプローチがいくつかあります。非常に忙しくない場合は、常に最も根本的なアプローチを選択する必要があります。更新に予想よりも時間がかかる場合は、適切な翻訳アダプターを使用して変更を後で完了し、翻訳者を引き続き機能させることができます。
言語翻訳者を更新する最も根本的な方法は、翻訳者クラスを抽象クラス 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 がコンパイル可能かどうかを確認するために、doxygen をコンパイルすることを忘れないでください。translator.py
は、コンパイラーに関してすべてが正しいかどうかをチェックしません。そのため、必要な基本クラスについて嘘をつくことがあります。
最も古い言語翻訳者は、複雑すぎるアダプターの実装につながる可能性があります。そのため、doxygen 開発者は、そのような翻訳者を TranslatorEnglish
クラスから派生させることを決定する場合があります。これは、定義により常に最新です。
そうすると、すべての不足しているメソッドが英語翻訳に置き換えられます。これは、実装されていないメソッドは常に英語の結果を返すことを意味します。そのような翻訳者は、obsolete
という単語を使用してマークされます。あなたはそれを本当に廃止されたと読むべきです。最後の更新についての推測はできません。
多くの場合、廃止されたメソッドからより良い結果を構築することが可能です。そのため、可能な場合は翻訳アダプタークラスを使用する必要があります。一方、本当に廃止された翻訳者のアダプターの実装は、メンテナンスと実行時のオーバーヘッドが大きすぎます。