Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 本地化Windows窗体_Vb.net_Winforms_Localization - Fatal编程技术网

Vb.net 本地化Windows窗体

Vb.net 本地化Windows窗体,vb.net,winforms,localization,Vb.net,Winforms,Localization,我正在从事一个项目,该项目涉及大量Windows窗体的本地化 我们正在使用TableLayoutPanel控件处理布局,它工作得很好 我们遇到的一个突出问题是,当我们将Form.Localizable属性设置为True时,我们最终不得不为每种语言的每个表单管理一个.resx文件。如果.resx文件只包含本地化文本,但也包含表单的大量布局数据,那就好了 有没有一种方法可以将可本地化的文本元素从控件布局信息中分离出来,而控件布局信息在VisualStudioIDE中仍然有效 我注意到我可以修改表单的

我正在从事一个项目,该项目涉及大量Windows窗体的本地化

我们正在使用TableLayoutPanel控件处理布局,它工作得很好

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

有没有一种方法可以将可本地化的文本元素从控件布局信息中分离出来,而控件布局信息在VisualStudioIDE中仍然有效

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

' '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") ' “标签1 ' Me.Label1.AutoSize=True Me.Label1.Dock=System.Windows.Forms.DockStyle.Top Me.Label1.Location=新系统.图纸.点(3,0) Me.Label1.Name=“Label1” Me.Label1.Size=新系统.图纸.尺寸(61,13) Me.Label1.TabIndex=1 Me.Label1.Text=My.Resources.ResourceManager.GetString(“Form1\u Label1\u Text”)
您可以将文件作为资源,因此这是您应该能够完成的,因为它在运行时不会更改,只能从您所说的内容进行访问。例如,可能是包含语言条目和翻译文本的xml文件<代码>正常。在运行时,您可以决定加载哪个语言节点

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

在我最后一次工作的地方,我们使用了xml文件,每种语言对应一个xml文件,这些文件与安装捆绑在一起。在加载解决方案时,我们将所需的文件加载到一个全局哈希表中,并以这种方式设置每一位文本。也许有一个更为理想的解决方案,但也许这方面的东西可以帮助你<代码>哈希表(“successfulSaveMsg”)将返回“您已成功保存了您的小部件”。例如。

我从未找到对此我完全满意的答案。但这就是我最终实施的解决方案:

  • 我最终设置了
    Form.Localizable=false
    ,因为我不想维护所有相同的.resx文件

  • 所有UI元素都会得到一个事实上的值(如“O_K_”),该值显然没有本地化

  • 我对表单/控件的处理与其他所有可本地化内容(错误消息、日志消息等)完全相同,只给了它们唯一的键,如“cmdOkTextOK”,以便它们可以在多个表单中共享

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

  • 公开课表格1 公共分新() '此调用是Windows窗体设计器所必需的。 初始化组件() '在InitializeComponent()调用之后添加任何初始化。 本地化组件() 端接头 私有子本地化组件() '本地化公共资源中的所有ui元素 Me.SuspendLayout() Me.cmdOK.Text=My.Resources.ResourceManager.GetString(“cmdOKTextOK”) Me.cmdCancel.Text=My.Resources.ResourceManager.GetString(“cmdcanceltexcancel”) Me.cmdApply.Text=My.Resources.ResourceManager.GetString(“cmdApplyTextApply”) Me.ResumeLayout(错误) 端接头 末级 这会将可见控件元素的本地化移出设计器文件(每次编辑表单时都会将其销毁),并将其重新置于我的控制之下

    我仍然不是100%满意,因为控件是在运行时使用非本地化字符串创建的,后者正在更新。但这会让我从一场维护噩梦中解脱出来,我真的不想


    感谢所有不辞辛劳回答问题的人。我很感激!我不知道你在回答自己的问题时应该怎么做,把它标记为“已回答”,所以如果有人能指出这一点而不会把我烧得太厉害,那我将不胜感激。

    好吧,我从来没有真正找到一个完全满意的答案来回答这个问题。但我提出了一个最不冒犯我的解决方案,我将在下面详细介绍。 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