java国际化
资源包
格式:<包名>_<语言代码>_<国家/地区代码>属性文件
<包名>_<语言代码>
纯文本文件,保存字符串的键-值对信息,每行一条,
使用ResourceBundle加载获取资源,这是一个抽象类,
提供了绑定资源的静态方法。
资源绑定类
继承抽象类ListResourceBundle
public class Text_ja_JP extends ListResourceBundle{
String[][] str = new String[][]{
{"name","小明"}
};
@Override
//重写getContents方法返回一个二维数组
protected Object[][] getContents() {
return str;
}
}
查找规则
查找包含语言和地区的资源包,如果没有找到就找包含语言的资源包,
再没有找到就直接用默认资源包,如果默认资源包不存在就报错,
默认是在类路径下查找,如果包含在包里,指定资源包名时要加包名。
消息格式化
使用MessageFormate进行消息格式化,指定一个消息模式,"{0}~{9}"进行标识作为占位符,占位符出现的顺序,和次数不限制,
public class TextI18N {
public static void main(String[] args) {
Locale defaultlocale = Locale.getDefault();
ResourceBundle bundle = ResourceBundle.getBundle("Text");
String format = bundle.getString("format");
//format="{0} is a {1}";
MessageFormat mf = new MessageFormat(format,defaultlocale);
Object[] obj = {"xiaoming","student"};
String str = mf.format(obj);
System.out.println(str);
//xiaoming is a student
}
}
占位符样式{index,type,style},
Struts2国际化
资源文件的加载
这里和Java国际化不同的是sturts2会自动寻找国际化资源文件
Action范围的资源文件,资源文件名是Action类名,当然资源包和类是在同一路径下的。
这里也是先查找 _语言_地区 后 _语言 最后 直接加载没有地区和语言的资源包
然后是包范围的,注意包范围的资源文件,
资源包名就是package,是在包的根路径下,就是包的.class文件路径
没有再是使用默认设置的资源包。
在红色地方是sturts2配置的一些默认的常量,可以找到配置国际化资源的全局常量,
<constant name="struts.custom.i18n.resources" value=""></constant>
jsp中访问国际化资源文件
<s:i18n/>标签
用于指定是哪个资源文件
<s:text/>标签
可以单独使用,用param标签指定资源文件中的占位符,这里单独使用
访问的资源文件和是否是直接访问的jsp页面还是通过action跳转的有关
注意标签里面的value属性会进行ognl解析,要传String要用''括起来
<s:textfield key=""/>
这里的key访问的资源文件和是否是直接访问的jsp页面还是通过action跳转的有关,
label属性是将标签写死的,但可以进行强制Ognl解析,进行国际化
通过action跳转到jsp页面的<s:text/>标签访问的资源文件和Action一样,
单独访问jsp页面的<s:text>标签访问的是全局的资源文件
jsp中消息格式化
使用<s:param/>标签传入参数替换占位符
Action中访问国际化资源文件
使用getText()函数读取,可以接参数
Action中消息格式化
getText()方法可以传入一个数组类型的参数替换占位符
在国际化资源文件中访问本地化消息
age = 20
name = xiaoming
msg = ${getText("name")} is ${getText("age")} and ${msg}
后面的${msg}是从值栈中去值进行匹配
设置默认的资源文件包
配置常量struts.custom.i18n.resources