残念ながら、現在のJavaDocはドキュメントのi18n(国際化)に対してサポートがありません。ここを見ると国際化のためのDocletがあるようですが、公開されていませんし、やり方もちょっと面倒そうです。他に方法は無いかと考え、FreeMarkerを使用する方法に思い当たりました。
FreeMarkerはテンプレートエンジンです。これをプリプロセッサとして使用することで、複数の言語のJavaDocを1つのソースコードに埋め込みます。JavaDocは以下のように記述します。
/** <#if locale="ja"> サイズ0配列。 <#else> Empty arrays. </#if> */ public class EmptyArrays { EmptyArrays() {}
<#...>がFreeMarkerのディレクティブです。大事なことはFreeMarkerのディレクティブを、必ずJavaDocコメント内に入れておくということです。これによってソースコードをjavacでコンパイルする場合にはFreeMarkerによる処理無しでコンパイルすることができます。またFreeMarkerを通さずにコンパイルすることによって、コンパイルエラーの行番号がずれる問題を回避することができます。ソースコードは複数の言語が一度に記述できるようにUTF-8などを使用して記述します。この場合、javacにencodingオプションを付けてエンコーディングを明示します(本来はShift_JISなどを使用する場合にも付けるべきでしょう。そうしないとShift_JISがデフォルトエンコーディングでない環境で正しくコンパイルできません)。
実際のJavaDocの生成はAnt taskを使用するのが簡単でしょう。まずここからFMPPをダウンロードして展開しておきます。そしてこれを使用してFreeMarkerのディレクティブを処理します。
<property name="fmpp.lib" path="/usr/local/java/freemarker/fmpp_0.9.11/lib/fmpp.jar"/> <taskdef name="fmpp" classname="fmpp.tools.AntTask" classpath="${fmpp.lib}"/> <target name="javadoc" description="Generate javadoc."> <macrodef name="javadoc-i18n"> <attribute name="locale"/> <sequential> <mkdir dir="javadocsrc-@{locale}"/> <fmpp sourceroot="src" outputroot="javadocsrc-@{locale}" data="locale:@{locale}" logfile="log-@{locale}.fmpp"/> <javadoc sourcepath="javadocsrc-@{locale}" destdir="javadoc-@{locale}" windowtitle="Ruimo util" Locale="@{locale}" Encoding="UTF-8" packagenames="com.ruimo.util.*" charset="UTF-8"> <link href="http://java.sun.com/javase/6/docs/api"/> </javadoc> </sequential> </macrodef> <javadoc-i18n locale="ja"/> <javadoc-i18n locale="en"/> </target>
これで、無事日本語版と英語版のJavaDocが、javadoc-ja、javadoc-enディレクトリに出来上がります。もちろん同様にして、別の言語を追加することも容易に行うことができます。
ご感想をお聞かせください(ruimo@ruimo.com)。なお、誠に勝手ながら、HTMLメールはサーバーで全て削除されますので、テキストメールでお願いいたします。