1. Java国际化简介

Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际化, 核心的思想就是, 对不同的语言提供一个不同的资源文件。

Java国际化主要通过3个类完成

  1. java.util.ResourceBundle:用于加载一个资源包。
  2. java.util.Locale:对应一个特定的国家/区域、语言环境。
  3. java.text.MessageFormat:用于将消息格式化。

国际化资源文件

为实现程序的国际化,必须提供程序所需要的资源文件。资源文件的内容由key-value对组成。

定义资源文件的规范

如果我们将缺省的资源文件的文件名取名为message.properties,那么相应的其他语言的资源文件名就是message_语言代码_国 家代码.properties。例如:我们的语言汉语的语言代码是zh,国家代码是CN,所以简体中文的资源文件名就 是:message_zh_CN.properties,英语的语言代码是en,美国的国家代码是US,所以美国英语的资源文件就是: message_en_US.properties。

资源文件的命名可以有3种格式: 1、message_language_country.properties
               2、message_language.properties 
               3、message_properties

Locale类可获取各国区域环境(如:Locale.ENGLISH、Locale.CHINESE,这些常量返回一个Locale实例),也可以获取当前系统所使用的区域语言环境。

ResourceBundle类可根据指定参数获取相应的资源,常用方法如下

ResourceBundle.getBundle(message)//获取当前系统所使用的区域环境获得指定资源文件
ResourceBundle.getBundle(message,locale)//根据指定的区域获取对应的资源文件

若资源文件包含非西方字符,则需要用JDK自带的工具来处理:native2ascii。

语言环境

在 Java 语言中,语言环境(locale)仅仅是一个标识符,而不是一组本地化的属性。java.util.Locale 类的一个实例表示一个特定的地理政治区域,使用表示语言、区域以及国家或地区的参数创建。每个与语言环境相关的类都维护着它自己的一组本地化属性,并且确 定如何对含有 Locale 参数的方法请求做出响应。

Java支持的语言和国家

若要获取Java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了java所支持的语言和国家。java代码如下:

复制代码
    public static void main(String[] args) {
        Locale[] localeList = Locale.getAvailableLocales();
        for (int i = 0; i < localeList.length; i++) {
            System.out.println(localeList[i].getDisplayCountry() + "="
                    + localeList[i].getCountry() + " "
                    + localeList[i].getDisplayLanguage() + "="
                    + localeList[i].getLanguage());
        }
    }
复制代码

JAVA国际化流程

ResourceBundle根据Locale加载资源文件 -> 返回一个ResourceBundle实例 -> ResourceBundle调用 getString()返回指定key对应的字符串。

带占位符的消息

若要输出的消息中必须包含动态的内容,这些内容必须是从程序中获取的,可利用带占位符的国际化资源文件来实现。

MessageFormat.format()

复制代码
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * 演示Java的国际化
 * 
 * @author Abu
 * 
 */
public class ParamFormat {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 测试美国英语的资源文件
        testDefault();
        // 测试缺省的资源文件
        testCustom();
    }

    public static void testDefault() {
        // 获得缺省的系统区域
        Locale locale = Locale.getDefault();
        // 获得资源文件
        ResourceBundle rb = ResourceBundle.getBundle("message", locale);

        // 获得相应的key值
        String greeting = rb.getString("greeting");
        String userInfo = rb.getString("userinfo");

        String name = "liky";
        int age = 18;
        Date birth = new Date();

        // 格式化参数,注意是一个Object的数组,这意味着可以将任何类型的对象来格式化模板.
        Object[] params = { name, age, birth };

        // 格式化参数,返回格式后的字符串
        String result = MessageFormat.format(userInfo, params);

        System.err.println(greeting + result);
    }

    public static void testCustom() {
        // 设置定制的语言国家代码
        Locale locale = new Locale("en_US");
        // 获得资源文件
        ResourceBundle rb = ResourceBundle.getBundle("message", locale);
        // 获得相应的key值

        String greeting = rb.getString("greeting");
        String userInfo = rb.getString("userinfo");

        String name = "liky";
        int age = 18;
        Date birth = new Date();

        // 格式化参数,注意是一个Object的数组,这意味着可以将任何类型的对象来格式化模板.
        Object[] params = { name, age, birth };

        // 格式化参数,返回格式后的字符串
        String result = MessageFormat.format(userInfo, params);

        System.err.println(greeting + result);
    }
}
复制代码

 在 src 目录下创建两个文件:

1、message.properties

greeting=\u4f60\u597d\uff0c
userinfo=\u540d\u5b57\uff1a{0}\uff0c\u5e74\u9f84\uff1a{1}\uff0c\u751f\u65e5\uff1a{2}\u3002

2、message_en_US.properties

greeting=Hello, 
userinfo=name: {0}, age: {1}, birthday: {2}.


打印结果:

你好,名字:liky,年龄:18,生日:13-2-23 下午4:26。
Hello, name: liky, age: 18, birthday: 13-2-23 下午4:26.

posted on 2014-10-14 17:17  雪落飞花  阅读(350)  评论(0编辑  收藏  举报