国际化

来源:互联网 发布:ksvd算法 Bpfa 编辑:程序博客网 时间:2024/04/30 15:12

主要内容:java中的,struts中的,ActionMessage对象相关,jstl的国际化

什么是I18N问题?

在英文中, 国际化(Internationalization)被缩写为I18N, 即只取首尾两个字母, 中间字母为18个 
问题在哪里?
页面字符串硬编码
异常消息的硬编码

提示信息的硬编码


国际化支持的原理:把东西都放在不同的配置文件中,根据Locale对象来得到资源文件的信息.
有几个对象:

Locale对象,代表本地化,Locale决定于操作系统的环境!

ResourceBundle类可以得到资源文件,即这个类的对象实际上就对应一个资源文件

国际化资源文件构成:前面的基本名+Locale信息,必须要包含Locale信息,把它放在classpath能搜索到的地方

Java如何支持I18N?

我们需要将硬编码文本转移到外部的资源文件
编写MessagesBundle.properties
编写MessagesBundle_zh_CN.properties
编写MessagesBundle_en_US.properties
编写I18NSample.java
运行I18NSample.java
乱码?
因为资源文件必须是Latin-1或Unicode编码(如\udddd)的字符
使用native2ascii工具,将中文资源文件进行转换但是要注意要在中文环境下转才不会出错的.此命令可以单个词单个词进行转,也可以批量进行转,批量转的方法,在命令行下进入资源文件所在目录,然后用那个native2ascii.exe命令进行转,它后面可以带两个参数,一个是需要转的源,一个是转的目标.如
native2ascii.exe o.properties MessageBundle_zh_CN.properties

Java支持I18N的编码过程总结:

1、创建属性文件(可能要用native2ascii工具转换)
2、定义Locale对象
3、创建一个ResourceBundle对象
ResourceBundle对象用于分离跟本地相关的数据
如果找不到相应语言或国家代码的属性文件,将使用默认的属性文件(即没有标识语言和国家代码的属性文件:MessagesBundle.properties)
其创建方式如下:
message = ResourceBundle.getBundle("MessagesBundle", currentLocale); 
第一个参数,表示要从哪些资源属性文件中(MessagesBundle_XX.properties)获取数据
第二个参数,是一个Locale对象,表示要选择哪个资源属性文件
4、从ResourceBundle对象中获取数据

如何加载动态的信息:

如你好,XXX!动态的东西用{n}的方式,如:k1=hello,{0}...,从0开始排,就如pstmt设置的一样.填充点位符有一个类:java.text.MessageFormat,它填充的时候是按照key数组的方式来填充的,运行时它就能动态的传进去.用法如下:

MessageFormat mf=new MessageFormat(rb.getString("k1"));
System.out.println(mf.format(new Object[]{"张三"}));

国际化资源文件相关:一般会提供一个缺省的国际化资源文件,那么它会按照这样去找,找Locale所对应的,如果没有就找跟操作系统一样所对应的,如果此时没有找到与操作系统所对应的那个资源文件那么就找缺省的.如果缺省的也没找到就会抛出异常的
注意:如果资源文件不是放在要目录上,那么要加上包名.

缺省的国际化资源文件是只有basename的
国际化虽然麻烦,但是有时也是有用处的:如你在页面中不想写死东西,而提供可配置的东西时就可以用.

原创粉丝点击