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"));
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值