65.9K
CodeProject 正在变化。 阅读更多。
Home

本地化数据集

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.25/5 (3投票s)

2004年11月23日

2分钟阅读

viewsIcon

50081

downloadIcon

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.resxDataSet1.vb.nl.resx 等。为了让您有一个良好的开端,我在测试项目中放入了一个小程序,它可以为您创建这些文件并填充所有列的标题。只需按下正确表单上的按钮即可。

选择权在于您!

当然,您不想一直翻译所有标题。访问资源文件可能会产生不必要的开销。首先,如果您从资源文件中遗漏了标题翻译,则不会进行翻译工作。其次,只要您不将 Localizable 属性设置为 True(例如,从 Visual Studio 中的表单设计器),就不会进行任何翻译工作。

其他选项

Wout de Zeeuw 建议翻译对象属性,以便它们在 PropertyGrid 中正确显示。我花了一些时间尝试将这种以属性为中心的方法移植到 DataSet,但它给了我太多的麻烦。如果您想使用 .NET PropertyGrid,我的解决方案可能不是最好的。

© . All rights reserved.