BIRT中文化问题解决
上次我在论坛上提出了有关BIRT中文化的问题,现在终于找到解决办法,与大家共享,修改代码后的jar包请见附件,直接替换原来的即可。
一、环境
1、Eclipse 3.2
2、BIRT 2.1.0
3、JDK1.5.0_7,BIRT的编译环境是JDK1.4,所以在Eclipse中需要将JDK设为1.4兼容
4、Tomcat 5.5.12
二、界面中文化问题
1、问题描述:通过使用
http://host:port/birt-web-hom/frameset?parameters这种方式浏览报表时,出现的界面是英文的。
2、解决方法
(1)birt的CVS中有所有的源代码,签出到本地(具体方法可参考:
http://www.eclipse.org/birt/phoenix/build/buildInstructions.php#checkout)
(2)签出到本地后,找到org.eclipse.birt.report.viewer.nl/src/org/eclipse/birt/report/resource,该文件夹下有几个语言文件,如:BirtResources_de_DE.msg、BirtResources_es_ES.msg、BirtResources_fr_FR.msg、BirtResources_ja_JP.msg、BirtResources_ko_KR.msg、BirtResources_zh_CN.msg,其中我们中文用户最关心的是最后一个文件,将这个文件copy到其他目录,然后改名为BirtResources.properties
(3)birt-runtime-2_1_0.zip中有birt.war,将其发布到Tomcat中
(4)找到%Tomcat_Home%/webapp/birt/WEB-INF/lib/viewservlets.jar,在这个包下找到org/eclipse/birt/report/resource目录,然后将刚才改过名的BirtResources.properties文件压缩进来,这个文件会替换原来这个目录下的同名文件
(5)现在需要修改源代码,需要修改源代码的类是viewservlets.jar/org/eclipse/birt/report/resource/BirtResources.class,你可以在你从CVS中签出的源代码中的org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/resource文件夹中找到BirtResources.java文件,在这个java文件中找到public static String getString( String key )这个方法,原来的代码是这样的:
public static String getString( String key )
{
try
{
return ( bundle != null ) ? bundle.getString( key ) : key;
}
catch ( MissingResourceException e )
{
return key;
}
}
修改为:
public static String getString( String key ) throws UnsupportedEncodingException
{
try
{
String temp = ( bundle != null ) ? bundle.getString( key ) : key;
String str = new String(temp.getBytes("ISO-8859-1"),"GBK" );
return str;
}
catch ( MissingResourceException e )
{
return key;
}
}
将这个文件编译好的class文件压缩到viewservlets.jar的同等目录下,替换原来的文件
(6)启动Tomcat,通过frameset方式访问你已经编辑好的报表,你可以看到界面(包括对话框)中的文件应该已经是中文了
三、get或post方法传递中文参数的解决方法
1、问题描述:如果你在设计报表时增加了参数,在通过get或post方法向这个参数传递中文值时,birt无法解析,因为birt默认的是在UTF-8和ISO-8859-1两个字符集中进行转换,对于中文用户,应该让birt在GBK和ISO-8859-1这两个字符集中进行转换
2、解决方法
(1)普通的JSP和Servlet乱码问题的解决方法对birt不适用,但是你应该首先解决这个普通的乱码问题,这里不作说明
(2)在viewservlet.jar下找到org/eclipse/birt/report/utility下找到ParameterAccessor.class文件,现在要修改这个文件的源代码
(3)你可以在你从CVS中签出的源代码中的org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/utility文件夹中找到ParameterAccessor.java文件,在这个java文件中找到这行:
public static final String UTF_8_ENCODE = "UTF-8"; //$NON-NLS-1$
将这行改为
public static final String UTF_8_ENCODE = "GBK"; //$NON-NLS-1$
然后将这个编译好的class文件压缩到viewservlets.jar的同等目录下,替换原来的文件
(4)在上一步中,如果你用eclipse找开ParameterAccesor.java文件,在使用assert的语句行,eclipse会报错,你可以直接将使用assert的语句注释掉。
(5)重启Tomcat,你现在可以通过get或post方法传递中文值了
四、其他
1、我这里说明的是如何解决中文化的思路,最终至于如何修改这两个类的代码就看各人了,我上面的两种修改方法虽然直接了当地找到了原因,但不是最好的修改方法。
2、一开始我用BIRT的时候,将参数__locale理解为如何将birt本身适应国际化需要,实际上这个参数是为了解决报表内容的国际化,但我想到,既然上面提到的两个中文化问题实际上仍然属于国际化问题范围,为什么__locale参数不能用于解决这两个问题呢,所以我下一步将使用__locale参数解决上面的两个中文化问题,这种方法应该是比较好的。
3、BIRT是一个不错的报表工具,但通过开源化走商业化的路线,让我不免担心Actuate公司究竟会将BIRT做得多强大。从另外一个角度将,对于小型应用系统,BIRT足够了。
4、我的联系方式
MSN:rongzhengmao@gmail.com
E-Mail:rongzhengmao@gmail.com
对于技术人员而言,一个技术问题解决不了,是件很苦恼的事情。
如果上面两个问题也困绕你很久,你看完本文这后也觉得不能解决,欢迎与我联系。
附件: