我正在从事一个涉及本地化大量 Windows 窗体的项目。
我们使用 TableLayoutPanel 控件来处理布局,该控件效果很好。
我们遇到的一个问题是,当我们将 Form.Localized 属性设置为 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")
我从来没有找到一个让我完全满意的答案。但这是我最终实施的解决方案:
我最终设置了Form.Localizable = false
因为我不想维护所有相同的 .resx 文件
所有 UI 元素都会获得一个明显未本地化的实际值(如“O_K_”)。
我对待表单/控件与所有其他可本地化内容(错误消息、日志消息等)完全相同,只是给它们提供了唯一的键,例如“cmdOkTextOK”,以便它们可以在多个表单之间共享
我创建LocalizeComponent()
每个表单上都有函数,并在构造函数之后立即调用它InitializeComponent()
函数,如下:
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
这会将可见控制元素的本地化移出设计器文件(每次我进行表单编辑时它都会被破坏)并将其放回我的控制之下。
我仍然不是 100% 满意,因为控件是在运行时使用非本地化字符串创建的,而这些字符串稍后会更新。但这将使我摆脱我真的不想要的维护噩梦!
感谢所有不厌其烦回答的人。我很感激!我不确定在回答自己的问题时你应该做什么来将其标记为“已回答”,所以如果有人能指出这一点而不会让我太难受,我将不胜感激。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)