国际化程序实现原理
所谓国际化的程序指的是同一个代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的
1、国际化问题简介
现在假设有一款全世界都认可的企业管理平台,那么这个企业老板决定将这个产品推广到全世界各个大型上市公司,这些公司可能来自不同的国家
同过分析可以发现,如果想要实现国家化的程序开发, 那么需要解决以下两点:
- 如何可以定义保存文字的文件信息
- 如何可以根据不同区域语言的编码读取指定的资源信息
2、Locale类
如果要想实现国际化,那么首先需要解决的就是不同国家用用户的语言编码问题,而在java.util包中提供有一个专门描述区域和语言编码的类:Locale,主要可以使用Locale类中的两个构造方法进行实例化
- 构造方法:public Locale(String language)
- 构造方法:public Locale(Stirng language , String country)
此时需要的是国家和语言的代码,而中国的代码:zh_CN、美国的代码:en_US。获取语言编码的最简单的方式就是通过IE浏览器
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Locale locale = new Locale("zh", "CN");
System.out.println(locale);
}
}
如果现在想要自动获得当前的运行环境,那么现在就可以利用Locale类本身默认的方式进行实例化
- 读取本地默认环境:public static Locale getDefault()
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Locale locale = Locale.getDefault();
System.out.println(locale);
}
}
在实际开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化,Locale也将世界上著名的国家的编码设置为了常量
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Locale locale = Locale.CHINA;
System.out.println(locale);
}
}
3、读取资源文件:ResourceBundle
现在一斤准备好了资源文件,那么随后就需要进行资源文件的读取操作了,读取资源文件主要依靠java.util.ResourceBundle类完成,定义如下:
- public abstracet class ResourceBundle extends Object
ResourceBundle是一个抽象类,如果说现在想要进行此类对象的实例化可以直接使用该类中提供的一个static方法完成:
- public sattic final ResourceBundle getBundle(String baseName)
- baseName:描述的是资源文件的名称,但是没有后缀
- 根据key读取资源内容:public final String getString(String key)
范例:使用ResourceBundle类读取内容
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
ResourceBundle resource = ResourceBundle.getBundle("Resource.message");
String info = resource.getString("info");
System.out.println(info);
}
}
如果资源没有放在包里面,则直接编写资源名称即可
如果资源未找到会报“java.util.MissingResourceException: Can’t find bundle for base name message, locale zh_CN”异常
如果key不存在会报“java.util.MissingResourceException: Can’t find resource for bundle java.util.PropertyResourceBundle, key infos”异常
4、实现国际化程序
现在国际化程序的实现前期准备工作已经全部完成了,也就是说依靠资源文件、Locale,ResourceBundle类就可以实现国际化处理操作了
进行国际化程序实现(核心关键:读取资源信息)
①、在Resource文件夹下创建message_zh_CN.properties
info=欢迎您的访问!
②、在Resource文件夹下创建message_en_US.properties
info=welcome
③、通过程序进行指定区域的资源文字加载
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
ResourceBundle resource = ResourceBundle.getBundle("Resource.message");
String info = resource.getString("info");
System.out.println(info);
}
}
// 结果:欢迎您的访问!
此时中国利用ResouceBundle类读取资源的时候并没有设置一个明确的Locale对象,但是发现“message_zh_CN”的文件起作用了,因为默认加载了班底的Locale的资源
④、如果现在有需要也可以修改当前的Locale环境,则可以使用ResourceBundle类中的如下方法:
- 获取ResourceBundle:public static final ResourceBundle getBundle(String baseName , Locale locale)
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Locale locale = new Locale("en", "US");
ResourceBundle resource = ResourceBundle.getBundle("Resource.message" , locale);
String info = resource.getString("info");
System.out.println(info);
}
}
//输出的结果是 welcome
如果现在没有指定的资源文件存在时,那么没有设置区域的资源文件不会被读取
资源读取顺序:读取指定区域的资源文件 > 默认的本地资源 > 没有公共的资源(没有区域设置的)
5、格式化文本显示
登录成功后,一般会显示这样的信息:xx欢迎您…
也就是说这个时候会显示用户名,那么此时如果这些内容保存在了资源文件里面,则需要通过占位符来进行描述,同时对于读取出来的数据也需要进行消息格式化的处理
范例:修改资源文件
资源文件 | info |
---|---|
中文资源文件 | info=欢迎您的访问. 当前的日期是{1} |
英文资源文件 | info=Welcome{0} Date:{1} |
如果有需要,则可以继续添加{1},{2}…
如果此时需要进行资源读取,则会将占位符的信息一起读取出来,因此需要利用MessageFormat类进行格式化处理
在MessageFormat类中提供有一个格式化文本的方法:public static String format(String pattren , Object… arguments)
范例:格式化文本实现国际化
public class JavaAPIDemo {
public static void main(String[] args) throws ParseException {
Locale locale = new Locale("en", "US");
ResourceBundle resource = ResourceBundle.getBundle("Resource.message" , locale);
String info = resource.getString("info");
System.out.println(MessageFormat.format(info , "linlin" , new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
}
}
//结果:Welcomelinlin Date:2022-05-12
如果在日后开发过程中见到资源文件里面出现有{0},{1}…表示的就是占位符,需要进行格式化处理
下一篇:开发支持类库