2013年12月24日火曜日

Java ResouceBundleの使い方

使い方を皆さんに教えるのではなく、俺が初めて試したという意味の記事。

(確認したかったこと)

  • リソースをファイルシステム上に置いておくのではない方法での使い方。
(結論)
  • ResouceBundle.Controlのサブクラスを作る方向で考えていたが、とりあえずListResouceBundleでも十分なのかなと。
  • いずれにしても何とでもなりそうなので、とりあえずResouceBundleを使ってプロパティファイルを使っていても、後で動的な管理に差し替えることは可能だろう。
  • けど念のため、ResouceBundle自体をそこらじゅうで使うのではなく、これにたいするFacade的なラッパー的な何かを用意しておいた方がいいだろう。



----

package i18n;

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

public class Test {
public static void main(String[] args){

System.out.println("value for 'key1'");

for(Sample s : Sample.values())
System.out.println(String.format(
"%-20s : %s",
s.name(),
s.get().getString("key1")
));
}

interface Testable{
ResourceBundle get();
}
enum Sample implements Testable{
SIMPLE_CASE(){
public ResourceBundle get(){
return ResourceBundle.getBundle("i18n.hoge");
}
},
OF_JAPAN(){
public ResourceBundle get(){
return ResourceBundle.getBundle("i18n.hoge", Locale.JAPAN);
}
},
OF_ENGLISH(){
public ResourceBundle get(){
return ResourceBundle.getBundle("i18n.hoge", Locale.ENGLISH);
}
},
OF_US(){
public ResourceBundle get(){
return ResourceBundle.getBundle("i18n.hoge", Locale.US);
}
},
NAMED_CUSTOM(){
public ResourceBundle get(){
return new MyResourceBundle("key1");
}
}

}

static class MyResourceBundle extends ListResourceBundle{

private final String[] keys;

MyResourceBundle(String... keys) {
this.keys = keys;
}

@Override
protected Object[][] getContents() {
Object[][] con = new Object[keys.length][2];
for(int i = 0; i < keys.length; i++){
con[i] = new Object[]{keys[i], "To tell the truth, I don't know about " + keys[i] + "."};
}
return con;
}


}
}

0 件のコメント:

コメントを投稿