java国际化(转)

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.

时间: 2024-10-10 12:33:28

java国际化(转)的相关文章

JAVA国际化

大家好,我是成都[LD],今天给大家带来的是JAVA国际化.如果您用过Struts,那您对国际化应该并不陌生. 通常来说,在代码中我们会夹杂一些字符串,这样其实并不好看,维护起来也不是特别方便.举个例子:假设你开发系统是中文版本,突然来了个需求,需要英文版本,如果你将字符串写在代码里面,这样你又不得不将所有的中文字符替换成英文字符.为了减少这种需求下重复劳动,我们通常会自己去写一个配置文件,然后将所有字符串放在配置文件里面,然后去读这个配置文件等等一系列的操作.当然这属于我们自己的一种解决问题的

java 国际化

java  国际化简介 1.Locale类:国际化类,构建具体语言. 2.ResourceBundle:资源文件工具类,读取Locale构造对象的语言文件. 3.MessageFormat:消息格式化类,给资源文件占位符赋值. 4.资源文件命名规范:key_语言代码_国家代码.properties,key可以任意  基本步骤:     1.构造语言Locale对象.         Locale locale = new Locale("zh_CN");     2.读取语言资源文件 

Java国际化知识

在Java中有自动国家化的信息,废话少说看例子.下面是通过Java获取计算机里面的国际化信息. package lee; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public class JavaResource { /** * 打印出来计算机上面可用的国际化资源 */ public static void availableCountry(){ Local

Java国际化(i18n)

Java国际化(i18n) 最近在做一个网站国际化的功能.用Java做开发,使用spring+velocity. Java提供了对i18n的支持,spring对其做了集成,可以很方便的配置.主要思想就是根据语言来读取不同的配置文件,来显示对应的文本.主要步骤如下: 1. 用两个properties文件来保存“符号”到对应语言的映射.如messages_en.properties和messages_zh.properties, 将其放到工程的classPath下 #messages_en.prop

java——国际化详解

深入理解Java国际化 假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面--这便是典型的i18n国际化问题.对于有国际化要求的应用系统,我们不能简单地采用硬编码的方式编写用户界面信息.报错信息等内容,而必须为这些需要国际化的信息进行特殊处理.简单来说,就是为每种语言提供一套相应的资源文件,并以规范化命名的方式保存在特定的目录中,由系统自动根据客户端语言选择适合的资源文件. 基础知识

java国际化(简单说说)

java国际化的思路 一.程序需要支持哪些国家,语言环境-->资源文件中 资源文件是key-value对,key是不变的,但是value是随不同国家,语言而改变 二.主要通过三个类来实现: java.util.ResourceBundle:用于装载特定的国家/区域,语言资源包 java.util.Locale:封装特定国家/区域,语言环境-->国家/区域及其相应代号,语言(相应代号) java.text.MessageFormat:用于格式化带占位符的字符串 1 import java.uti

Java国际化资源文件的选择

(一)在Java环境下有以下资源文件: message_zh_CN.properties message_zh_TW.properties message_zh.properites message.properties 如果Locale为zh_CN,查找资源文件的顺序为: message_zh_CN.properties message_zh.properites message.properties 如果上述三个资源文件都不存在,则抛出异常,不会使用message_zh_TW.propert

java国际化中,查找不同国家的语言代码和对应的语言

package arg.fkjava.structs.actio; import java.util.Locale; public class Test {        public static void main(String[] args) {           Locale[] locals=Locale.getAvailableLocales();           for (Locale locale : locals) {          System.out.printl

JAVA国际化问题

在应用中有这样一段代码: public float caculatePercent(float percent) { DecimalFormat df = new DecimalFormat("0.0"); String formatedStr = df.format(percent); Float.valueOf(formatedStr); } 先不考虑这段代码是否合理,反正应用中出现了..然后应用在使用过程都是正常的,然而,突然有一天,qa说,崩溃了! 为什么之前都好好的,现在会崩