在JSP中实现国际化

来源:互联网 发布:网络拓扑是指 编辑:程序博客网 时间:2024/05/22 17:38

工作中有个Java Web项目需要将英文版翻译出中文版,其中主要使用了大量的JSP页面进行显示,所以遇到JSP的国际化的问题,我今天做了一些调研,已经通过技术分析并形成方案,现总结如下:

对于JSP 应用程序,至少有两种处理不同语言的显示问题的普遍接受方法可以使用:

(1) 存储多组 JSP,每组 JSP 都用不同的语言编码,然后根据用户的地区选择在这些 JSP 之间切换。
(2) 分离所有使用的字符串,代之以从资源绑定获得一个特定于地区的字符串。(这种方式使用了 J2SE 特定于地区的资源绑定处理方式。)
 
 对于第(1)种方式,主要适用于JSP变化不是很频繁的项目,优点是可以根据不同的风俗高度定制本地化界面。但是当项目比较大或者JSP变化频繁时,会造成很大的维护负担。所以我这里调研测试了第(2)种方式。
第(2)种方式使用JSTL 国际化辅助标签库(fmt)。
 
 
fmt标签库原理说明:
fmt库中的定制标记支持通过资源束对文本内容进行本地化,并支持对数字和日期的显示和解析。这些标记利用在java.util和java.text包中实现的Java 语言的国际化API。
将JSP文件中的字符串信息提取出来,放置到properties文件中。我们可以为不同语言环境定义不同的属性文件,如welcome.properties(英语/默认)、welcome_zh_CN.properties(简体中文)等。
HTTP 协议通过Accept-Language请求头将本地化信息从浏览器传递至服务器。Servlet 规范通过javax.servlet.ServletRequest类的getLocale()和getLocales()方法自动地利用HTTP 协议的这一功能。JSTL fmt库中的定制标记又会利用这些方法来自动地确定用户的语言环境,从而相应地调整它们的输出。另外,我们也可以显式的定义页面的语言环境。
 
 
fmt使用的要点说明:
(a) 引入fmt库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
(b) 设置语言环境:<fmt:setLocale value="zh_CN" scope="application" /> 。默认使用浏览器的语言环境,我们可以通过显式设置供用户手动切换语言环境
(c) 绑定资源文件:<fmt:bundle basename="resources.welcome"> 。注意:资源文件一定要放置在WEB-INF/classes目录下
(d) 从资源文件中获取指定key的信息:<fmt:message key="gobs"/>
有了以上4步,基本上可以满足JSP的语言上国际化的需求,如果需要对日期数字货币等进行国际化处理,fmt也有相应的标签。
 
 
相关资料以及更详细的信息可以阅读以下三个链接:
http://www.ibm.com/developerworks/cn/java/j-jspapp/index.html
http://www.ibm.com/developerworks/cn/java/j-jstl0415/index.html
http://blog.csdn.net/alanzyy/article/details/8598507
 
最后附上一个简单的代码实例
 
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %><%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html>    <%  String varLocal = request.getParameter("varLocal");        if (varLocal == null || varLocal.equals("")) {        } else if ("cn".equalsIgnoreCase(varLocal)) {%>        <fmt:setLocale value="zh_CN" scope="application" />    <%    } else {%>    <fmt:setLocale value="en_US" scope="application" />    <%        }%>    <fmt:bundle basename="resources.welcome">        <head>            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">            <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">              <style type="text/css">                 body {                     margin-left: 5px;                     margin-right: 5px;                 }                .just { text-align: justify; }                .summ { font-size : 100%; text-indent : 0;                        margin-left : 2%; margin-right : 2%;                        padding : 0.1em 0.1em 0.1em 0.1em;}                .minitoc { width: auto; }                body { font-family: Cambria, Georgia, Palatino Linotype; }                th, td { vertical-align: center; }                table {                    padding-top:10px;                    padding-bottom:10px;                    padding-right:10px;                    padding-left:10px;                }                img {                     vertical-align: bottom;                 }             </style>            <title><fmt:message key="title"/></title>            <script type="text/javascript">                function updateOrientation() {                    var orientation=window.orientation;                    switch(orientation)                    {                        case 0:                            break;                          case 90:                            break;                        case -90:                               break;                    }                }                function setLocalEn(){                    window.location = "index.jsp?varLocal=en";                }                function setLocalCN(){                    window.location = "index.jsp?varLocal=cn";                }            </script>        </head>        <body onorientationchange="updateOrientation();">            <div align='right'>                <input type="button" value="English" onclick="setLocalEn();"/>                <input type="button" value="简体中文" onclick="setLocalCN();"/>            </div>        <center>            <Span style="font-size:32px"><b><fmt:message key="title"/></b></span>            <br><Span style="font-size:16px"><b><fmt:message key="description"/></b></span>            <br>            <form action="login.jsp" method="get">                <table border="0">                    <tr>                        <td align="right"><fmt:message key="userName"/>:</td><td><input type="text" name="username" style="width:180px; height:28px; font-size:15px" /></td>                    </tr>                    <tr>                        <td align="right"><fmt:message key="password"/>:</td><td><input type="password" name="password" style="width:180px; height:28px; font-size:15px" /></td>                    </tr>                    <tr>                        <td align="right"> </td><td align="center"><input type="submit" value="<fmt:message key="login"/>" style="width:180px; height:40px; font-size:15px" /></td>                    </tr>                </table>            </form>            <hr width ="300"/>            <table border="0">                <tr><td>                        <input type="submit" name="tryit" value="<fmt:message key="try"/>" onclick="location.href='tryit.jsp'" style="width:110px; height:40px; font-size:15px">                    </td><td>                                                    </td><td>                        <input type="submit" name="signup" value="<fmt:message key="sign_up"/>" onclick="location.href='signup.jsp'" style="width:110px; height:40px; font-size:15px">                    </td></tr>            </table>        </center>    </body></fmt:bundle></html>


原创粉丝点击