ResourceBundle使用详解

ResourceBundle使用详解
这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化。比如对于“取消”,中文中我们使用“取消”来表示,而英文中我们使用“cancel”。若我们的程序是面向国际的(这也是软件发展的一个趋势),那么使用的人群必然是多语言环境的,实现国际化就非常有必要。而ResourceBundle可以帮助我们轻松完成这个任务:当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包(大多数情况下也就是.properties文件)中加载它。这样可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

这使编写的程序可以:

轻松地本地化或翻译成不同的语言
一次处理多个语言环境
以后可以轻松进行修改,以便支持更多的语言环境
说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。

使用这个类,properties需要遵循一定的命名规范,一般的命名规范是: 自定义名语言代码国别代码.properties,如果是默认的,直接写为:自定义名.properties。

比如:

myres_en_US.properties
myres_zh_CN.properties

myres.properties

当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在,则优先会使用myres_zh_CN.properties,当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。

没有提供语言和地区的资源文件是系统默认的资源文件。

资源文件都必须是ISO-8859-1编码,因此,对于所有非西方语系的处理,都必须先将之转换为Java Unicode Escape格式。转换方法是通过JDK自带的工具native2ascii.

ResourceBundle的类层次结构

PropertyResourceBundle将本地化的文本存储于Java property文件中。

从ResourceBundle中获取值

获取ResourceBundle实例后可以通过下面的方法获得本地化值。
getObject(String key);
getString(String key);
getStringArray(String key);
还可以通过keySet()方法获取所有的key。Set keys = bundle.keySet();
其它ResourceBundle 方法可以通过查看文档获得。
测试及验证

新建4个属性文件
my_en_US.properties:cancelKey=cancel

my_zh_CN.properties:cancelKey=\u53D6\u6D88(取消)

my_zh.properties:cancelKey=\u53D6\u6D88zh(取消zh)

my.properties:cancelKey=\u53D6\u6D88default(取消default)

获取bundle
ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));
1
其中new Locale(“zh”, “CN”)提供本地化信息,上面这行代码,程序会首先在classpath下寻找my_zh_CN.properties文件,若my_zh_CN.properties文件不存在,则取找my_zh.properties,如还是不存在,继续寻找my.properties,若都找不到就抛出异常。

代码

import javax.annotation.Resource;
import java.util.Locale;
import java.util.ResourceBundle;
public class Main {

public static void main(String args[]) {
ResourceBundle bundle = ResourceBundle.getBundle("my", new Locale("zh", "CN"));
String cancel = bundle.getString("cancelKey");
System.out.println(cancel);

bundle = ResourceBundle.getBundle("my", Locale.US);
cancel = bundle.getString("cancelKey");
System.out.println(cancel);

bundle = ResourceBundle.getBundle("my", Locale.getDefault());
cancel = bundle.getString("cancelKey");
System.out.println(cancel);

bundle = ResourceBundle.getBundle("my", Locale.GERMAN);
cancel = bundle.getString("cancelKey");
System.out.println(cancel);
bundle = ResourceBundle.getBundle("my");
for (String key : bundle.keySet()) {
System.out.println(bundle.getString(key));
}
}
}

输出结果
取消
cancel
取消
取消
取消
说明:前面三个分别按照zh_CN,US,默认的结果输出,第四个由于我们未定义GERMAN属性文件,这时ResourceBundle为我们提供了一个fallback(也就是一个备用方案),这个备用方案就是根据当前系统的语言环境来得到的本地化信息。所以若是找不到GERMAN的,之后就会去找CHINA了,所以找到了res_zh_CH.properties这个资源包。最后一个是若有多个属性文件,可以按照Map的形式遍历,获得属性文件内的各个值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态ResourceBundle是指在运行时动态加载并修改资源文件,以便程序能够动态地读取、翻译或修改资源文件的内容。使用动态ResourceBundle可以使程序更加灵活和易于维护。 以下是使用动态ResourceBundle的步骤: 1. 创建一个ResourceBundle.Control实例,并在该实例中重写newBundle方法,用于动态加载资源文件。 2. 在newBundle方法中,使用ClassLoader加载资源文件并返回一个ResourceBundle实例。 3. 在程序中使用ResourceBundle.getBundle方法,传入资源文件名和自定义的Control实例,获取动态ResourceBundle实例。 4. 使用ResourceBundle实例中提供的方法,如getString、getInteger等,获取资源文件中的值。 下面是一个使用动态ResourceBundle的简单示例代码: ```java public class DynamicResourceBundleExample { public static void main(String[] args) { ResourceBundle.Control control = new ResourceBundle.Control() { @Override public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException { Properties props = new Properties(); InputStream stream = loader.getResourceAsStream(baseName + "_" + locale.getLanguage() + ".properties"); props.load(stream); return new PropertyResourceBundle(props); } }; ResourceBundle bundle = ResourceBundle.getBundle("messages", new Locale("en"), control); String hello = bundle.getString("hello"); System.out.println(hello); } } ``` 在上面的代码中,我们重写了Control的newBundle方法,使用ClassLoader加载资源文件,并返回一个PropertyResourceBundle实例。然后使用getBundle方法获取ResourceBundle实例,并使用getString方法获取资源文件中的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值