软件在开发时要能使它同时应对世界不同地区和国家的使用,针对不同地区和国家的访问,提供相应的,符合使用者阅读习惯的操作环境,这就必须要有国际化的概念,国际化又称为“i18n”:internationalization。
国际化要能使静态数据和动态数据都能做到符合国际化的需求,本篇先讲述如何使静态数据满足国际化需求,再下一篇文章中再讲诉如何使动态数据做到国际化。
对软件或页面中的静态数据要想做到国际化,必须满足一下两个步骤:
① 将这些静态数据编写到一个properties文件中,比如说取名为“resource.properties”,作为默认资源配置文件。接着可以根据不同的国家或者语言环境来再次编写不同的properties文件,比如编写resource_zh.properties和resource_en.properties文件。
注意,编写默认资源配置文件之后的不同properties文件中,内容使用的关键字要和最开始编写的“resource.properties”文件内使用的关键字相同。请看例1。
最开始编写的properties文件名称为“基名”,比如上述中的“resource”,其他的properties根据该基名并编写不同国家和语言的配置文件,这一组properties统称为一个资源包。
“zh”和“en”分别代表不同的语言编码,这一点请看上一篇博客《Java描述语言、国家和地理的类——Locale》。这些语言编码在编写不同国家语言的properties文件时必须的。
资源文件内容和Map集合一样(因为Property就是Map集合的子类),采用“关键字=值”的方式,在默认资源配置文件中定义的关键字,在其他不同资源文件中都必须相同,而其他不同资源文件中的关键字的值使用不同语言的文字。如果在资源配置文件中使用到了中文,请使用Unicode码(JDK提供了转换工具native2ascii,请看博客《使用JDK自带的工具将中文转换为ascii码》)。
② 使用Java的ResourceBundle类对象来代表描述一个资源包。通过使用该类的静态方法getBundle,传入参数为某资源包的基名,可以也可以不传入一个代表国家或语言的Locale对象。
通过上述方法获得的对象,在资源包中如果找不到与制定语言环境匹配的资源配置环境,会找和语言环境相近的资源文件,如果还找不到,那么就会使用默认资源配置文件(如上述的resource.properties)。
通过ResourceBundle实例对象的getString(String key)方法就能获取对应资源文件中指定关键字的值了。
例1:
创建一个工程,因为资源包中资源个数可能会很多,并且为了某组资源包不和其他组资源包累积在一起,因此我们使用一个包将该组资源包封装,并定义一个默认资源文件,基名为“MessageResource”,同时创建另外两个分别对应中文和英文的资源文件(记住,语言编码或国家编码一定要有):
在默认资源配置文件“MessageResource.properties”文件中,定义资源文件使用的关键字,当然在默认资源配置文件中关键字的值是作为如果无法找到匹配资源文件才使用的,这里我选择英文:
而对应的中文资源文件MessageResource_zh.properties的内容为:
其实在MyEclipse中properties文件的另一个界面是这样的:
而在英文资源文件MessageResource_en.properties中内容和默认资源文件内容是一样的,这里就不再重复贴出。
配置好资源文件后,我们就可以在工程中使用,我们新建一个demo,然后通过ResourceBundle的getBundle()这个静态方法来获取代表资源文件的对象:
1 public class Demo1 { 2 3 public static void main(String[] args) { 4 ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", Locale.CHINESE); 5 String username = bundle.getString("username"); 6 System.out.println(username); 7 } 8 }