`
acen.chen
  • 浏览: 154729 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jsf spring 国际化(包含特殊字符转义)

阅读更多

国际化的问题有多种实现方法,由于项目需要,最近研究了下,不敢独享。

以下是步骤
1.建立资源bundle文件(以下文件必须建立在src目录下,我放在com.talgroup.international.quotation包下面)

首先建立 UIResources_en_US.txt   

Index=Index:
UserCode=User Code:
UserRole=User Role:
Password=Password:
UserGroup=User Group:
Login=Login
Test=?,<>.;:'"{}()#$%&*@ !^/

UIResources_zh_CN.txt

Index=序列号:
UserCode=用户名:
UserRole=用户角色:
Password=密码:
UserGroup=用户组:
Login=登陆
Test=?,<>.;:'"{}()无悔一腔血 有意济苍生#$%&*@ !^/

然后建立 转码程序

native2ascii(en-us).bat

native2ascii -encoding TIS-620 UIResources_en_US.txt > UIResources_en_US.properties

native2ascii(zh-cn).bat

native2ascii -encoding gb2312 UIResources_zh_CN.txt > UIResources_zh_CN.properties

最后 运行两个批处理程序,产生两个properties文件

 

2.spring 的application-context.xml文件中配置资源bundle文件

<bean id="messageSource"
  class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename">
   <value>com.talgroup.international.quotation.UIResources</value>
  </property>
 </bean>

 

3.建立后台bean

package com.talgroup.web.quotation.ui;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.web.util.JavaScriptUtils;
import org.springframework.web.util.HtmlUtils;
public class InternationalBean {

 private static String lan="en_US";
    private static String jsStr=null;
    private static String htmlStr=null;
//    ApplicationContext context= new FileSystemXmlApplicationContext("/WEB-INF/resource-config.xml");
    private static org.springframework.context.support.ResourceBundleMessageSource context = (org.springframework.context.support.ResourceBundleMessageSource)com.talgroup.app.frmwork.Context.getBean("messageSource");
   
   
 public String getLan() {
  return lan;
 }

 public void setLan(String lan) {
  this.lan = lan;
 }
 
 public String zh_CN_Action()
 {
  this.setLan("zh_CN");
  return null;
 }
 
 public String zh_HK_Action()
 {
  this.setLan("zh_HK");
  return null;
 }
 
 public String en_US_Action()
 {
  this.setLan("en_US");
  return null;
 }
 
 public static Locale mapStrToLocale(String lan)
 {
  if(lan.equals("zh_CN")) return Locale.CHINA;
  if(lan.equals("en_US")) return Locale.US;

  return Locale.US;
 }
 
 public static String JavaScriptEscape(String arg)
 {
  String str = context.getMessage(arg, null, mapStrToLocale(lan));
  jsStr = JavaScriptUtils.javaScriptEscape(str);
  return jsStr;
 }
 
 public static String HtmlEscape(String arg)
 {
  String str = context.getMessage(arg, null, mapStrToLocale(lan));
  //htmlStr = HtmlUtils.htmlEscape(str);
  return str;
 }

}

4.jsf的face-config.xml中注册管理bean,session级别

<managed-bean>
  <managed-bean-name>internationalBean</managed-bean-name>
  <managed-bean-class>
   com.talgroup.web.quotation.ui.InternationalBean
  </managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>

5.页面表现层

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:z="http://www.qualcomm.com/jsf/core"
 xmlns:c="http://java.sun.com/jstl/core"
 xmlns:fn="http://java.sun.com/jsp/jstl/functions"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:rich="http://richfaces.org/rich"
 xmlns:talui="http://www.talgroup.com/tags"
 xmlns:quot="http://www.talgroup.com/quotation/tags"
 xmlns:js="http://www.talgroup.com/quotation/tags"
 xmlns:html="http://www.talgroup.com/quotation/tags">
 <head>
  <meta http-equiv="PRAGMA" content="no-cache" />
 </head>
 <body>
   <div id="wrapper" align="center">
    <h:form>
     <div style="width: 620" align="right">
      <h:panelGrid columns="8">
       <h:commandLink value="chinese"
        style="color:black;font-family:Courier;font-size:10pt;width:120"
        action="#{internationalBean.zh_CN_Action}">
       </h:commandLink>/
       <h:commandLink value="chinese-hk"
        style="color:black;font-family:Courier;font-size:10pt;width:120"
        action="#{internationalBean.zh_HK_Action}">
       </h:commandLink>/
             <h:commandLink value="english"
        style="color:black;font-family:Courier;font-size:10pt;width:120"
        action="#{internationalBean.en_US_Action}">
       </h:commandLink>

       <h:outputLink id="link1" value="http://www.yourcompany.com">
        <h:outputText value="Perferences"
         style="color:black;font-family:Courier;font-size:10pt;width:120" />
       </h:outputLink>
       <h:outputLink id="link2" value="http://www.yourcompany.com">
        <h:outputText value="Help"
         style="color:black;font-family:Courier;font-size:10pt;width:60" />
       </h:outputLink>
       <h:outputLink id="link3" value="http://www.yourcompany.com">
        <h:outputText value="Contect us"
         style="color:black;font-family:Courier;font-size:10pt;width:100" />
       </h:outputLink>
      </h:panelGrid>
     </div>
    </h:form>
    <h1 id="brandBar">
     #{loginBeanWithRoleAndGroup.title}
    </h1>

    <h:form id="loginForm">
     <h:messages layout="table" errorStyle="color: red"></h:messages>
     <h:panelGrid columns="5" width="700">
      <h:panelGroup>
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 180px"
        value="#{html:HtmlEscape('Index')}" />
      </h:panelGroup>
      <h:panelGroup>
       <h:selectOneMenu id="appCode"
        value="#{loginBeanWithRoleAndGroup.appCode}" required="true"
        style="width: 140px">
        <f:selectItems value="#{loginBeanWithRoleAndGroup.applications}" />
        <a4j:support event="onchange" reRender="loginForm_userCode"
         ajaxSingle="true"
         action="#{loginBeanWithRoleAndGroup.lookUpUserByApplication}" />
       </h:selectOneMenu>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value="" style="width: 50px"></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 180px"
        value="#{html:HtmlEscape('UserCode')}" />
      </h:panelGroup>
      <h:panelGroup id="loginForm_userCode">
       <h:selectOneMenu id="userCode"
        value="#{loginBeanWithRoleAndGroup.userCode}" required="true"
        style="width: 140px">
        <c:if test="${!empty loginBeanWithRoleAndGroup.users}">
         <f:selectItems value="#{loginBeanWithRoleAndGroup.users}" />
        </c:if>
        <a4j:support event="onchange"
         reRender="loginForm_userRole,loginForm_userGroup"
         ajaxSingle="true"
         action="#{loginBeanWithRoleAndGroup.lookUpUserRoleAndGroup}" />
       </h:selectOneMenu>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup style="width: 167px">
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 155px"
        value="#{html:HtmlEscape('UserRole')}" />
      </h:panelGroup>
      <h:panelGroup id="loginForm_userRole">
       <h:selectOneMenu value="#{loginBeanWithRoleAndGroup.userRole}"
        required="true" style="width: 140px">
        <c:if test="${!empty loginBeanWithRoleAndGroup.roles}">
         <f:selectItems id="fddd"
          value="#{loginBeanWithRoleAndGroup.roles}" />
        </c:if>
       </h:selectOneMenu>
      </h:panelGroup>
      <h:panelGroup>

       <h:outputText
        style="color:Black;font-family:Courier;font-size:10pt;width: 180px"
        value="#{html:HtmlEscape('Password')}" />
      </h:panelGroup>
      <h:panelGroup>
       <h:inputSecret id="password"
        value="#{loginBeanWithRoleAndGroup.password}" required="true"
        requiredMessage="Password can not be empty" style="width: 125px" />

      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 155px"
        value="#{html:HtmlEscape('UserGroup')}" />
      </h:panelGroup>
      <h:panelGroup id="loginForm_userGroup">
       <h:selectOneMenu value="#{loginBeanWithRoleAndGroup.userGroup}"
        required="false" style="width: 140px">
        <c:if test="${!empty loginBeanWithRoleAndGroup.groups}">
         <f:selectItems id="dsd"
          value="#{loginBeanWithRoleAndGroup.groups}" />
        </c:if>
       </h:selectOneMenu>
      </h:panelGroup>
      <f:verbatim></f:verbatim>
      <h:outputText style="width:170px" value="" />
      <h:outputText style="width:170px" value="" />
      <h:outputText style="width:170px" value="" />
      <h:outputText style="width:170px" value="" />
      <h:panelGroup>
       <h:inputText style="width:0px;visibility:hidden" id="dsdasdsa"
        value="if you remove, you will get error" />
       <h:commandButton style="width:130px;" value="#{html:HtmlEscape('Login')}"
        action="#{loginBeanWithRoleAndGroup.loginAction}"></h:commandButton>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText style="width:170px" value="" />
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText style="width:170px" value="" />
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText style="width:170px" value="" />
      </h:panelGroup>
     </h:panelGrid>
     <h:panelGrid columns="1" width="150">
      <h:panelGroup style="height: 20px;">
       <f:verbatim>
        <DIV id="dynamicParameters" style="visibility: hidden;">
        </DIV>
       </f:verbatim>
      </h:panelGroup>
     </h:panelGrid>

    </h:form>
   </div>
   <br>
   alert test---
  <input type="button" value="click" onclick="alert('#{js:JavaScriptEscape('Test')}')"/>
  </br>
  <br>
   html test---
  <h:outputText style="width:170px" value="#{html:HtmlEscape('Test')}"/>
  </br>
  <h:outputText style="width:170px" value="#{html:HtmlEscape('Test')}"/>
 </body>
</html>

 

ps:

xmlns:js="http://www.talgroup.com/quotation/tags" 和xmlns:html="http://www.talgroup.com/quotation/tags">


是我自定义的两个标签,它主要是用来接受页面传过来的键值(例如:Index,UserCode。。。)将它传到后台bean(InternationalBean)中,然后根据这个键值去资源文件中查找相应的message值,最后返回到页面显示,当然这里面涉及到特殊字符转义的问题,这在bean里面都做了处理了。

 

至于标签如何定义,如何传参数,由于篇幅原因,我将在下一篇文章中做详细的介绍。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics