国际化 I18N 本地化 L10N
(1)格式化获取本地化信息
//获取本地化默认信息
Locale l = Locale.getDefault();
System.out.println(locale);
显示本地化格式化时间 DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL,locale);
System.out.println(df.format(now));
double d = 1234.56;
//格式化数据
NumberFormat nf1 = NumberFormat.getInstance();
System.out.println(nf1.format(d));
//作为货币输出
NumberFormat nf2 = NumberFormat.getCurrencyInstance();
System.out.println(nf2.format(d));
当我们更换了语言本地化的环境,不需要改变代码就可以让各种格式化输出改变。感觉这些都是java本地包提供的功能。
(2)资源包
在国际化应用中,通常用资源包 Resource Bundle 的形式来保存与运行环境相关的资源。
资源包 命名格式
a <包名>_<语言代码>_<国家/地区代码> 例如: myRes_zh_CN
b <包名>_<语言代码> 例如:MyLabels_en
资源包的两种表现形式
a 属性文件 (Property File)
保存一些文本信息,后缀必须是 .properties 前缀与资源包同名
b 资源绑定类(Resource Bundle Class)
java.util.ResourceBundle类可以加载属性文件,并且读取其中资源。
说简单点,就是把对应不同的环境,输出不同的文字。这些文本信息我们都事先放入一个属性文件中,然后在程序中调用信息。到时候程序就会根据不同的语言环境,然后自动在属性文件中找到对应的文本输出。
Locale currentLocale = Locale.getDefault();
ResourceBundle bundle = ResourceBundle.getBundle("MyLabels",currentLocale);
获取本地语言设置,ResourceBundle.getBundle("MyLabels",currentLocale);绑定到指定的属性文件,然后以指定的本地语言属性来从中获取属性。这两个设置,一般可以使用静态来创建,这样一旦运行程序,就一次性初始化。
有了ResourceBundle的对象,就可以通过他来直接访问资源包中的文件内容。以后在输出一些特定信息的时候就写的更加灵活,使用资源包中的对象语言信息来输出。
例如:System.out.println(bundle.getString("title"));
这样程序会自动到资源包中,查找对应本地语言设置的title的对应信息。
下一个重点:资源包的使用
资源包重点的表现,还是属性文件properties。
MyLabels_zh_CN.properties是中文环境的资源包。MyLabels.properties是默认缺省的资源包,一般为英文。
将不同格式的文本文件转换为unicode编码。在jdk中提供了一个专门工具,用来对一些属性文件进行Unicode编码使用。使用方法:
native2ascii a.properties b.properties 这个native2asii和java javac差不多,都是在bin文件夹下面。这个工具还多有个选项,比如可以逆向编码。
关于properties资源包的路径,默认与class文件放在一起,直接可以使用资源包名来找到。如果放在相对的子目录里,可以使用 目录.文件名 的方式来使用。
资源绑定类 是资源包的另一种表现形式,和属性文件对应。每个资源绑定类对应一种不同的用户Locale。
实现资源绑定类最方便的是继承 java.util.ListResourceBundle类。
定义格式:
public clss 类名 extends ListResourceBundle{
public Object[][] getContents(){
return contents;
}
private static final Object[][] contents={{,},...}
}
资源绑定类使用方法:
资源绑定类,使用不再是properties文件,而是一些class文件。
编写一个类,继承ListResourceBundle。然后在其中定义相应的二维数组,类似properties中的定义。不过是放在一个二维数组中。类名的定义,也和资源包名是相同的。在需要使用国际化的时候,同样是和资源包一样,指定资源包的名字,没有任何变化。
消息的格式化:
过去使用 NumberFormat DateFormat等工具来格式化数字和时间。
消息的格式化使用 java.text.MessageFormat类专门是提供专门的消息格式化。
String msg = "{0},你好,您是{2}个人。当前时间为{1}";这个msg称为消息字符串,其中的特殊信息会根据输入、特定的locale来输出。
建立格式化:
Locale locale = Locale.getDefault();
MessageFormat mf = new MessageFormat(msg,locale);
Object[] msgArgs = {name,new Date(),125};
mf.format(msgArgs);//返回一个格式化后的语句。
所谓的消息格式化,就是将一些可能改变的文本,用占位符来代替。然后再传递参数来替换。
占位符的 类型和样式:实现细致的效果
占位符可以指定类型:
number(integer currency percent #.##)
Date(Short medrum Long Full 就是短 中 长 完整) Time(同日期) choice(选择格式,不常用)
在使用中的在花括号中使用{数字,<类型>,<样式>}
同样,可以将这种格式化消息字符串保存到一个资源包中。可以实现更加强大的功能。
阅读(730) | 评论(0) | 转发(0) |