本地化数据集






2.25/5 (3投票s)
2004年11月23日
2分钟阅读

50081

469
将依赖语言的列标题放在 DataSet 本身中,并在您需要它的任何地方在代码中使用它!
引言
.NET Framework 对多语言应用程序有很好的支持。您可以将所有已翻译的表单文本放在资源文件中。当您将 DataSet
绑定到网格时会发生什么?在我们的例子中,我们使用 Component One 的 TrueDBGrid
。如果您使表单可本地化,则网格的所有格式都会变得与语言相关。如果只使列的标题与语言相关,那就太好了。然后,下一个问题出现了:您必须维护所有表单。将数据字段标题的翻译放在 DataSet
定义本身中更有意义。这就是我所做的,使用了 Shawn Wildermuth 的 DataSet 生成器的修改版本。
用法
首先,阅读我之前关于继承数据集的文章。这篇文章中的 DataSet 生成器版本基本上是进一步开发的版本。
神奇之处在于这段生成的代码
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
属性与语言相关,您只需将翻译放在与 DataSet
的生成代码文件同名的.resx 文件中。如果您的 DataSet
的 XSD 名为 DataSet1.xsd,则生成的代码文件将被称为 DataSet1.vb(如果您正在处理 VB.NET 项目)。您必须添加到项目中的文件必须命名为 DataSet1.vb.resx,DataSet1.vb.nl.resx 等。为了让您有一个良好的开端,我在测试项目中放入了一个小程序,它可以为您创建这些文件并填充所有列的标题。只需按下正确表单上的按钮即可。
选择权在于您!
当然,您不想一直翻译所有标题。访问资源文件可能会产生不必要的开销。首先,如果您从资源文件中遗漏了标题翻译,则不会进行翻译工作。其次,只要您不将 Localizable
属性设置为 True
(例如,从 Visual Studio 中的表单设计器),就不会进行任何翻译工作。
其他选项
Wout de Zeeuw 建议翻译对象属性,以便它们在 PropertyGrid
中正确显示。我花了一些时间尝试将这种以属性为中心的方法移植到 DataSet
,但它给了我太多的麻烦。如果您想使用 .NET PropertyGrid
,我的解决方案可能不是最好的。