原文地址:
http://tutorials.jenkov.com/java-internationalization/resourcebundle.html
java.util.ResourceBundle类用来存储文本以及本地化相关数据。本文将介绍ResourceBundle及它的子类。
ResourceBundle的类层次结构
ResourceBundle类有两个子类,PropertyResourceBundle及ListResourceBundle。下面是这几个类的结构图。
PropertyResourceBundle将本地化的文本存储于Java property文件中。
创建ResourceBundle
可以按下面的方式创建ResourceBundle类的实例。
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.MyBundle", locale);
System.out.println(labels.getString("label1"));
实际上并没有创建ResourceBundle实例,而是创建了ResourceBundle子类的实例。实例的创建都是通过工厂方法来完成。首先ResourceBundle类将会查找ListResourceBundle,随后会查找PropertyResourceBundle。查找是根据ListResourceBundle类名来匹配resource boundle的名字来完成(getBundle()方法的第一个参数)。如果找不到,则根据PropertyResourceBundle resource bundle来匹配。
Property Files作为ResourceBundle
可以使用标准的属性文件来存储本地化文本。可以通过ResourceBundle 类加载这些属性。
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.MyBundle", locale);
System.out.println(labels.getString("label1"));
上面的例子中,你需要将MyBundle放在包i18n中。
resource bundle 的名称类似类名。如i18n.MyBundle意思是,包i18n中的属性文件MyBundle.properties。
下面是属性文件中的内容。
label1 = Label 1 is done!
label2 = Label 2 is through!
上述文件是由一组key,value对构成。key在=号左侧,value在右侧。value是你要本地化的内容。
将不同的语言放置于不同的属性文件中
为了提供不同语言的字符串,需要为每种语言创建属性文件,文件名的格式为 xxxx_语言编码。例如:
MyBundle.properties
MyBundle_da.properties
MyBundle_de.properties
MyBundle_fr.properties
label1 = Label 1 er klar!
label2 = Label 2 er igennem!
例如:
i18n.MyClassBundle
i18n.MyClassBundle_da
i18n.MyClassBundle_en
i18n.MyClassBundle_de
下面是一个默认的bundle class文件实现的例子。
import java.util.ListResourceBundle;
public class MyClassBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return contents;
}
private Object[][] contents = {
{ "price" , new Double(10.00) },
{ "currency", "EUR" },
};
}
public class MyClassBundle_da extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return contents;
}
private Object[][] contents = {
{ "price" , new Double(75.00) },
{ "currency", "DKK" },
};
}
Locale locale = new Locale("de", "DE"); //no bundle for German -> default
ResourceBundle bundle = ResourceBundle.getBundle("i18n.MyClassBundle", locale);
System.out.println("price : " + bundle.getObject("price"));
System.out.println("currency: " + bundle.getObject("currency"));
locale = new Locale("da", "DK");
bundle = ResourceBundle.getBundle("i18n.MyClassBundle", locale);
System.out.println("price : " + bundle.getObject("price"));
System.out.println("currency: " + bundle.getObject("currency"));
输出是:
price : 10.0
currency: EUR
price : 75.0
currency: DKK