国际化,必须要有一组信息文件 (统称为一个资源包,这组文件具有共同 basename 基本名称)
struts-messages.properties
struts-messages_de.properties
struts-messages_pt.properties
具有共同基本名称struts-messages
资源文件命名规则basename_语言_国家.properties
例如 :messages_zh_CN.properties messages_en_US.properties
Java实现国际化原理,ResourceBundle 根据当前系统国家语言、指定国家区域 去读取不同 资源文件
properties文件不能直接写入中文 ,只能写unicode -------- 通过native2ascii命令 转换中文 为 unicode
struts2内部已经编写好了 读取国际化文件的代码,只需要配置信息文件
四种
1、 全局资源 对于 所有Action 都可以使用 ,该资源文件需要在struts.xml中进行配置
例如 :
在src创建messages_zh_CN.properties (这个文件方到哪里都行,不一定要放到src下,但是必须得在struts.xml中配置)
<constant name="struts.custom.i18n.resources"value="messages(基名)"></constant>
struts.custom.i18n.resources在default.xml文件中找到
在src/cn/itcast/action 创建messages_zh_CN.properties 按照如下配置
<constantname="struts.custom.i18n.resources"value="cn.itcast.action.messages"></constant>
ActionSupport类 提供 getText 用于读取国际化信息文件
国际化文件,支持动态消息文本,java底层MessageFormat
例:
publicclass MessageFormatTest {
public static void main(String[] args){
String pattern = "今天天气{0},微风{1}级";
// 动态消息文本,支持将参数传入 消息,替换占位符 {0} {1}
String msg =MessageFormat.format(pattern, "晴","2-3");
System.out.println(msg);
}
}
如果在配置文件中写上:username=用户名必须在{0}到{1}位
那么可以这样获取this.getText("username",new String[] { "6", "12" }))这样就变成6到12位了。
2、 Action范围资源文件, 该文件配置信息,只能某个Action内部使用 (无需配置)
在Action所在目录 : Action类名_语言_国家.properties
3、 Package范围资源文件, 在Action所在包 及其 父包, 创建包范围信息文件 (无需配置)
文件名 : package_语言_国家.properties
4、 临时信息文件,在JSP中使用
<s:i18nname="cn.itcast.action.package">
<s:textname="city"></s:text>
</s:i18n>
如果不使用 <s:i18n> 默认读取 全局信息文件的内容