java.util.ResourceBundle

目的
国際化(i18n)対応Helloプログラムの作成

関連クラス

今回のソース
//////////////////// Hello.java ////////////////////

import java.util.ResourceBundle;
import java.util.Locale;

class Hello
{
	public static void main(String args[])
	{
		// カレントロケールに従う
		ResourceBundle res1 = ResourceBundle.getBundle("ResHello");

		// 日本語のリソースを使う
		// ResourceBundle res2 = ResourceBundle.getBundle("ResHello",Locale.JAPAN);

		// 英語のリソースを使う
		// ResourceBundle res3 = ResourceBundle.getBundle("ResHello",Locale.US);

		// リソースの取得
		String hello = (String)res1.getObject("hello");

		System.out.println(hello);
	}
}

////////////////////////////////////////////////////////////

//////////////////// ResHello.java ////////////////////

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.ResourceBundle;

// デフォルトのリソース (英語リソース)
public class ResHello extends ResourceBundle
{
	// 英語リソースのデータ
	Hashtable data_source;

	// コンストラクタ
	public ResHello()
	{
		data_source = new Hashtable();
		data_source.put("hello","Hello!");
	}

	public Object handleGetObject(String key)
	{
		if(data_source.containsKey(key))
			return(data_source.get(key));
		return null;
	}

	// ResourceBundleクラスのオーバーライド
	public Enumeration getKeys()
	{
		return(data_source.elements());
	}
}

////////////////////////////////////////////////////////////

//////////////////// ResHello_ja_JP.java ////////////////////

import java.util.Enumeration;
import java.util.Hashtable;

// 日本語リソース
public class ResHello_ja_JP extends ResHello
{
	// 日本語リソースのデータ
	Hashtable data_source;

	// コンストラクタ
	public ResHello_ja_JP()
	{
		data_source = new Hashtable();
		data_source.put("hello","こんにちは");
	}

	public Object handleGetObject(String key)
	{
		if(data_source.containsKey(key))
			return(data_source.get(key));
		return null;
	}

	// ResourceBundleクラスのオーバーライド
	public Enumeration getKeys()
	{
		return(data_source.elements());
	}
}

////////////////////////////////////////////////////////////

//////////////////// ResHello_en_US.java ////////////////////

import java.util.Enumeration;
import java.util.Hashtable;

// 英語リソース
public class ResHello_en_US extends ResHello
{
	public Object handleGetObject(String key)
	{
		return null;
	}

	public Enumeration getKeys()
	{
		return(super.getKeys());
	}
}

////////////////////////////////////////////////////////////
Source is here. (ZIP Format,1530Byte,Shift-JIS)

コンパイル&実行
javac *.java
java Hello

説明
(概略)

国際化対応プログラムの例です。
国際化(internationalization:i18n)は、
プログラム部分とリソース部分を分けることで、
他言語への移植性を高めることを目的としています。

つまり、各言語用のリソースを用意することで、
同じプログラムが、各言語用プログラムとして動作することになります。
(日本語版、英語版、フランス語版、ドイツ語版...)

いままで苦労していたと思われる、
英語版→日本語版などのローカライズなども、
国際化対応プログラムならば、簡単に出来るでしょう。

(サンプルプログラムの説明)

カレントロケールに従う
あらかじめ設定されているロケールにしたがって、リソースを取得する。
恐らく、日本で実行しているのなら、Locale.JAPANになるだろう。
(英語版Windowsを使ってたら違うのかも。)
カレントロケールは、Locale.getDefaultメソッドで取得出来る。
res1.getObject("hello");
getObjectは、リソースを取得するメソッドである。
引数としてキーを渡し、そのキーに対応するリソースを取得する。
キーは必ず文字列だが、リソースは文字列とは限らない。
ちなみにこのプログラムでは、キーと値を格納するのに、Hashtableクラスを用いている。
public Object handleGetObject(String key)
keyに対応するリソースを返すメソッドである。
今回のプログラムでは、Hashtableを用いているので、
containsKeyメソッドによって、対応するリソースの存在を調べ、
getメソッドによって、リソースを返している。
英語リソース
英語リソースは、基底クラスResHelloで定義しているため、
ResHello_en_USクラスで再び定義する必要は無い。
よって、handleGetObjectメソッド中で、リソースを返却する必要は無い。