JSF>国际化讯息 小强斋

一、资源文件

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";
 }

}

结果如下:


 

原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5637657.html