使用ResourceBundle
在程序中有很多字符串信息会被写在程序中,如果要改变某个字符串信息,则必须修改程序代码然后重新编译。对于日后可能变动的文字信息,可以考虑将信息移至程序之外,方法是使用 java.util.ResourceBundle 来做信息绑定。
第一步,准备一个properties文件 message.properties
onlyfun.caterpillar.welcome=Hello
onlyfun.caterpillar.name=World
第二步,使用ResourceBundle来读取信息
package com.xiaofan.demo.localize; import java.util.ResourceBundle; public class ResourceBundleDemo { public static void main(String[] args){ ResourceBundle resource = ResourceBundle.getBundle("com/xiaofan/demo/localize/message"); System.out.println( resource.getString("onlyfun.caterpillar.welcome")); System.out.println( resource.getString("onlyfun.caterpillar.name")); } }
在编写.properties文件内容时,键的名字前通常加上单位、产品、模块等信息,这样在信息增多时可以有效减少重复键名的冲突问题。
国际化信息
国际化的英文是 internationalization ,因为共18个字母,所以简称 I18N 。国际化的目的是让应用程序可以依地区不同而显示不同的信息,最基本的就是让不同语系的用户可以看到属于自己语系的信息。
在java中,用 java.util.Locale 类来表示一个区域,一个Locale实例包括了语系信息和区域信息。如 en 表示英语语系的国家, 而区域信息则如 US 表示美国。
Locale locale = new Locale( "zh", "CN");
当使用java.util.ResourceBundle.getBundle()方法时,默认就会自动取得计算机上的语系与区域信息,而事实上信息文件的名称由 basename 加上语系与地区来组成的。如上述的实例,则
- message.properties
- message_zh.properties
- message_en.properties
当没有提供专用的语系、区域信息文件时,就会寻找默认的资源文件,如上述 ResourceBundleDemo.java 中由于没有提供中文语系文件,所以读取的是默认文件。
由于资源文件必须是 ISO-8859-1 编码,所以对于非西方语系的处理,必须将之转换为 Java Unicode Escape 格式。如果使用Eclipse继承开发工具,则没有这个问题。下面介绍使用jdk的工具 native2ascii 来转换:
第一步,首先创建message_zh.txt文件,注意编码格式(如gb2312,utf-8)
onlyfun.caterpillar.welcome=哈喽
onlyfun.caterpillar.name=世界
第二步,使用JDK工具程序 native2ascii 来转换(上面我用的是utf-8编码)
native2ascii -encoding utf-8 message_zh.txt message_zh.properties
转换好的文件内容如下:
第三步,创建message_en.properties文件
onlyfun.caterpillar.welcome=Hello
onlyfun.caterpillar.name=World
第四步,使用ResourceBundle来读信息
package com.xiaofan.demo.localize; import java.util.Locale; import java.util.ResourceBundle; public class I18NDemo { public static void main(String[] args){ ResourceBundle resource = null; Locale locale = null; resource = ResourceBundle.getBundle("com/xiaofan/demo/localize/message"); System.out.println( resource.getString("onlyfun.caterpillar.welcome")); System.out.println( resource.getString("onlyfun.caterpillar.name")); locale = new Locale( "zh", "CN" ); resource = ResourceBundle.getBundle("com/xiaofan/demo/localize/message", locale); System.out.println( resource.getString("onlyfun.caterpillar.welcome")); System.out.println( resource.getString("onlyfun.caterpillar.name")); locale = new Locale( "en", "US" ); resource = ResourceBundle.getBundle("com/xiaofan/demo/localize/message", locale); System.out.println( resource.getString("onlyfun.caterpillar.welcome")); System.out.println( resource.getString("onlyfun.caterpillar.name")); } }
经过以上简单步骤,信息绑定与国际化也就完成了,一切显得那么的方便。最后,附上文件目录截图: