java基础类库——国际化程序实现(八)

国际化程序实现

所谓的国际化的程序指的是一套代码,可以自动的根据当前操作系统的语言环境不同,显示不同的语言。假如现在某个系统可能在全世界所有国家都有可能使用到,那么在假设系统操作业务流程不变的情况,那么要想让不同国家使用这个系统,最大的障碍就在于显示语言了。
在这里插入图片描述
1.1 确定城市及语言
在java.util包中提供有一个Local的类,这个类的主要功能是用于定位当前的城市及语言环境。如果要想去确定语言环境必须知道城市编码及语言编码,zh_CN:中文的城市编码,英文:en_US

在Local类中提供有一个城市及语言编码,可以进行Local的定义。

范例:观察Local类的使用

package day2;

import java.util.Locale;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        Locale loc = new Locale("zh","CN");
        System.out.println(loc);
    }
}
zh_CN

但是在很多时候应该根据当前的操作系统语言环境选择才对,在Local类中提供取得当前环境的方法。
取得当前环境:public static Locale getDefault()

范例:观察Local类的使用

package day2;

import java.util.Locale;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        Locale loc = Locale.getDefault();
        System.out.println(loc);
    }
}
zh_CN

但是使用Local会牵扯到系统的变更问题。我不想去及编码,又不想使用系统默认,那么可以使用Local类定义的一堆常量。

范例:观察Local类的使用

package day2;

import java.util.Locale;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        System.out.println(Locale.CHINA);
        System.out.println(Locale.US);
        System.out.println(Locale.JAPAN);
    }
}
zh_CN
en_US
ja_JP

即:Local就是定位语言环境的。

1.2 读取资源文件
在java中使用*.properties定义的文件都是资源文件(后缀是固定的,不允许修改),而且资源文件的名称应该跟类名称保持一样的命名风格,例如:Message.properties,而在资源文件中保存的都是字符串信息,这些信息必须按照“key=value”发形式保存。随后这个资源文件必须放在CLASSPATH下才可以被访问到,如果有包,应该加上包名称后在访问。

如果想要取得这个资源文件则可以依靠java.util.ResourceBundle类完成。这个类是一个抽象类,会提供一个static方法取得本类对象:public static final ResourceBundle getBundle(String baseName),这个方法上需要一个资源文件的基本名字(baseName),Message。而后根据可以取得value信息:public final String getString(String key)

范例:取得资源文件

Message.properties
welcome=\u6b22\u8fce\u5149\u4e34

package day2;
import java.util.Locale;
import java.util.ResourceBundle;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        ResourceBundle rb = ResourceBundle.getBundle("Message");
        System.out.println(rb.getString("welcome"));
    }
}

1.3 实现国际化程序
国际化程序关键就在于资源文件,在定义资源文件的时候需要针对于不同国家的城市与语言编码定义的文件,例如:中文资源:Message_zh_CN.properties,英文资源:Message_en_US.properties

要实现资源的定位需要依靠Local类完成,而同时还需要与ResourceBundle类集合,使用入戏方法取得ResourceBundle类的实例化对象:
public static final ResourceBundle getBundle(String baseName, Locale locale)。

范例:取得资源文件,实现国际化

Message_en_US.properties
welcome=Hello,Welcome

Message_zh_CN.properties
welcome=\u60a8\u597d\uff0c\u6b22\u8fce\u5149\u4e34

package day2;

import java.util.Locale;
import java.util.ResourceBundle;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        Locale loc = new Locale("en","US");
        ResourceBundle rb = ResourceBundle.getBundle("Message",loc);
        System.out.println(rb.getString("welcome"));
    }
}

Hello,Welcome

但是有一个问题,加入在中文环境下说您好,得有一个名:可以使用占位符,但是这个时候必须针对于读取出的数据进行一些转换,依靠java.text.MessageFormat类完成。格式化文本的方法:public static String format(String pattern, Object … arguments)

范例:格式化文本的方法

Message_en_US.properties
welcome={0},Hello,Welcome

Message_zh_CN.properties
welcome={0},\u60a8\u597d\uff0c\u6b22\u8fce\u5149\u4e34

package day2;

        import java.text.MessageFormat;
        import java.util.Locale;
        import java.util.ResourceBundle;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        Locale loc = new Locale("zh","CN");
        ResourceBundle rb = ResourceBundle.getBundle("Message",loc);
        String str = rb.getString("welcome");
        System.out.println(MessageFormat.format(str,"张晓明"));
    }
}
张晓明,您好,欢迎光临

在许多的项目开发过程中,这样的格式化文本操作时很常见的。

总结:国际化操作虽然给看我们可以进行多语言显示的能力,但是大部分情况下,使用国际化的操作都是为了方便进行资源信息的读取操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值