假如应用系统是面向多种语言的,编程时就不得不设法解决国际化问题,包括操作界面的风格问题、提示和帮助语言的版本问题、界面定制个性化问题等。
由于Java语言具有平台无关、可移植性好等优点,并且提供了强大的类库,所以Java语言可以辅助我们解决上述问题。Java语言本身采用双字节字符编码,采用大汉字字符集,这就为解决国际化问题提供了很多方便。从设计角度来说,只要把程序中与语言和文化有关的部分分离出来,加上非凡处理,就可以部分解决国际化问题。在界面风格的定制方面,我们把可以参数化的元素,如字体、颜色等,存储在数据库里,以便为用户提供友好的界面;假如某些部分包含无法参数化的元素,那么我们可能不得不分别设计,通过有针对性的编码来解决具体问题。
Java类包
在用Java解决国际化问题的过程中,可能利用到的主要的类都是由java.util包提供的。该类包中相关的类有Locale、 ResourceBundle、ListResourceBundle、PropertyResourceBundle等,其继续关系如下图所示。
其中各类提供的主要功能如下:
Locale:该类包含对主要地理区域的地域化特征的封装。其特定对象表示某一特定的地理、政治或文化区域。通过设定Locale,我们可以为特定的国家或地区提供符合当地文化习惯的字体、符号、图标和表达格式。例如,我们可以通过获得特定Locale下的Calendar类的实例,显示符合特定表达格式的日期。
ResourceBundle:该类是一个抽象类,需要通过静态方法ResourceBundle.getBundle()指定具体实现类或属性文件的基本名称。基本名称会协同指定的或默认的Locale类,决定具体调用的类或属性文件的唯一名称。例如:指定基本类或属性文件名称为TestBundle,而指定的Locale是CHINESE,那么最适合匹配的类名称为TestBundle_zh_CN.class,而最佳匹配属性文件名称为 TestBundle_zh_CN.properties。按照Java Doc和相关文档的要求,假如该类或属性文件没有找到,系统会查找近似匹配(主文件名依次为TestBundle_zh和TestBundle的类或属性文件)。该类提供的getKeys()方法用于获得所有成员的键名,并提供handleGetObject方法获得指定键的对应元素。
ListResourceBundle:该类继续ResourceBundle类,主要是增加了一些便于操作的成分,但还是抽象类。假如希望使用类的方式实现具体的ResourceBundle,一般情况下最好继续这个类。
PropertyResourceBundle:该类也继续ResourceBundle类,可以实例化。该类的行为特征如同java.util.properties类,可以从输入流中获得具体属性对。
假如涉及日期和时间显示等问题时,可以利用java.text包以及java.util包中的TimeZone、SimpleTimeZone和Calendar等类进行辅助处理。
参数化解决方法
在具体应用时,可以把具体国家或地区特征中可以参数化的部分放在经过非凡命名的属性文件中,在确定具体的Locale后,通过PropertyResourceBundle类读取相应的属性文件,实现国际化特征。
使用PropertyResourceBundle类获得当地版本的国际化信息,部分代码如下:
……
public static final String BASE_PROP_FILE =
“DISP”;
public static final String SUFFIX =
“.properties”;
locale = Locale.getDefault();
String propFile = BASE_PROP_FILE + “_” + locale.toString()+ SUFFIX;
ResourceBundle rb;
try {
File file = new File(propFile);
if (file.exists()) {
is = new FileInputStream(file);
rb = new PropertyResourceBundle(is);
if (rb == null) System.out.println(“No Resource”);
}
} catch (IOException ioe) {
System.out.println(“Error open file named ” + propFile);
}
Enumeration e = rb.getKeys();
while (e.hasMoreElements()){
key = (String)e.nextElement();
value = (String)rb.handleGetObject(key);
System.out.println(“KEY: ” + key +
“\t\t Value: ” + value);
}
……
DISP_zh_TW.properties文件的具体内容如下:
Key1=\u53ef\u4ee5
Key2=\u64a4\u9500
等号后面是利用native2ascii程序转化后的繁体汉字,假如不进行转化,系统可能显示乱码。
处理提示和帮助
对于提示语言和帮助文件部分,可以把语言映射放在属性文件或者ListResourceBundle类的子类中。下面程序是一个Servlet,它通过接受客户端的选择,把特定语言和字符版本的信息返回到客户端。