我正在开发一个涉及本地化大量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")
答案 0 :(得分:2)
我从来没有找到答案,我完全满意。但这是我最终实施的解决方案:
我最终设置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
这会将可见控件元素的本地化移出设计器文件(每次进行表单编辑时都会将其销毁)并将其置于我的控制之下。
我仍然不是百分之百满意,因为控件是在运行时使用非本地化字符串创建的,后者正在更新。但它会让我免于我真正不想要的维护噩梦!
感谢所有麻烦回答的人。我很感激!我不确定在回答你自己的问题时你应该做什么来标记它“已经回答”所以如果有人能指出我这一点而不会让我感到太糟糕而不被赞赏。
答案 1 :(得分:0)
您可以将文件作为资源,这样您就可以完成这项工作,因为它在运行期间没有更改,只能从您所说的内容中访问。例如,可能是包含语言条目和翻译文本的xml文件。 <entry key = "btnOK">Ok</entry>
。在运行时,您可以决定加载哪个语言节点
<Languages>
<Language name="Spanish">
<Entry key="Yes">Si</Entry>
我工作的最后一个地方,我们使用xml文件,每种语言一个,我们与安装捆绑在一起。当加载解决方案时,我们将所需的文件加载到全局HashTable中并以这种方式设置每个文本位。可能有一个更优化的解决方案,但也许这些方面的东西可能会帮助你。例如,hashTable("successfulSaveMsg")
将返回“您已成功保存小部件”。