残念ながら、現在の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メールはサーバーで全て削除されますので、テキストメールでお願いいたします。