Doxygenは多言語を組み込みでサポートしています。これは、doxygenが生成するテキスト断片が、英語(デフォルト)以外の言語で作成できることを意味します。出力言語は、設定ファイル(デフォルト名 Doxyfile)内の設定オプション OUTPUT_LANGUAGE
を通じて選択されます。コメントブロック内で言語を切り替えるには、\~
コマンドを使用できます。
現在(バージョン1.14.0)、42の言語がサポートされています(アルファベット順):アフリカーンス語、アラビア語、アルメニア語、ブラジルポルトガル語、ブルガリア語、カタルーニャ語、中国語、中国語(繁体字)、クロアチア語、チェコ語、デンマーク語、オランダ語、英語、エスペラント語、フィンランド語、フランス語、ドイツ語、ギリシャ語、ヒンディー語、ハンガリー語、インドネシア語、イタリア語、日本語(+En)、韓国語(+En)、ラトビア語、リトアニア語、マケドニア語、ノルウェー語、ペルシャ語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、セルビア語、セルビア語(キリル文字)、スロバキア語、スロベニア語、スペイン語、スウェーデン語、トルコ語、ウクライナ語、ベトナム語。
サポートされている言語に関する情報は以下の表に示します。言語名でアルファベット順にソートされています。ステータス列はソースから生成され、翻訳者が更新されたおおよその最終バージョンを示しています。
|
リストに載っているほとんどの人は、他のことでも忙しいと述べています。もし作業を加速させたい場合は、彼ら(または私)に知らせてください。
まだリストにない言語のサポートを追加したい場合は、次のセクションを読んでください。
この短いHOWTOは、doxygenに新しい言語のサポートを追加する方法を説明します
以下の手順に従ってください
OUTPUT_LANGUAGE
の適切な場所に、次の行を追加してください。<value name='YourLanguage'/>
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
で始まるメンバ関数が返すすべての文字列を編集してください。句読点と大文字小文字を合わせるようにしてください!特殊文字(アクセント付き)を入力するには、次のいずれかの方法があります。a
(例: ä
)には、ä
のようなHTMLコードを使用してください。コードについてはHTML仕様を参照してください。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
から削除されたのと同じコードを使用)。
最も簡単な方法は、引数を英語の翻訳者に渡し、その結果を返すことです。代わりに、アダプターは1つの特別なケースで古い trFiles()
を使用します。それは、新しい trFile(true, false)
が呼び出されたときです。これは、新しいメソッドが導入された時点での最も一般的な使用例です(上記参照)。これは複雑に見えるかもしれませんが、この手法により、コアソースの開発者は Translator
インターフェースを変更でき、ユーザーは変更に気づかない可能性もあります。もちろん、新しい trFile()
が異なる引数で使用された場合、英語の結果が返され、英語以外のユーザーにはそれが認識されます。ここでは、言語翻訳のメンテナーは、少なくともその特定のメソッドを実装する必要があります。
言語翻訳クラスの基底クラスは何を意味するか? もし言語翻訳クラスが何らかのアダプタークラスを継承している場合、メンテナンスが必要です。この場合、その言語翻訳は最新ではないと見なされます。一方、もし言語翻訳が抽象クラス Translator
から直接派生している場合、その言語翻訳は最新です。
翻訳アダプタークラスは連鎖されており、古い翻訳アダプタークラスは一段新しい翻訳アダプターを基底クラスとして使用します。新しいアダプターは、古いアダプターよりも適応作業が少なくなっています。最も古いアダプタークラスは、すべてのアダプタークラスから(間接的に)派生しています。アダプタークラスの名前は、その接尾辞がアダプターを必要としなかったdoxygenの以前の公式バージョンから派生するように選択されています。このようにして、言語翻訳クラスが最後にいつ更新されたかを概算で知ることができます(詳細は以下を参照)。
最新の翻訳アダプターは、抽象クラス Translator
から直接派生する抽象クラス TranslatorAdapterBase
から派生しています。アダプタークラス内でデフォルト翻訳を簡単に実装できるように、プライベートな英語翻訳者メンバーを追加するのみです。また、言語翻訳が最新ではないことをユーザーに通知する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がコンパイル可能かどうかを確認するために、コンパイルすることを忘れないでください。translator.py はコンパイラに関してすべてが正しいかどうかをチェックしません。そのため、必要な基底クラスについて誤った情報を示す場合があります。
最も廃止された言語翻訳クラスは、あまりにも複雑なアダプターの実装につながります。そのため、doxygenの開発者は、そのような翻訳クラスを、定義上常に最新である TranslatorEnglish
クラスから派生させることを決定する場合があります。
そうすると、すべての欠落しているメソッドは英語の翻訳に置き換えられます。これは、未実装のメソッドは常に英語の結果を返すことを意味します。そのような翻訳クラスは obsolete
という単語でマークされます。これは本当に廃止されたと読むべきです。最終更新について推測することはできません。
多くの場合、廃止されたメソッドからより良い結果を構築することが可能です。そのため、可能であれば翻訳アダプタークラスを使用すべきです。一方、本当に廃止された翻訳クラスのアダプターを実装すると、過剰なメンテナンスとランタイムオーバーヘッドが発生します。