微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

SSRS 中并没有直接提供本地化的配置方式,因此在 SSRS 中实现本地化,比如有英文标题还有可选的中文标题,就需要通过其它的方式来解决。

比如默认是这样的英文标题 -

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

但是本地中方用户可能比较喜欢看到这样的标题 -

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

我们可以通过以下方式来实现 -

创建一张翻译表,这张翻译表将配置所有需要本地化的中文和英文标签。

--------------------------------------------------------------------------
-- http://www.cnblogs.com/biwork
--------------------------------------------------------------------------
USE BIWORK_SSIS
GO

IF OBJECT_ID('dbo.TRANSLATION','U') IS NOT NULL
DROP TABLE dbo.TRANSLATION 
GO 

CREATE TABLE dbo.TRANSLATION
(
    ID INT,
    LANGUAGE_TYPE NVARCHAR(25),
    LANGUAGE_DESC NVARCHAR(255)
    CONSTRAINT [PK_TRANSLATION] PRIMARY KEY CLUSTERED(ID,LANGUAGE_TYPE)
)

INSERT INTO dbo.TRANSLATION VALUES
(1,'en-US','Employee ID'),
(1,'zh-CN',N'员工 ID'),
(2,'en-US','Full Name'),
(2,'zh-CN',N'名称'),
(3,'en-US','Title'),
(3,'zh-CN',N'职位')

SELECT ID,
       LANGUAGE_TYPE,
       LANGUAGE_DESC
FROM dbo.TRANSLATION

注意上面的主键部分,是 ID 和 LANGUAGE_TYPE 共同组成。 en-US 英文,zh-CN 中文

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

报表默认的语言我们可以看看 SSRS Report 的内置字段 Language - 把这个字段拖放到报表上然后预览一下看看,我的默认的就是 en-US,后面会用到这个内置字段。

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

创建一个 DataSet - DS_LABELS, 在 BIDS 工具中,如果在查询时写好了这个参数,创建完 DataSet后,这个参数就会被直接创建出来,不需要预先定义。

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

再创建一个 Dataset - DS_LANGUAGES 用来作为报表上的语言参数 -

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

同时给 @LANGUAGE 变量赋值可用的值 -

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

Default Value 也可以像上面一样选中 DS_LANGUAGES 来给定值,当然也可以让这个参数在显示的时候按照报表自身的默认语言来显示,使用 Build-In 内置字段。

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

还要再创建一个隐藏的可多选的参数 - LABELS

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

可用的值 -

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

默认值 -

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

在报表区域右键属性,然后在 Code 里添加一段 VB 代码 -

Public Function GetLabel(P as Parameter, Label as String) as String
    Dim i As Integer
    
    For i = 0 to Ubound(P.Value)
       If (P.Value(i) = Label) Then Return P.Label(i)
    Next i
Return Label
End Function

这段代码的作用就是将参数 LABELS 对象(注意第一个参数的类型是 Parameter) 传入,然后循环遍历这个参数对象的所有 VALUE 值,如果某一个 VALUE 值即表中的 ID 列正好等于第二个参数的值,那么就将这个参数的 VALUE 所对应的 LABEL 返回。

这个代码是最核心的代码!

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

好了,这样就可以在页面上根据数据翻译表中的 ID 来获取对应的 LABEL 了。

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

需要的地方全都修改,并指定相应的 ID。

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

预览报表,可以根据相应的语言查看报表。

微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换

在网上看到不止这一种解决方法,也有使用自定义的 Code 来解决的,但我认为这种方式还是相对要容易管理一些,并且所有的标签内容在数据库表中进行管理,很方便。

当然,在实际使用的时候要考虑到可重用性,也就是说不同的报表中字段,标签名称相同的情况下应该使用同一个标签而不应该重复创建字段。因此在检查字段标签是否重复存在的时候可以对 LANGUAGE_DESC 进行排序然后检查。

并且,如果为了更好的管理报表的标签的话,应该再增加一个Report表和ReportLabel表。即需要知道哪些报表使用了哪些标签,这样一来就可以根据报表名称快速排查哪些标签被使用了,要改的时候也知道要改哪些标签。


更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。