English version

JavaDocでi18n

2006/12/31

残念ながら、現在の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ディレクトリに出来上がります。もちろん同様にして、別の言語を追加することも容易に行うことができます。


Valid XHTML 1.0 Strict

 ご感想をお聞かせください(ruimo@ruimo.com)。なお、誠に勝手ながら、HTMLメールはサーバーで全て削除されますので、テキストメールでお願いいたします。

 トップページへ