文章目录

  • 介绍
  • 类层次结构
  • 作用
  • 好处
  • 国际化和本地化
  • 使用
  • properties命名规范
  • 从ResourceBundle 中获取值

介绍

ResourceBundle:主要用来解决国际化和本地化问题
当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包(大多数情况下也就是.properties文件)中加载它。
这样可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

类层次结构

java resource文件 URL java resource bundle_System


注意:

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

作用

ResourceBundle:读取资源属性文件(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 中获取值

  • 获取ResourceBundle实例后可以通过下面的方法获得本地化值。
getObject(String key);
getString(String key);
getStringArray(String key);
  • 还可以通过keySet()方法获取所有的key。
Set keys = bundle.keySet();

新建四个属性文件

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

解释: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;

/**
 * @author OovEver
 * 2018/1/14 22:12
 */
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
取消
取消
取消

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