4.4.6 默认区域设置的类别

在程序的国际化实现中,一般都使用当前Java虚拟机默认的区域设置信息。这个默认的Locale类的对象对用户来说通常是最合适的选择。Java 7对默认的Locale类的对象进行了更进一步地细分,划分成不同的类别。这些类别定义在Locale.Category这个枚举类型中,目前包括DISPLAY和FORMAT两种。类别为DISPLAY的Locale类的对象在显示用户界面时会作为默认的区域设置,而类别为FORMAT的Locale类的对象则在格式化日期和时间、数字和货币的时候被作为默认的区域设置。同时Locale类中的getDefault和setDefault方法也支持使用Locale.Category枚举类型中的值作为参数来获取和设置对应类别的默认Locale类的对象。

提供不同类别的默认Locale类的对象的动机在于为程序提供更多的灵活性。因为在某些情况下,显示用户界面需要的区域设置与格式化日期和时间等用的区域设置可能是不相同的。由于默认区域设置的类别在Java 7中才引入,对于习惯了Java 7之前的只有一种默认区域设置的开发人员来说,容易产生错误。

以笔者的Windows XP系统为例,它本身的系统语言是英语,但是区域设置是中国。当通过getDefault方法来获取默认区域设置的时候,会发现DISPLAY类别的区域设置是en_US,而FORMAT类别的区域设置则是zh_CN。如果在默认的区域设置下使用MessageFormat类,会发现一个有趣的现象,如下面的代码清单4-22所示,通过MessageFormat类的对象格式化之后的文本中同时包含了英文和中文,类似“Hello,张三.Today is 11-8-6下午5:17.”。这是因为ResourceBundle类在查找资源包时找到的是DISPLAY类别的默认区域设置对应的属性文件,而在格式化日期的时候,使用的则是FORMAT类别的默认区域设置,两者是不同的。

代码清单4-22 区域设置类别的使用示例


public void useLocaleCategory(){

ResourceBundle bundle=ResourceBundle.getBundle("messages");

String str=bundle.getString("GREETING");

String msg=MessageFormat.format(str, new Object[]{"张三",new Date()});

}


如果希望统一不同类别的区域设置,可以在程序启动之初通过setDefault方法把两个类别的默认区域设置设置为相同的值。