国际化程序实现
所谓的国际化程序指的是同一个程序代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的。
国际化程序实现原理
通过分析可以发现,要想实现国际化程序开发,那么要解决的问题就在以下两点:
- 如何定义保存文字的文件信息
- 如何根据不同的区域语言编码读取指定的资源信息
Locale类
通过分析可以发现,要想实现国际化程序开发,那么首先要解决的就是不同国家的区域和语言的编码问题,在java.util中提供有一个专门描述区域和语言编码的类:Locale类。主要使用Locale类中两个构造方法进行实例化:
- 构造方法:
public Locale(String language);
- 构造方法:
public Locale(String language,String country);
此时需要的是国家和语言的代码,中文:zh_CN、美国:en_US,对于区域和语言的编码最简单的方式是通过IE浏览器完成;
实例化Locale类对象
import java.util.Locale;
public class LocaleStudy {
public static void main(String[] args) {
Locale loc = new Locale("zh", "CN");
System.out.println(loc);
}
}
如果想要自动获得当前运行环境,那么现在就可以利用Locale类本身默认的方式进行实例化:
- 读取本地默认环境:
public static Locale getDefault();
实际开发中很多人并不关心国家和语言的编码,为了简化开发,Locale将一些设为常量:
import java.util.Locale;
public class LocaleStudy {
public static void main(String[] args) {
Locale loc = Locale.CHINA;
System.out.println(loc);
}
}
使用常量的优势在于可以避免一些区域编码信息的繁琐。
ResourceBundle读取资源文件
现在已经准备好了资源文件,随后就需要进行资源文件的读取操作了,而读取资源文件主要依靠的是java.util.ResourceBundle类完成,定义:public abstract class ResourceBundle extends Object
.
ResourceBundle是一个抽象类,如果现在想要进行此类对象的实例化可以直接利用该类中提供的静态方法完成:
- 获取ResourceBundle对象:
public static final; ResourceBundle getBundle(String baseName);
- baseName:描述的是资源文件名称,但是没有后缀;
- 根据key读取资内容:
public final String getString(String key);
范例:使用ResourceBundle类读取内容
import java.util.ResourceBundle;
public class LocaleStudy {
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("per.lyz.BasicClass_study.Message");
String val = resource.getString("info");
System.out.println(val);
}
}
如果资源没有在包中则直接编写资源名称即可;
进行资源读取时,数据的key一定要存在,否则会出现如下异常信息:
- MissingResourceException
实现国际化程序开发
前期准备已经完成,依靠资源文件、Locale、ResourceBundle类就可以实现国际化的处理操作,下面进行国际化程序实现(核心:读取资源信息)。
- 在CLASSPATH中建立:Messages_zh_CN.properties;
- 在CLASSPATH中建立:Messages_en_US.properties;
- 通过程序进行指定区域资源文件加载
import java.util.ResourceBundle;
public class LocaleStudy {
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("per.lyz.message.Message");
String val = resource.getString("info");
System.out.println(val);
}
}
此时通过ResourceBundle类读取资源的时候并没有设置一个明确的Locale对象,但是发现“zh_CN”文件被加载,因为这个方法默认加载的就是==当前本地(Locale.getDefault())==的Locale资源。
如果需要则可以修改当前Locale环境,则可以使用ResourceBundle类中的如下方法:
- 获取ResourceBundle:
public static final ResourceBundle getBundle(String baseName, Locale locale);
import java.util.Locale;
import java.util.ResourceBundle;
public class LocaleStudy {
public static void main(String[] args) {
Locale loc = new Locale("en","US");
ResourceBundle resource = ResourceBundle.getBundle("per.lyz.message.Message", loc);
String val = resource.getString("info");
System.out.println(val);
}
}
如果现在有指定区域的资源文件存在的时候,那么没有设置区域的资源文件的信息将不会被读取。
读取顺序: 指定区域资源文件>默认本地资源>公共资源(没有区域设置)
格式化文本显示
如现在某一用户登录成功,一般会显示“XXX,欢迎!”,那么此时如果这些内容保存在了资源文件中,这就需要占位符进行描述,同时对读取的数据要进行消息格式化的处理。
此时对资源文件进行读取,则会见占位符的信息一起读取出来,所以此时需要MessageFormat类进行处理。
MessageFormat中提供格式化文本的方法:public static String format(String pattern,Object... arguments);
格式化文本
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
public class LocaleStudy {
public static void main(String[] args) {
Locale loc = new Locale("zh","CN");
ResourceBundle resource = ResourceBundle.getBundle("per.lyz.message.Message", loc);
String val = resource.getString("info");
System.out.println(MessageFormat.format(val, "lyz", new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
}
}
在日前后开发中见到资源文件中出现有“{0}”的结构表示占位符,要进行格式化处理。