1、Struts2的国际化建立在Java国际化的基础之上。
2、通过配置struts.custom.i18n.resources常量来加载全局国际化资源文件,该常量值为全局国际化资源文件的baseName。
3、Struts2访问国际化消息主要有如下三种方式:
·为了在JSP页面中输出国际化消息,可以使用Struts2的<s:text.../>标签,该标签可以指定一个name属性,该属性指定了国际化文件中的key。
·为了在Action中访问国际化消息,可以使用ActionSupport类中的getText方法,该方法可以接受一个name参数,该参数指定了国际化资源的key。
·为了在表单中的Label元素中输出国际化消息,可以为该表单标标签指定一个key属性,该key指定了国际化资源文件中的key。
4、国际化资源文件应该放在Web应用的类加载路径下,即WEB-INF/classes路径下。
5、通常,国际化资源文件以key-value的形式存储,例如,文件:mess_en_US.properties的内容如下:
loginPage=Login Page
errorPage=Error Page
...
文件:mess_zh_CN.properties的内容如下:
loginPage=登录页面
errorPage=错误页面
succPage=成功页面
...
6、加载国际化资源后,当用户访问页面时,系统会根据用户所在的Locale来加载对应的语言资源文件。
7、Struts2中提供了两种方式来填充消息字符串中的占位符:
·如果需要在JSP页面中填充国际化消息中的占位符,则可以通过在<s:text .../>标签中使用多个<s:param .../>标签来填充消息中的占位符。
<s:text name=”welcomeMsg”>
<s:param><s:property value=”username”/></s:param>
<s:param>${d}</s:param>
</s:text>
·如果需要在Action中填充国际化消息里的占位符,则可以通过调用getText方法时使用getText(String aTextName, List args)或getText(String key, String[] args)方法来填充占位符。该方法的第二个参数既可以是一个字符串数组,也可以是一个字符串组成的List对象,从而完成占位符的填充。
public String execute() throws Exception {
ActionContext ctx = ActionContext.getContext();
...
ctx.put(“tip”,
getText(“succTip”,
new String[] {getUsername()}));
}
8、Struts2提供了一种对占位符的替换方式,这种方式直接允许国际化消息中使用表达式,这种方式可以避免在使用国际化消息时需要为占位符传入参数值。
failTip = ${username}, Sorry you can’t log in!
succTip = ${username}, welcome, you have logged in!
welcomeMsg = ${username}, Hello now is {0}
9、Struts加载国际化资源文件的方式:
·包范围资源文件:Struts2允许针对不同模块、不同Action来组织国际化资源文件,在包路径下建立名为:package_language_country.properties的国际化资源文件后,应用中处于该包下的所有Action都可以访问该资源文件。
·Action范围资源文件:Struts2允许为Action单独指定一份国际化资源文件。在Action所在路径建立名为:ActionName_language_country.properties的文件后,此资源文件只能由该Action访问。
·临时指定资源文件:可以在JSP页面中输出国际化消息时临时指定国际化资源的位置。在这种方式下,需要借助Struts2的另外一个标签:<s:i18n .../>。如果把<s:i18n .../>标签作为<s:text .../>的父标签,则<s:text .../>标签将会直接加载<s:i18n .../>标签里指定的国际化资源文件;如果把<s:i18n .../>标签当成表单标签的父标签,则表单标签的key属性将会从国际化资源文件中加载该信息。
10、Struts2加载资源文件的顺序:
·Action访问:
① 优先加载系统中保存在Action类文件相同位置,且baseName为ActionName的系列资源文件。
② 如果①中找不到key对应的信息,且当前Action有父类ParentAction,则在系统中查找保存在ParentAction类文件相同位置,且baseName为ParentAction的系列资源文件。
③ 如果在②中找不到key对应的信息,且当前Action有实现接口IAction,则加载系统中保存在IAction的类文件相同位置,且baseName为IAction的系列资源文件。
④ 如果在③中找不到key对应的信息,且当前Action有实现接口ModelDriven,则对于getModel()方法返回的model对象,执行第①步操作。
⑤ 如果在④中找不到key对应的信息,则查找当前包下baseName为package的系列资源文件。
⑥ 如果在⑤中找不到key对应的信息,则沿着当前包上溯,直到最顶层包来查找指定baseName为package的系列资源文件。
⑦ 如果在⑥中找不到key对应的消息,则查找struts.custom.i18n.resources常量指定的baseName的系列资源文件。
⑧ 如果经过上面的步骤一直找不到该key对应的信息,则直接输出key的字符串值;如果上面的①~⑦的任一步中,找到了指定key的信息,系统停止搜索,直接输出key对应的消息。
·JSP访问:
1) 对于使用<s:i18n .../>标签作为父标签的情况:
① 从<s:i18n .../>标签指定的国际化资源文件中加载指定key对应的消息。
② 如果在①中找不到指定key对应的信息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
③ 如果经过上面的步骤找不到key对应的信息,则直接输出key对应的字符串值。
2) 对于未使用<s:i18n .../>标签的情况:
直接加载struts.custom.i18n.resources常量指定的资源文件。如果找不到key对应的消息,直接输出该key的字符串值。