工作中有个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>