国际化程序实现原理
国际化的程序指的是同一程序代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的。
想要实现国际化的程序开发,要解决两个问题:
- 如何定义保存文字的文件信息
- 如何根据不同区域语言的编码读取指定的资源
Locale类
在java.util里面提供有一个专门描述区域和语言编码的类:Locale。
主要可以使用Locale类中的两个构造方法进行实例化:
public Locale(String langugage)
public Locale(String language,String country)
此时需要的是国家和语言的代码,中文的代码:zh_CN,美国英语的代码:en_US
实例话Locale对象:
import java.util.Locale;
public class LocaleDemo {
public static void main(String[] args) {
Locale loc = new Locale("zh", "CN");
System.out.println(loc);
}
}
// 输出结果 zh_CN
如果想要获得当前的运行环境,就可以利用Locale类本身默认的方式进行实例化:
//读取本地默认环境
public static Localeg getDefault()
在实际的开发中,很多人可能不关心国家和语言的编码,所以为了简化开发,Locale类也将世界上一些比较著名的国家的编码设置成了常量。
Locale loc=Locale.CHINA
使用常量的优势可以避免一些区域信息的繁琐。
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)
如果资源没有放在包中,直接写资源名称即可,在进行资源读取的时候key一定要存在,如果不存在则会出现异常信息。
实现国际化程序
在CLASSPATH下建立com.message.Message_zh_CN.properties (中文资源)
info=欢迎您的访问
在CLASSPATH下建立com.message.Message_en_US.properties (中文资源)
info=Welcome
加上没有默认的区域的资源文件,共定义了三个资源。
此时在利用ResourceBundle类读取资源的时候并没有设置一个明确的Local对象,如果现在有需要也可以修改当前的Locale环境,可以使用ResourceBundele类中如下方法:
//获取ResourceBundle类对象
public static final ResourceBundle getBundle(String baseName,Locale locale)
如果现有指定区域的资源文件存在的时候,那么没有设置区域的资源文件的信息将不会被保存。
读取顺序:
读取指定区域的资源文件>默认的本地资源>公共资源(没有区域)
格式化文本显示
如果说现在某一位用户登录成功了,那么一般都会显示这样的信息“Xxx,欢迎您的光临,”也就是说这个时候会显示用户名,那么此时如果这些内容保存在了资源文件里面,则就需要通过占位符来进行描述,同时对于我们提取出的数据也需要进行格式化处理。
如果有需要则可以继续添加“{1}”、“{2}”之类的内容;
此时如果要进行资源读取则会将占位符的信息一起读取出来,所以此时就需要利用MessageFormat 类进行格式化处理。
在 MessageFormat 类中提供有一个格式化文本的方法:
public static String format(String pattern, Object... arguments).
文本格式化实例:
Locale loc=new Locale("en","US");
ResourceBundle resource=ResourceBundle.getBundle("com.Message");
String var=resource.getString("info");
System.out.println(MessageFormat.format(val,"name"),new SimpeleDateFormat("yyyy-MM-dd").format(new Date)) //对应资源文件中的占位符{0},{1}