正方形の周長 #12

次は多言語への対応を行ってみる。つまり言語に依存した情報を外へ放り出す。
Javaにはi18n向けの機構が標準で用意されているので楽ができる。
まず、言語に依存した情報を提供するためのクラスSquareParametersResを作る。

import java.util.ResourceBundle;

public class SquareParametersRes {
    private static ResourceBundle resources = ResourceBundle.getBundle("SquareParametersResources");

    public static String get(String key) {
        return resources.getString(key);
    }
}

とりあえず単純にキー文字列に対応したリソースバンドル内の文字列を返すクラスメソッドgetを定義しておく。
そして、言語に依存した文字列がコード内にあるSquareParametersとSquareParametersPaneを変更する。

import java.text.MessageFormat;

public class SquareParameters {
...snip
    private void checkSide(double side) {
        if (side >= 0) return;
        throw new IllegalArgumentException(MessageFormat.format(SquareParametersRes.get("model.side.exception.message"), side));
    }
}

SquareParametersに関しては不正な一辺の長さを検出したときに投げられる例外メッセージが相当する。
まあ、この例外はSquareParametersPaneで捕獲されて外に出ないようになっているのであまり意味は無いのだが。
このメッセージは変数sideを伴って変化するためMessageFormat.format()を使い動的にメッセージを生成する。

...snip
public class SquareParametersPane extends JPanel implements ActionListener, FocusListener {
...snip
    public SquareParametersPane() {
        JLabel lside = new JLabel(SquareParametersRes.get("gui.side.label"));
        JLabel lperi = new JLabel(SquareParametersRes.get("gui.perimeter.label"));
        GroupLayout g = new GroupLayout(this);
...snip

SquareParametersPaneについては二つのJLabelコンポーネントに設定した文字列がこれに相当する。
そして、環境に適合したリソースバンドルが見つからなかった時のセーフティネットとなるリソースファイルを用意する。

SquareParametersResources.properties
gui.side.label = length of each side
gui.perimeter.label = length of perimeter
model.side.exception.message = invalid length of the side: {0}

上2行のJLabelに表示する文字列はそのまま単純に置き換えられる。
最下行の例外メッセージはMessageFormat.format()のフォーマット文字列の形で与える。{0}が変数sideの値に置き換えられる。
これらを使用する側のSquarePerimeterやSquarePerimeterAppletには変更はないし、動作もこれまでと何ら変わらない。