本地化 Windows Forms

3

我正在处理一个本地化大量Windows Forms的项目。

我们使用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")

好的,我从来没有真正找到一个完全令人满意的答案来回答这个问题。但是我想出了一个最不让我感到不舒服的解决方案,下面我将详细说明。 - Derek Tomes
2个回答

2
我从未找到一个完全让我满意的答案。但这是我最终采用的解决方案:
  1. 我最终设置了Form.Localizable = false,因为我不想维护所有那些相同的.resx文件。

  2. 所有的UI元素都会得到一个事实上的值(比如“O_K_”),这个值在界面上是不可本地化的。

  3. 我将表单/控件处理成与所有其他可本地化内容(错误消息、日志消息等)完全相同,并为它们分配唯一的键,例如“cmdOkTextOK”,以便可以在多个表单之间共享。

  4. 我在每个表单上创建了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%满意,因为控件是以运行时的非本地化字符串创建的,后来才被更新。但它将使我免受我真的不想要的维护噩梦的困扰!

感谢所有花时间回答的人。我很感激!当回答自己的问题以标记为“已解决”时,我不确定应该做什么,如果有人可以指点一下而不会太过严厉,那就太好了。


0

你可以将文件作为资源,因此根据你所说的,这是你应该能够实现的,因为它在运行时不会改变,只能访问。例如,可能是一个包含语言条目和翻译文本的xml文件。<entry key = "btnOK">确定</entry>。在运行时,您可以决定加载哪个语言节点。

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

我之前工作的地方使用了XML文件,每种语言一个文件,并将其与安装程序捆绑在一起。当解决方案被加载时,我们将所需的文件加载到全局哈希表中,并通过这种方式设置每个文本位。可能有更优化的解决方案,但也许类似这样的东西可以帮助你。hashTable("successfulSaveMsg")会返回“您已成功保存小部件”等信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接