1. java的国际化
Java国际化主要靠三个类实现:
java.util.ResourceBundle加载资源包,
java.util.Local语言环境
java.text.MessageFormat格式化消息
资源文件的三种形式:
baseName_language_contry.properties,
baseName_language.properties,
baseName.properties其中baseName表示资源文件的基本名
Locale local=Locale.getDefault();//获得Locale对象,默认当前国际和语言
ResourceBundle bundle=ResourceBundle.getBundle("test/message",locale);//根据当前环境加载资源文件
System.out.println(bundle.getString("hello"));//在message_zh_CN.properties中找,找不到在message_zh.properties中找,找不到在message.properties中找,再找不到就报错误
如果在资源文件中带了占位符,例如:msg={0},你好,今天是{1}
那么就要使用MessageFormat了,这个类里有个format(String pattern,Object … values)方法
还有一种方式是以实现了ListResourceBundle的类为资源文件,例如baseName_zh_CN.class,这种方式这里不介绍
2. jsp的国际化实现
参考:http://blog.csdn.net/sqs201/article/details/7204244
3. struts2的国际化
a) 全局范围
配置常量struts.custom.i18n.resources=baseName国际化资源文件的位置,那么在任何地方都可以使用资源文件中的内容,在页面上可使用<s:text name=”msg” ><s:param ...></s:text> 在action中使用getText(msg,newString[]{…})
在struts2中资源文件中可以使用ognl表达式作为占位符,例如welcome_msg=${username},welcome you!,但是这种占位符功能有限,也只能直接取action中的属性的值
b) 包范围
在action所在包的路径下定义资源文件,package_language_country.properties 那么该包下所有的action可使用,这里记住一定是”package”字符串,而不是com.other.xxx.propertis,package_xx_xx.properties和action并行存放
c) Actioin范围
在action的java文件所在的路径下存放ActionClassName_language_country.properties,则只有类名为ActionClassName的action和转发到的页面可以使用.
d) 临时
把<s:i18n ..> 作为<s:text..>的父标签, 在s:i18n中指定资源文件,那么也只有在这个标签里可以使用
如果在UserAction中使用国际化,查找key的顺序如下:
UserAction.properties->UserAction的父接口.properties->package.properties->全局
如果在UserAction转发到的页面上使用国际化,那么顺序就是:临时->类范围->包范围->全局