在开发多语言应用程序时,本地化是一个重要的环节。本地化不仅仅是翻译文本,还包括数据格式、日期和时间等。在本文中,将探讨如何将数据集(DataSet)本地化,特别是如何使数据集的列标题根据用户的语言环境动态变化。
在应用程序中,可以将所有翻译后的表单文本放入资源文件中。当将数据集绑定到一个表格控件时,例如使用的Component One的TrueDBGrid,如果将表单设为可本地化的,那么表格的所有格式化都将依赖于语言环境。
理想的情况是,只希望列标题依赖于语言环境。接下来的问题就是,需要维护所有的表单。将数据字段标题的翻译放入数据集定义本身会更有意义。这正是使用Shawn Wildermuth的DataSet Generator的改进版本所做的。
首先,请阅读之前关于继承数据集
的文章。本文附带的DataSet Generator版本是进一步开发的版本。
生成代码的神奇之处在于以下代码片段:
Public Overridable Property Localizable() As Boolean
Get
Return Me._Localizable
End Get
Set(ByVal Value As Boolean)
_Localizable = value
If value Then
Dim resourceManager As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(TestDataSet1))
Dim tableIndex As Integer
Dim columnIndex As Integer
Dim caption As String
tableIndex = 0
Do While (tableIndex < Me.Tables.Count)
columnIndex = 0
Do While (columnIndex < Me.Tables(tableIndex).Columns.Count)
Try
caption = resourceManager.GetString(String.Join(".", New String() {Me.Tables(tableIndex).TableName, Me.Tables(tableIndex).Columns(columnIndex).ColumnName, "Caption"}))
Catch ex As System.Exception
End Try
If (Not (caption) Is Nothing) Then
Me.Tables(tableIndex).Columns(columnIndex).Caption = caption
End If
columnIndex = (columnIndex + 1)
Loop
tableIndex = (tableIndex + 1)
Loop
End If
End Set
End Property
要使Caption
属性依赖于语言,只需在与数据集生成的代码文件同名的.resx资源文件中放置翻译。如果数据集XSD文件名为DataSet1.xsd
,生成的代码文件将命名为DataSet1.vb
(如果在VB.NET项目中工作)。必须将文件命名为DataSet1.vb.resx
, DataSet1.vb.nl.resx
等添加到项目中。为了给一个好的开始,在测试项目中放置了一个小程序,它可以为创建这些文件,并用所有列的标题填充它们。只需在正确的表单上按下按钮即可。
当然,并不总是想翻译所有的标题。访问资源文件可能会产生不必要的开销。首先,如果从资源文件中省略了标题翻译,就不会进行翻译工作。其次,只要不将Localizable
属性设置为True
(例如从Visual Studio的表单设计器中),就不会进行翻译工作。