1 基本信息 摘要:跨语言的应用程序中,都会涉及到国际化的问题,本文详细介绍国际化的一般解决方案,并提供实例供参考。 作者:陈春 2 Java EE的国际化解决方案 当某个企业应用需要面对不同国家或地区的用户时,就必须考虑国际化问题。最终效果就是让不同国家的用户在界面上看到的文字内容是自己的语言,并且可以选择其他语言来显示。对于Java EE应用程序开发者来说,其主要工作包括提示信息国际化、编码国际化两个方面。详解如下: 2.1 提示信息国际化 这部分工作主要就是把程序中字符串常量提取到统一的资源信息文件中。针对不同的程序代码,又有不同的处理方式。 2.1.1 java code的处理 首先需提供一个公共国际化资源接口类,server启动时会根据具体环境加载不同的资源。假设国际化资源类为Message,接口为getString(String key),那么java code的形式变化如下: 原代码: String strLabel = “业务逻辑”; 新代码: String strLabel = Message.getString(“BIZ_NAME”); 资源文件(message_zh_CN.properties)内容: BIZ_NAME=业务逻辑 1、 jsp代码的处理 1) html部分 页面中表单的提示信息和表格标题等内容,一般都是直接写在html代码中。根据jsp规范,此时做国际化有两种途径。第一种是直接利用<%=%>调java表达式来输出国际化信息,第二种是通过自定义标签来输出。例如: 原代码:
- <table>
- <tr>
- <td>客户姓名
- </td>
- <td><input type=”text” name=”cust_name”>
- </td>
- </tr>
- </table>
第一种实现:
- <table>
- <tr>
- <td><%=WebPageMessage.getString(“CUST_NAME”)%>
- </td>
- <td><input type=”text” name=”cust_name”>
- </td>
- </tr>
- </table>
第二种实现:
- <table>
- <tr>
- <td><i18n:message key=”CUST_NAME”/>
- </td>
- <td><input type=”text” name=”cust_name”>
- </td>
- </tr>
- </table>
资源文件(message_zh_CN.properties)内容:
2) jsp tag部分 有时候,jsp tag的属性值也是和具体语言相关的字符串,此时需要该属性支持java expression。如不支持,可修改<rtexprvalue>false</rtexprvalue>为<rtexprvalue>true</rtexprvalue>。例如: 源代码: <dict:select businessType=”SEX” nullLabel=”未知”/> 新代码: <dict:select businessType=”SEX” nullLabel=”<%=WebPageMessage.getString(“NULL”)%>”/> 资源文件(message_zh_CN.properties)内容: NULL=未知 2、 js、css、image部分 对于这三种元素,需要根据不同的语言环境加载不同的资源文件。我们可以在jsp对应的目录下建立一个resources目录,然后在下面按地区语言名建立文件夹本别保存但前语言对应的js,css,image资源。为了实现此目的,可以把以前html的引用方式,改成jsp tag来引用原资源文件。例如: Html引用:
- <SCRIPT SRC="/resources/scripts/message.js" LANGUAGE="javascript"></SCRIPT>
- <LINK HREF="/resources /css/style.css" REL="stylesheet" TYPE="text/css"/>
- <IMG SRC="/resources/images/title.gif" WIDTH="300" HEIGHT="120" BORDER="0" ALT="title">
Jsp tag引用:
- <i18n:javascript src="/resources/scripts/message.js"/>
- <i18n:css href="/resources/css/style.css"/>
- <i18n:image src="/resources/images/title.gif" width="300" height="120" border="0" alt="title"/>
假如当前浏览器环境为zh_CN,那么上述tag生成的html代码如下:
- <script language=”javascript”>
- var Message= {
- getString: function(){ return eval("this." + arguments[0]);}
- };
- </script>
- <SCRIPT SRC="/resources/zh_CN/scripts/message.js" LANGUAGE="javascript"></SCRIPT>
- <LINK HREF="/resources/zh_CN/css/style.css" REL="stylesheet" TYPE="text/css"/>
- <IMG SRC="/resources/zh_CN/images/title.gif" WIDTH="300" HEIGHT="120" BORDER="0" ALT="title">
值得注意的是,对于js资源引用需要插入一段javascript代码,对应的国际化资源内容如下:
- Message.calendar_JANUARY="一月";
- Message.calendar_FEBRUARY="二月";
- Message.calendar_MARCH="三月";
- Message.calendar_APRIL="四月";
- Message.calendar_MAY="五月";
- Message.calendar_JUNE="六月";
- Message.calendar_JULY="七月";
- Message.calendar_AUGUST="八月";
- Message.calendar_SEPTEMBER="九月";
- Message.calendar_OCTOBER="十月";
- Message.calendar_NOVEMBER="十一月";
- Message.calendar_DECEMBER="十二月";
国际化时需作如下替换: 原代码: var mon1 = “一月”; 新代码: var mon1 = Message.getString(“ calendar_JANUARY”); 2.2 编码国际化 2.2.1 服务器配置 服务器端配置主要包括两方面,其一要指定环境语言,其二要指定字符集编码。 1、环境语言 一般服务器的JVM缺省语言和操作系统平台一致,但也可以为JVM指定特定的缺省语言。具体配置,例如: -Duser.language=zh -Duser.region=CN 3、 字符集编码 一般情况下,一种语言会对应一种或多种字符集编码。例如中文可以用 GB2312 编码来显示,日文可以用 Shift-JIS 编码来显示。一旦遇到客户端浏览器设置的是GB2312编码,而页面上有日文或韩文的内容,就不能正确显示了。假如采用UTF-8编码方式就不会出现这种情况了,因为UTF-8 编码几乎被所有的操作系统平台支持,并且包含了世界上绝大多数语言。 为统一编码,我们需要在JVM参数、浏览器请求、Web Server响应三个方面进行配置。具体如下: a. JVM参数 -Dfile.encoding=UTF-8,针对EOS还需指定-Dxml.encoding=UTF-8 b. 浏览器请求 如果Web Serve支持jsp2.4规范,我们可以直接在WEB-INF目录下的web.xml中指定编码方式。如:
- <jsp-config>
- <jsp-property-group>
- <url-pattern>*.jsp</url-pattern>
- <page-encoding>UTF-8</page-encoding>
- </jsp-property-group>
- </jsp-config>
设置完毕,还需检查jsp、html页面中的字符显示设置是不是UTF-8,或者直接把页面显示字符设置删除。例如:
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
c. Web Server响应 如果是jsp,则需指定<% request. setCharacterEncoding(“UTF-8”); %> 如果是servlet,则需调用 HttpServletRequest. setCharacterEncoding(“UTF-8”); 这两条语句均要在放在getParameterValue(),getParameterValues()语句之前。 2.2.2 文件编码 如果一个文件原编码是GBK,现要以UTF-8编码显示,我们会发现除了ASCII码之外的字符都是乱码。其原因是UTF-8仅仅和ASCII码兼容,除此之外同一字符的编码值并不相等。为解决这一问题,我们还需把Web应用涉及到的jsp、html、css、js等文本文件的格式转换成UTF-8编码。又由于windows操作系统识别UTF-8文件时,是靠该文件的头三个字节的内容判断的,而java虚拟机并不识别此文件头(BOM),故转换编码时一定不能包含BOM头。 |