1、国际化程序实现原理
每个国家的人所使用的文字大多不一样,所以国际化程序实现中,业务逻辑不变,但是所加载的资源文件不同。需要解决的问题是区域和语言编码问题。
2、Locale类
在java.util里面提供有一个专门描述区域和语言编码的类:Locale。
主要使用两个构造方法来实例化。
- 构造方法:public Locale(String Language);
- 构造方法:public Locale(String Language,String country);
中文的代码:zh-CN、美国英语的代码:en_US。对于这些区域和语言的编码,最简单的获得方式就是通过IE浏览器获得。
手工选择
public class _43_1 {
public static void main(String[] args) {
Locale loc = new Locale("zh","CN");
System.out.println(loc);
}
}
如果想要自动获得当前的运行环境,那么现在就可以利用Locale类本身默认的方式进行实例化;
- 读取本地默认环境:public static Locale getDefault();
在实际的开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化开发,Locale也将世界上一些国家的编码设置为了常量。
Locale.CANADA
使用常量的优势在于可以避免一些区域代码信息的繁琐
3、读取资源文件ResourceBundle
public abstract class ResourceBundle extends Object.
ResourceBundle是一个抽象类,我们可以使用它的子类。
- 获取ResourceBundle类对象:public static final ResourceBundle getBundle(String baseName);
- baseName:描述的是资源文件的名称,但是没有后缀。
IDEA新建资源包步骤:在目录下Alt+Insert,选中Resource Bundle新建资源包。
public class _43_2 {
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("com.tangxz._10.Messages");
String val = resource.getString("info");
System.out.println(val);
}
}
4、实现国际化程序开发
依靠资源文件、Locale、ResourceBundle类就可以实现国际化的处理操作。(核心关键:读取资源信息)
在CLASSPATH下建立:一个Messages_zh_CN.properties;和一个Messgaes_en_US.prperties。
public class _43_3 {
public static void main(String[] args) {
Locale locale = new Locale("zh","CN");
ResourceBundle resource = ResourceBundle.getBundle("com.tangxz._10.Messages",locale);
String val = resource.getString("info");
System.out.println(val);
}
}
这样它就会根据locale来自动获取某个资源文件的内容,如果没有对应locale的资源文件则使用默认locale。
5、格式化文本显示
消息格式化,如果某一位用户登陆了,那么一般就会显示这样的信息“Xxx,欢迎您的光临”,也就是这个时候就会显示用户名,那么此时如果这些内容保存在了资源文件里面,则就需要通过占位符来进行描述,同时对于读取出来的数据也需要进行消息格式化的处理。
范例:修改资源文件
1、在资源文件中添加占位符
Messages_en_US.properties:info=Welcome!{0},data={1}
Messages_zh_CN.properties:info=欢迎{0}的访问,当前日期是{1}
2、此时进行资源读取会将占位符的信息一起读取出来,所以 此时就需要利用MessageFormat类进行格式化处理
在MessageFormat类中提供有一个格式化文本的方法:public static String format(String pattern , Object… arguments);
范例:格式化文本实现国际化
public class _43_5 {
public static void main(String[] args) {
Locale locale = new Locale("zh","CN");
ResourceBundle resource = ResourceBundle.getBundle("com.tangxz._10.Messages",locale);
String val = resource.getString("info");
System.out.println(MessageFormat.format(val,"mldn",new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
}
}
如果在日后开发的过程之中见到资源文件里面出现有 {0}、{1} 的结构表示的都是占位符,该信息一定都要进行格式化处理。