实现多国语言的Reporting Services项目

自SQL Server 2005发布之后,我们开发报表项目又多了一种选择:Reporting Services。
因为工作的原因,较早就接触到使用Reporting Services技术开发报表项目,它可以在SQL Server 2005/2008中使用。SQL Server 2000也有Reporting Services,使用的不多。即使没有购买SQL Server 2005的License,也可以借助于这项技术,使用简单轻便的客户端报表(RDLC)。

最近被朋友问到,如何在Reporting Services中实现多国语言。经过一番探索,找到一个有效的方案。
最简单的办法,就是为每一种语言制作相同的报表文件,只是把里面的Label全部换成该语言的文字。比如,为了制作中文和英语两种语种的报表,建立两个报表文件, Customer.rdl和Customer.zh-cn.rdl.
在报表呈现的客户端,根据用户的语言偏号,选择呈现不同的报表。这种方法简单可行,但是会引起重复。修改一个报表的格式,同时也必须修改另一个报表的格式,维护起来不方便。

下面介绍另外一种方法,使用一个文件来制作不多语种的报表。
先打开BIDS ,新建Reporting Services项目,添加报表。
image
制作报表涉及到的技术不复杂,我们把目标集中在如何实现多国语言。
这个报表读取SQL Server 的Northwind数据库的Customer表,使用Table呈现在报表中。
image
然后设计报表的列,使之呈现对应的数据。
image 
在这里,我设计两个地方的Label,需要根据客户端的语言偏号来呈现不同的语言字符。
一个是报表标题,Customer Report,中文是客户报表,还有一个Grand Total,用中文表达是合计
注意:Order ID, Employee ID等Label我都没有实现多国语言,情况类似。
先预览一下报表,确保报表设计没有错误
image 
下面就开始讨论资源文件的开发。先给项目添加一个UIResx的Class Library项目。这里,我采用新建一个解决方案,因为SQL Server 2005的BIDS是用Visual Studio 2005,而我的电脑只安装有Visual Studio 2008。两者不能集成到一个开发环境中,而且解决方案的版本不兼容。
image 
我只制作两种语言(en-us,zh-cn)的资源文件,使用StringResources2。
如果您不熟悉这个工具,请参考我的这篇文章
应用开源项目StringResourceTool2 实现.NET多国语言方案

en-us的文件内容如下
image
zh-cn的文件内容如下
image
为了在报表中引用,方便部署时放到GAC中,请给类库添加签名
image

这样,就做好了资源文件。再回到报表项目中来,做两个小修改
1) 先添加程序集引用,在报表-->报表属性对话框中,添加对资源文件程序集的引用
image
由于是静态属性,不需要添加实例变量。
2) 在显示报表名字的地方,输入=Report.UIResx.SR.OrderReport
在显示合计的地方,输入=Report.UIResx.SR.GrandTotal

这就是我们要做的全部,不需要设置报表的的Language属性,如下图,在我电脑中,没有把Language设置为User!Language也可以正常运行。
image 

报表就制作完成,请先部署报表。打开浏览器,在报表浏览器中查看报表
image
如果看不到效果,要部署UIResx资源文件库,把Report.UIResx.dll和zh-cn/Report.UIResx.resources.dll拷贝到报表服务器所在的目录中。在我的电脑中,这个目录是
D:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin

为了更精确的控制报表的显示效果,我们再来制作一个网站,显示我们的报表
新建一个ASP.NET Web site,添加页面文件,如下图
image
先设计页面的布局。我把用户语言选择和报表显示放在同一个页面中。一般的,我们应该在用户登陆的地方,让用户选择语言偏号。页面布局效果如下
image 
回到代码中,看看是如何引用报表的
protected void btnViewReport_Click(object sender, EventArgs e)
{
       //设置语言
       string language = ddlLanguage.SelectedValue;
       Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
       Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language);
       Title = Report.UIResx.SR.OrderReport;
       //设置报表
       ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
       ReportViewer1.ServerReport.ReportServerUrl = new System.Uri("http://localhost/ReportServer");
       ReportViewer1.ServerReport.ReportPath = "/Test/Order";
       ReportViewer1.ServerReport.Refresh();
}
运行网站,选择中文,效果如下
image

再选择英语,效果如下
image 

写完了Reporting Services,突然很想知道在水晶报表中,是如何实现多国语言的。刚毕业的时候公司的项目比较多,那时还学会了水晶报表,可惜这几年的工作中没有用到,几乎都忘得一干二净。
今天又到了周末,祝大家周末愉快。

你可能感兴趣的:(reporting)