本地化Windows窗体

时间:2011-10-12 21:42:22

标签: vb.net winforms localization

我正在开发一个涉及本地化大量Windows窗体的项目。

我们正在使用TableLayoutPanel控件处理布局,它可以很好地工作。

我们遇到问题的一个方面是,当我们将Form.Localizable属性设置为True时,我们最终必须为每种语言的每个表单管理一个.resx文件。如果.resx文件只包含本地化文本,那就没问题了,但它也包含了大量的表单布局数据。

有没有办法将可本地化的文本元素与控件布局信息分开,这些信息在visual studio IDE中继续有效?

我注意到我可以修改表单的设计器文件以查看另一个资源文件,但是当我使用表单设计器时,这些更改将被删除:

'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Dock = System.Windows.Forms.DockStyle.Top
Me.Label1.Location = New System.Drawing.Point(3, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(61, 13)
Me.Label1.TabIndex = 1
Me.Label1.Text = My.Resources.ResourceManager.GetString("Form1_Label1_Text")

2 个答案:

答案 0 :(得分:2)

我从来没有找到答案,我完全满意。但这是我最终实施的解决方案:

  1. 我最终设置Form.Localizable = false,因为我不想保留所有相同的.resx文件

  2. 所有UI元素都会得到一个显然未本地化的事实值(如“O_K_”)。

  3. 我将表单/控件与我所有其他可本地化的内容(错误消息,日志消息等)完全相同,只是给了他们像“cmdOkTextOK”这样的唯一键,这样就可以在多个表单中共享它们了

  4. 我在每个表单上创建了LocalizeComponent()函数,并在InitializeComponent()函数后立即从构造函数中调用它,如下所示:

  5. Public Class Form1
        Public Sub New()
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
            ' Add any initialization after the InitializeComponent() call.
            LocalizeComponent()
        End Sub
    
        Private Sub LocalizeComponent()
            ' Localizes all the ui elements from a common Resource
            Me.SuspendLayout()
            Me.cmdOK.Text = My.Resources.ResourceManager.GetString("cmdOKTextOK")
            Me.cmdCancel.Text = My.Resources.ResourceManager.GetString("cmdCancelTextCancel")
            Me.cmdApply.Text = My.Resources.ResourceManager.GetString("cmdApplyTextApply")
            Me.ResumeLayout(False)
        End Sub
    End Class
    

    这会将可见控件元素的本地化移出设计器文件(每次进行表单编辑时都会将其销毁)并将其置于我的控制之下。

    我仍然不是百分之百满意,因为控件是在运行时使用非本地化字符串创建的,后者正在更新。但它会让我免于我真正不想要的维护噩梦!

    感谢所有麻烦回答的人。我很感激!我不确定在回答你自己的问题时你应该做什么来标记它“已经回答”所以如果有人能指出我这一点而不会让我感到太糟糕而不被赞赏。

答案 1 :(得分:0)

您可以将文件作为资源,这样您就可以完成这项工作,因为它在运行期间没有更改,只能从​​您所说的内容中访问。例如,可能是包含语言条目和翻译文本的xml文件。 <entry key = "btnOK">Ok</entry>。在运行时,您可以决定加载哪个语言节点

<Languages>
    <Language name="Spanish">
         <Entry key="Yes">Si</Entry>

我工作的最后一个地方,我们使用xml文件,每种语言一个,我们与安装捆绑在一起。当加载解决方案时,我们将所需的文件加载到全局HashTable中并以这种方式设置每个文本位。可能有一个更优化的解决方案,但也许这些方面的东西可能会帮助你。例如,hashTable("successfulSaveMsg")将返回“您已成功保存小部件”。