一、资源文件
JSF的国际化(Internnationalization)讯息处理是基于Java对国际化的支持,您可以在一个讯息资源文件中统一管理讯息资源,资源文件的名称是.properties,而内容是名称与值的配对,例如:
messages.properties
titleText=JSF Demo hintText=Please input your name and password nameText=name passText=password commandText=Submit
资源文件名称由basename加上语言与地区来组成,例如:
basename.properties basename_en.properties basename_zh_cn.properties
由于讯息资源文件必须是ISO-8859-1编码,所以对于非西方语系的处理,必须先将之转换为Java Unicode Escape格式,使用JDK的工具程序native2ascii来转换(myeclipse有properties类型文件编辑器)。
messages_en.properties
globleTitleText = JSF Demo InputTip = Please input your name and password: NameTip = Name: PasswordTip = Password: CommandText = Submit chooseLanguageTip = Please Choose Your Language:
messages_zh_cn.properties
globleTitleText = JSF2.0\u793A\u4F8B InputTip = \u8BF7\u8F93\u5165\u7528\u6237\u540D\u548C\u5BC6\u7801 NameTip = \u7528\u6237\u540D PasswordTip = \u5BC6\u7801 CommandText = \u63D0\u4EA4 chooseLanguageTip =\u8BF7\u9009\u62E9\u60A8\u7684\u8BED\u8A00
接下来您可以使用<f:loadBundle>卷标来指定加载讯息资源,
<f:view>可以设定locale属性,直接指定所要使用的语系,例如:
<f:view locale="zh_cn"> <f:loadBundle basename="messages" var="msgs"/>
直接指定以上的话,则会使用繁体中文来显示,JSF会根据<f:loadBundle>的basename属性加上<f:view>的locale属性来决定要使用哪一个讯息资源文件,就上例而言,就是使用 messages_zh_cn.properties,如果设定为以下的话,就会使用messages_en.properties:
<f:view locale="en"> <f:loadBundle basename="messages" var="msgs"/>
您也可以在faces-config.xml中设定语系,例如:
<faces-config> <application> <local-config> <default-locale>en</default-locale> <supported-locale>zh_cn</supported-locale> </local-config> </application> ..... </faces-config>
在<local-config>一定有一个<default-locale>,而<supported-locale>可以有好几个,这告诉JSF您的应用程序支持哪些语系。当然,如果您可以提供一个选项让使用者选择自己的语系会是更好的方式,例如根据user这个Bean的locale属性来决定页面语系:
<f:view locale="#{user.locale}"> <f:loadBundle basename="messages" var="msgs"/>
二:例子-下拉列表改变页面中英文
(例子中使用的资源文件如上所示)
页面:index.jsp
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@page contentType="text/html;charset=gb18030"%> <f:view locale="#{user.local }"> <html> <head> <title><h:outputText value="#{msgs.globleTitleText}" /> </title> </head> <body> <f:loadBundle var="msgs" basename="messages" /> <br> <h:form> <h:outputText value="#{msgs.chooseLanguageTip}"></h:outputText> <h:selectOneMenu value="#{user.local}" onchange="this.form.submit();" valueChangeListener="#{user.changeLocale}"> <f:selectItem itemValue="zh_CN" itemLabel="Chinese" /> <f:selectItem itemValue="en" itemLabel="English" /> </h:selectOneMenu> <h3> <h:outputText value="#{msgs.InputTip }" /> </h3> <h:outputText value="#{user.errMsg}"></h:outputText> <br> <h:outputText value="#{msgs.NameTip }"></h:outputText> <h:inputText value="#{user.name}" /> <br> <h:outputText value="#{msgs.PasswordTip }" /> <h:inputSecret value="#{user.password }"></h:inputSecret> <br> <h:commandButton value="#{msgs.CommandText}" action="#{user.verify }" /> </h:form> </body> </html> </f:view>
UserBean.java
package wsz.ncepu; import javax.faces.event.ValueChangeEvent; public class UserBean { private String name; private String password; private String errMsg; private String local; public String getLocal() { return this.local; } public void setLocal(String local) { this.local = local; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public String getErrMsg() { return this.errMsg; } public void setErrMsg(String errMsg) { this.errMsg = errMsg; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } /** * 校验用户名和密码的方法。 */ public String verify() { System.out.println("name:" + name + ",password:" + password); if (name.equals("admin") && password.equals("123456")) { return "success"; } else { errMsg = "用户名或密码错误!"; return "failure"; } } public void changeLocale(ValueChangeEvent event) { if ("en".equals(local)) local = "zh_CN"; else local = "en"; } }
结果如下: