メッセージの国際化

とりあえずデフォルトメッセージと日本語用メッセージを用意。それぞれ文字コードUTF-8にしておく。(native2asciiはしない)
messages.properties (デフォルト名+.properties)

pstyle.crypt.Tool.location_is_null=--location option is required.
pstyle.crypt.Tool.purpose_is_null=--purpose option is required.
pstyle.crypt.Tool.invalid_algorithm=invalid algorithm : ({0})
...

messages_ja_JP.properties (デフォルト名+ロケール名+.properties)

pstyle.crypt.Tool.location_is_null=--location オプション指定は必須です。
pstyle.crypt.Tool.purpose_is_null=--purpose オプション指定は必須です。
pstyle.crypt.Tool.invalid_algorithm=不正な algorithm : ({0})
...

メッセージ出力部分のコード。ここでは例外クラスでの実装で、messageにプロパティファイル内のキーを指定してメッセージを出力する形式をとっている。PropertyResourceBundleControlについてはResourceBundle, MessageSourceでproperties内に日本語でメッセージを書くを参照。これでnative2ascii無しに日本語メッセージを読み込むResouceBundleが生成される。MESSAGES_PROPERTIESはメッセージファイル(ここでは上記の2ファイル)へのベースネーム。

public class CryptException extends Exception {

    private static final String MESSAGE_PROPERTIES = "pstyle/crypt/messages";

    private Object[] arguments;
    
// ... 

    public CryptException(String message, Throwable cause, Object... args) {
        super(message, cause);
        this.arguments = args;
    }

    @Override
    public String getLocalizedMessage() {
        String key = getMessage();
        ResourceBundle bundle = ResourceBundle.getBundle(MESSAGE_PROPERTIES, new PropertyResourceBundleControl());
        String message = bundle.getString(key);
        if (arguments != null && message != null) {
            message = MessageFormat.format(message, arguments);
        }
        return (message != null) ? message : null; 
        
    }
}

デフォルトロケール(ja_JP)で実行すると、

 2008-08-31 01:24:53,359 [main] WARN  pstyle.crypt.Tool    - [main]
pstyle.crypt.CryptException: --purpose オプション指定は必須です。
 at pstyle.crypt.Tool.create(Tool.java:105)
 at pstyle.crypt.Tool.main(Tool.java:70)

user.languageシステムプロパティをEnglish(-Duser.language=English)にすると

 2008-08-31 01:24:26,453 [main] WARN  pstyle.crypt.Tool    - [main]
pstyle.crypt.CryptException: --purpose option is required.
 at pstyle.crypt.Tool.create(Tool.java:105)
 at pstyle.crypt.Tool.main(Tool.java:70)