文章目录
- 国际化程序实现
- Locale类
- 读取资源文件:ResourceBundle
- 国际化程序开发
- 格式化文本显示
国际化程序实现
所谓的国际化的程序指的是同一个程序代码可以根据不同的语言描述,但是程序处理的核心业务是相同的。
现在假设有一款世界都认可的企业管理平台,那么这个企业的老板决定将这个产品推广到世界各个大大型上市公司,于是这些公司可能来自于:中国、美国、德国,那么在这样的情况下,首先要考虑的问题是什么呢?
通过分析得出的结论是,如果要想实现国际化的程序开发,那么要解决两个问题。
- 如何可以定义保存文字的文件信息。
- 如何可以根据不同的区域语言的编码读取指定的资源信息。
Locale类
通过分析可以发现,如果要想实现国际化,那么首先需要解决的就是不同国家用户的区域和语言的编码问题,而在 java.util里面提供有一个专门描述区域和语言编码的类:Locale, 而后主要可以使用 Locale 类中的三个构造方法进行实例化。
public Locale(String language)
public Locale(String language,String country)
public Locale(String language, String country, String variant)
此时需要的是国家和语言的代码,而中文的代码:zh_CN、美国英语的代码: en _US,对于这些区域和语言的编码最佳获得广式就是通过浏览器。
@org.junit.Test
public void test29() {
Locale loc = new Locale("zh", "CN");
System.out.println(loc);
}
结果:zh_CN
这个是手动添加,而不是自动获得。
如果说现在要想自动获得当前的运行环境,那么现在就可以利用 Locale 类本身默认的方式进行实例化
public static Locale getDefault() // 获取系统的
在实际的开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化开发,Locale 也将世界上一些比较著名的国家的编码设置为了常量。
使用常量的优势在于可以避免一些区城编码信息的繁琐。
读取资源文件:ResourceBundle
现在已经准备好资源文件,那么随后就需要进行资源文件的读取操作了,而读取资源文件主要依靠的是java.util.ResourceBundle
类完成
public abstract class ResourceBundle extends Object // 抽象类
1.获取ResourceBundle对象
ResoufcBundle 是一个抽象类,如果说现在要想进行此类对象的实例化可以直接利用该类中提供的一个静态方法完成。(也可以使用该类的一个子类)
如现有配置文件com.example.resources.test.properties
public static final ResourceBundle getBundle(String baseName)
baseName:描述的是资源文件的名称,但是没有后缀。
public static final ResourceBundle getBundle("com.example.resources.test")
// 没有properties的后缀
ResourceBundle读取文件的时候不需要加文件后缀
2.读取资源内容
public final String getString(String key)
@org.junit.Test
public void test29() {
ResourceBundle resourceBundle = ResourceBundle.getBundle("demo");
String values = resourceBundle.getString("info");
System.out.println(values);
}
info=dsfajdkalsfasfa
如果资源没有放在包里面,则直接编写资源名称即可。在进行资源读取的时候数据 的 key 一定要存在,如果不存在则会出现异常信息。
java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key infos
国际化程序开发
现在国际化程序的实现前期准备已经全部完成了,也就是说依靠资源文件、Locale、 ResourceBundle 类就可以进行处理操作理操作,那么下面来进行国际化的程序实现(核心关键:读取资源信息)。
1.在资源文件中创建Messages_ch_CN.properties(中文资源),Messages_en_US.properties(英文资源)的资源文件(读取时依旧只写Messages)
2.在利用 ResourceBundle 类读取资源的时候并没有设置一个明确的 Local 对象,但是Messages_ch_CN资源文件起了作用
public static final ResourceBundle getBundle(String baseName) {
Class<?> caller = Reflection.getCallerClass();
return getBundleImpl(baseName, Locale.getDefault(), caller, getDefaultControl(caller, baseName));
}
// 在创建实例化对象时自动获取了默认的地区编码
如果现在有需要也可以修改当前的 Locale 坏境,则可以使用 ResourceBundle 类的其他构造方法
public static final ResourceBundle getBundle(String baseName,Locale locale)
// 自定义地区编码
如果现在有指定区域的资源文件存在的时候,那么没有设置区域的资源文件的信息将不会被读取。
读取顺序:
读取指定区域的资源文件>默认的本地资源>公共的资源(没有区域)。
没有区域设置的资源(Messages.properties)
格式化文本显示
消息格式化
如果说现在某一位用户登录成功了,那么一般都会显示这样的信息“Xxx,欢迎您的光临,”也就是说这个时候会显示用户名,那么此时如果这些内容保存在了资源文件里面,则就需要通过占位符来进行描述,同时对于我们提取出的数据也需要进行格式化处理。
中文配置文件Messages_ch_CN.properties | 英文配置文件Message_en_US.properties |
|
|
如果有需要则可以继续添加“{1}”、“{2}”之类的内容。
此时如果要进行资源读取则会将占位符的信息一起读取出来,所以此时就需要利用MessageFormat 类进行格式化处理。
里面提供了多个重载的format方法
public static String format(String pattern,Object... arguments)
@org.junit.Test
public void test29() {
Locale loc = Locale.US;
ResourceBundle resourceBundle = ResourceBundle.getBundle("Messages",loc);
String str = resourceBundle.getString("info");
System.out.println(MessageFormat.format(str,"小王",new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
}
结果
hello小王,date:2022-07-08
如果在日后开发的过程之中见到资源文件里面出现有**“{0}”、“{1}”的结构表示的都是占位符,该信息一定都要进行格式化处理。