邳州网站建设,企业安全文化建设,wordpress能做交互类网站,网络优化关键词ResourceBundle使用详解
这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念#xff0c;两者都是一起出现的。可以说#xff0c;国际化的目的就是为了实现本地化。比如对于“取消”#xff0c;中文中我们使用“取消”来表示#xff0c;而英文中我们使用…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.propertiescancelKeycancel
my_zh_CN.propertiescancelKey\u53D6\u6D88取消
my_zh.propertiescancelKey\u53D6\u6D88zh取消zh
my.propertiescancelKey\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的形式遍历获得属性文件内的各个值。