JDK对国际化的支持

一 JDK 提供对国际化支持相关的3个类

1.1 java.util.Locale

java.util.Locale 主要在软件的本地化时使用。它本身没有什么功能,更多的是作为一个参数辅助其他方法完成输出的本地化。java.util.Locale 类对象表示了特定的地理,政治和文化地区。

public class I18nTest1 {
    public static void main(String args[]){
        //系统默认语言环境,相当于 Locale.CHINA
        Locale defaultLocale = Locale.getDefault();
        //输出结果:CN x 中国 x zh x 中文 x 中文 (中国)
        System.out.println(defaultLocale.getCountry()+" x "+defaultLocale.getDisplayCountry()
            +" x "+defaultLocale.getLanguage()+" x "+defaultLocale.getDisplayLanguage()
            +" x "+defaultLocale.getDisplayName());

        Locale usLocale = Locale.US;
        //输出结果:US x 美国 x en x 英文 x 英文 (美国)
        System.out.println(usLocale.getCountry()+" x "+usLocale.getDisplayCountry()
        +" x "+usLocale.getLanguage()+" x "+usLocale.getDisplayLanguage()
        +" x "+usLocale.getDisplayName());

        Locale chineseLocale = Locale.CHINESE;
        //输出结果: x  x zh x 中文 x 中文
        System.out.println(chineseLocale.getCountry()+" x "+chineseLocale.getDisplayCountry()
        +" x "+chineseLocale.getLanguage()+" x "+chineseLocale.getDisplayLanguage()
        +" x "+chineseLocale.getDisplayName());

        Locale englishLocale = Locale.ENGLISH;
        //输出结果: x  x en x 英文 x 英文
        System.out.println(englishLocale.getCountry()+" x "+englishLocale.getDisplayCountry()
        +" x "+englishLocale.getLanguage()+" x "+englishLocale.getDisplayLanguage()
        +" x "+englishLocale.getDisplayName());

        //获得系统所有已安装的语言包信息
        Locale[] locales = Locale.getAvailableLocales();
        for(Locale locale:locales){
            System.out.println(locale.getCountry()+" x "+locale.getDisplayCountry()
        +" x "+locale.getLanguage()+" x "+locale.getDisplayLanguage()
        +" x "+locale.getDisplayName());
        }
    }
}

1.2 java.util.ResourceBoudle(抽象类)

java.util.ResourceBoudle 为软件国际化提供了读取国际化资源文件的途径。

说的简单点,这个类的作用就是读取classpath路径下的资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国家语言信息(也可以程序指定),然后获取相应的properties文件的内容。

国际化资源文件的命名规则为 baseName_语言代号_国家代号.properties,(其中 baseName 为自定义)。如果资源文件命名为 baseName.properties 则当该类读取不到对应语言环境的资源文件时,默认读取 baseName.properties 。

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

#资源文件名:i18nTest_en_US.properties
name=Mary
age=eighteen
language=English
Country=US 
#资源文件名:i18nTest_zh_CN.properties
#需将中文转换为Unicode编码
name=\u739B\u4E3D
age=18
language=\u4E2D\u6587
Country=\u4E2D\u56FD

-----------------分割线------------------

public class I18nTest2 {
    public static void main(String args[]){
        //会自动查找classpath路径下的资源文件
        //找到 baseName 为"i18nTest",并且locale为默认locale的详细信息,在本系统下即为读取 i18nTest_zh_CN.properties 文件
        ResourceBundle bundle = ResourceBundle.getBundle("i18nTest");
        String name = bundle.getString("name");
        String age = bundle.getString("age");
        String language = bundle.getString("language");
        String country = bundle.getString("country");
        //输出结果:我的名字叫玛丽,我今年18岁了,我出生于中国,所以我的母语是中文
        System.out.println("我的名字叫"+name+",我今年"+age+"岁了,我出生于"+country+",所以我的母语是"+language);

        bundle = ResourceBundle.getBundle("i18nTest", Locale.US);
        name = bundle.getString("name");
        age = bundle.getString("age");
        language = bundle.getString("language");
        country = bundle.getString("country");
        //输出结果:My name is Mary. I'm eighteen years old. I was born in US , so my first language is English
        System.out.println("My name is "+name+". I'm "+age+" years old. I was born in "+country+", so my first language is "+language);
    }
}

1.3 java.text.MessageFormat

Java.text.MessageFormat 用来辅助信息的格式化。对于字符串中可能变动的部分,可以先使用参数索引占住文字位置,参数索引是格式为形似{0}、{1}、{10}、{11}的非负整数,之后再使用 MessageFormat 的静态方法 format() ,将字符串中的参数索引用具体的字符串信息替换。

String values = "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}";
Object[] array = new Object[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"};  
values = MessageFormat.format(values,"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q");
//或 
//values = MessageFormat.format(values, array); 
//输出结果:ABCDEFGHIJKLMNOPQ
System.out.println(values);

因此,可以在国际化资源文件中以占位符的方式来表示需根据程序变动的信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章