国际化的问题有多种实现方法,由于项目需要,最近研究了下,不敢独享。
以下是步骤
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" οnclick="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里面都做了处理了。
至于标签如何定义,如何传参数,由于篇幅原因,我将在下一篇文章中做详细的介绍。