Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42377
  • 博文数量: 20
  • 博客积分: 850
  • 博客等级: 准尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-05 22:14
文章分类

全部博文(20)

文章存档

2011年(1)

2009年(12)

2008年(7)

我的朋友

分类: Java

2009-03-24 18:42:05

国际化 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) |
给主人留下些什么吧!~~