国际化程序实现
2020-12-23 本文已影响0人
曾梦想仗剑天涯
- 国际化的程序指的是同一个程序代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的;
国际化程序实现原理
此图来源于李兴华老师- 如果想要实现国际化的程序开发,需要解决以下两点:
- 如何可以定义保存文字的文件信息;
- 如何可以根据不同的区域语言的编码读取指定的资源信息;
Locale类
- java.util.Locale类专门描述区域和语言的编码,主要使用Locale类中的两个构造方法进行实例化:
- 构造方法:public Locale(String language)
- 构造方法:public Locale(String language, String country)
- 需要的是国家和语言的代码,中文代码为:zh_CN、美国的代码为:en_US;
//实例化Locale类对象
import java.util.Locale;
public class LocaleApi {
public static void main(String[] args) {
Locale loc = new Locale("zh", "CN");
System.out.println(loc);
}
}
- 想要自动获得当前的运行环境,可以利用Locale类本身默认的方式实例化:
- 读取本地默认环境:public static Locale getDefault()
Locale loc = Locale.getDefault();
- Locale类将一些世界上比较著名的国家的编码设置为了常量;
Locale loc = Locale.CHINA;
- 使用常量的优势在于可以避免一些区域编码信息的繁琐;
ResourceBundle读取资源文件
-
读取资源文件主要依靠的是java.util.ResourceBundle类完成,此类定义如下:
- public abstract class ResourceBundle extends Object
-
ResourceBundle是一个抽象类,如果想要进行此类对象的实例化可以直接利用该类中提供的一个static方法完成;
- 获取ResourceBundle类对象:public static final ResourceBundle getBundle(String baseName)
- 根据key读取资源内容:public final String getString(String key)
- baseName描述的是资源文件的名称,但是没有后缀(com.company);
//使用ResourceBundle类读取内容
import java.util.ResourceBundle;
public class ResourceBundleApi {
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("com.company.Message");
String val = resource.getString("info");
System.out.println(val);
}
}
- 如果资源没有放在包里面,则直接编写资源名称即可;
国际化程序实现
- 创建文件com.company.Message_zh_CN.properties
- 创建文件com.company.Message_en_US.properties
- 创建文件com.company.Message.properties
import java.util.ResourceBundle;
public class ResourceBundleApi {
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("com.company.Message");
String val = resource.getString("msg");
System.out.println(val);
}
}
- 此时读取资源的时候并没有设置一个Locale对象,但是这个时候发现Message_zh_CN文件起作用了,因为这个方法里面默认加载的就是当前本地的Locale的资源;
- 手动修改当前Locale环境,则可以使用ResourceBundle类中方法:
- public static final ResourceBundle getBundle(String baseName, Locale locale)
import java.util.Locale;
import java.util.ResourceBundle;
public class ResourceBundleApi {
public static void main(String[] args) {
Locale loc = new Locale("en", "US");
ResourceBundle resource = ResourceBundle.getBundle("com.company.Message", loc);
String val = resource.getString("msg");
System.out.println(val);
}
}
- 如果指定区域资源文件存在的话,那么没有设置区域资源文件的信息将不会被读取;
- 资源读取顺序:指定区域资源文件 > 默认本地资源 > 公共资源(没有区域设置的);
消息格式化
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle;
public class ResourceBundleApi {
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("com.company.Message");
String val = resource.getString("msg");
//msg=Hello {0} date {1}
System.out.println(MessageFormat.format(val, "小明", new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
}
}