java

位置:IT落伍者 >> java >> 浏览文章

Java EE的国际化解决方案


发布日期:2019年10月28日
 
Java EE的国际化解决方案

当某个企业应用需要面对不同国家或地区的用户时就必须考虑国际化问题最终效果就是让不同国家的用户在界面上看到的文字内容是自己的语言并且可以选择其他语言来显示对于Java EE应用程序开发者来说其主要工作包括提示信息国际化编码国际化两个方面

提示信息国际化

这部分工作主要就是把程序中字符串常量提取到统一的资源信息文件中针对不同的程序代码又有不同的处理方式

java code的处理

首先需提供一个公共国际化资源接口类server启动时会根据具体环境加载不同的资源假设国际化资源类为Message接口为getString(String key)那么java code的形式变化如下

原代码

String strLabel = 业务逻辑

新代码

String strLabel = MessagegetString(BIZ_NAME资源文件(message_zh_CNproperties)内容BIZ_NAME=业务逻辑

)jsp代码的处理

)html部分

页面中表单的提示信息和表格标题等内容一般都是直接写在html代码中根据jsp规范此时做国际化有两种途径第一种是直接利用<%=%>调java表达式来输出国际化信息第二种是通过自定义标签来输出例如

原代码

<table>

<tr>

<td>客户姓名

</td>

<td><input type=text name=cust_name>

</td>

</tr>

</table>

第一种实现

<table>

<tr>

<td><%=WebPageMessagegetString(CUST_NAME)%>

</td>

<td><input type=text name=cust_name>

</td>

</tr>

</table>

第二种实现

<table>

<tr>

<td><in:message key=CUST_NAME/>

</td>

<td><input type=text name=cust_name>

</td>

</tr>

</table>

资源文件(message_zh_CNproperties)内容

CUST_NAME=客户姓名

)jsp tag部分

有时候jsp tag的属性值也是和具体语言相关的字符串此时需要该属性支持java expression如不支持可修改<rtexprvalue>false</rtexprvalue>为<rtexprvalue>true</rtexprvalue>例如

原代码

<dictselect businessType=SEX nullLabel=未知/>

新代码

<dictselect businessType=SEX nullLabel=<%=WebPageMessagegetString(NULL)%>/>资源文件(message_zh_CNproperties)内容NULL=未知

)jscssimage部分

对于这三种元素需要根据不同的语言环境加载不同的资源文件我们可以在jsp对应的目录下建立一个resources目录然后在下面按地区语言名建立文件夹本分别保存前语言对应的jscssimage资源为了实现此目的可以把以前html的引用方式改成jsp tag来引用原资源文件例如

Html引用

<SCRIPT SRC=/resources/scripts/messagejs LANGUAGE=javascript></SCRIPT> <LINK HREF=/resources /css/stylecss REL=stylesheet TYPE=text/css/> <IMG SRC=/resources/images/titlegif WIDTH= HEIGHT= BORDER= ALT=title>

Jsp tag引用

<injavascript src=/resources/scripts/messagejs/> <incss /> <inimage src=/resources/images/titlegif width= height= border= alt=title/>

假如当前浏览器环境为zh_CN那么上述tag生成的html代码如下

<script language=javascript> var Message= { getString function(){ return eval(this + arguments[])} } </script> <SCRIPT SRC=/resources/zh_CN/scripts/messagejs LANGUAGE=javascript></SCRIPT> <LINK HREF=/resources/zh_CN/css/stylecss REL=stylesheet TYPE=text/css/> <IMG SRC=/resources/zh_CN/images/titlegif WIDTH= HEIGHT= BORDER= ALT=title>

值得注意的是对于js资源引用需要插入一段javascript代码对应的国际化资源内容如下

Messagecalendar_JANUARY=一月 Messagecalendar_FEBRUARY=二月 Messagecalendar_MARCH=三月 Messagecalendar_APRIL=四月 Messagecalendar_MAY=五月 Messagecalendar_JUNE=六月 Messagecalendar_JULY=七月 Messagecalendar_AUGUST=八月 Messagecalendar_SEPTEMBER=九月 Messagecalendar_OCTOBER=十月 Messagecalendar_NOVEMBER=十一月 Messagecalendar_DECEMBER=十二月

国际化时需作如下替换

原代码

var mon = 一月

新代码

var mon = MessagegetString( calendar_JANUARY

编码国际化

服务器配置

服务器端配置主要包括两方面其一要指定环境语言其二要指定字符集编码

环境语言

一般服务器的JVM缺省语言和操作系统平台一致但也可以为JVM指定特定的缺省语言具体配置例如Duserlanguage=zh Duserregion=CN

字符集编码

一般情况下一种语言会对应一种或多种字符集编码例如中文可以用GB编码来显示日文可以用ShiftJIS编码来显示一旦遇到客户端浏览器设置的是GB编码而页面上有日文或韩文的内容就不能正确显示了假如采用UTF编码方式就不会出现这种情况了因为UTF编码几乎被所有的操作系统平台支持并且包含了世界上绝大多数语言

为统一编码我们需要在JVM参数浏览器请求Web Server响应三个方面进行配置具体如下

aJVM参数

Dfileencoding=UTF针对EOS还需指定Dxmlencoding=UTF

b浏览器请求

如果Web Serve支持jsp规范我们可以直接在WEBINF目录下的webxml中指定编码方式

<jspconfig> <jsppropertygroup> <urlpattern>*jsp</urlpattern> <pageencoding>UTF</pageencoding> </jsppropertygroup> </jspconfig>

设置完毕还需检查jsphtml页面中的字符显示设置是不是UTF或者直接把页面显示字符设置删除例如

<%@ page language=java contentType=text/html charset=UTF pageEncoding=UTF%> <META httpequiv=ContentType content=text/html charset=UTF>

cWeb Server响应

如果是jsp则需指定<% request setCharacterEncoding(UTF %>

如果是servlet则需调用 HttpServletRequest setCharacterEncoding(UTF

这两条语句均要在放在getParameterValue()getParameterValues()语句之前

文件编码

如果一个文件原编码是GBK现要以UTF编码显示我们会发现除了ASCII码之外的字符都是乱码其原因是UTF仅仅和ASCII码兼容除此之外同一字符的编码值并不相等为解决这一问题我们还需把Web应用涉及到的jsphtmlcssjs等文本文件的格式转换成UTF编码又由于windows操作系统识别UTF文件时是靠该文件的头三个字节的内容判断的而java虚拟机并不识别此文件头(BOM)故转换编码时一定不能包含BOM头

               

上一篇:Java进阶:Java编写通过代理访问的应用程序

下一篇:java回调