`
dadi520
  • 浏览: 139995 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java ResoureBundle 的使用

阅读更多

资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中加载它

 

主要API如下

 

// 使用指定的基本名称、语言环境和调用者的类加载器获取资源包。调用此方法等同于调用
// getBundle(baseName, locale, this.getClass().getClassLoader())
public static final ResourceBundle getBundle(String baseName,Locale locale)

// 返回键的枚举。
public abstract Enumeration<String> getKeys()

// 从此资源包或它的某个父包中获取给定键的对象。此方法首先尝试使用 handleGetObject 从此资源包中获取对象。
// 如果不成功,并且父资源包不为 null,则调用父包的 getObject 方法。
// 如果仍不成功,则抛出 MissingResourceException
public final Object getObject(String key)

 

 

子接口 java.util.PropertyResourceBundle ,  java.util.ListResourceBundle

PropertyResourceBundle 由于写入的是.properties文件,所以保存的值都是字符串,用文件实现
ListResourceBundle 可以保存任意类型的数据,用类来实现, 主要实现 contents 方法

 

import java.util.*;
public class StatsBundle_ja_JP extends ListResourceBundle {
    public Object[][] getContents() {
	return contents;
    }
    private Object[][] contents = {
	{ "GDP", new Integer(21300) },
	{ "Population", new Integer(125449703) },
	{ "Literacy", new Double(0.99) },
   }
}

 

 

注意:getBundel 中的参数 baseName( 取名 LabelsBundle) 有一点说明,
如果用 PropertyResourceBundle, 则相对应的文件名为 LabelsBundle_对应的语言.peropertis(如zh_cn, en, de)等

如果用 ListResourceBundle,则对应的类名为 LabelsBundle_语言名_国家名 如(ja_JP , fr_FR ,en_CA)等

 

扩展 ResourceBundle

 

//使用指定基本名称、目标语言环境和控件、调用者的类加载器返回一个资源包。调用此方法等同
//于调用getBundle(baseName, targetLocale, this.getClass().getClassLoader(),control),

public static final ResourceBundle getBundle(String baseName,Locale targetLocale,ResourceBundle.Control control)



import java.util.*;

public class RBControl {
    public static void main(String[] args) {
	test(Locale.CHINA);
	test(new Locale("zh", "HK"));
	test(Locale.TAIWAN);
	test(Locale.CANADA);
    }

    private static void test(Locale locale) {
	ResourceBundle rb = ResourceBundle.getBundle("RBControl", locale,
	     new ResourceBundle.Control() {
		 @Override
		//返回 Locale 的 List,作为 baseName 和 locale 的候选语言环境。在工厂方法每次尝试为目标 Locale 查找资源包时,
		//由 ResourceBundle.getBundle 工厂方法调用此方法。
		 public List<Locale> getCandidateLocales(String baseName, Locale locale) {
		     if (baseName == null)
			 throw new NullPointerException();
		     if (locale.equals(new Locale("zh", "HK"))) {
			 return Arrays.asList(
			     locale,
			     Locale.TAIWAN,
			     // no Locale.CHINESE here
			     Locale.ROOT);
		     } else if (locale.equals(Locale.TAIWAN)) {
			 return Arrays.asList(
			     locale,
			     // no Locale.CHINESE here
			     Locale.ROOT);
		     }
		     return super.getCandidateLocales(baseName, locale);
		 }
	     });
	System.out.println("locale: " + locale);
	System.out.println("\tregion: " + rb.getString("region"));
	System.out.println("\tlanguage: " + rb.getString("language"));
    }
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics