在JSP中实现国际化

时间:2023-01-18 19:55:40

工作中有个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也有相应的标签。
 
 
相关资料以及更详细的信息可以阅读以下三个链接:
 
最后附上一个简单的代码实例
 
<%@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>