关于多语言的一些问题

时间:2011-02-14 19:32:16

标签: c# winforms multilingual resourcemanager

最近,我决定在我的应用程序中添加4种语言。 我读到了如何做到这一点,我成功了。

但我想问两个问题/问题。

第一个问题:是否有更好的方法来改变每个控件的文本

private System.Resources.ResourceManager rm;

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr");
rm = new System.Resources.ResourceManager(typeof(MainForm));

然后为每个控件写下这一行:

aboutToolStripMenuItem.Text = rm.GetString("aboutToolStripMenuItem.Text");
addTaskToolStripMenuItem.Text = rm.GetString("addTaskToolStripMenuItem.Text");
addTaskToolStripMenuItem1.Text = rm.GetString("addTaskToolStripMenuItem1.Text");
...

第二个问题:让我们说label1的文本是“test”,而在其他语言中它的“testest”然后标签的大小会改变,这是好的。但如果我得到label2他的位置靠近label1,则label1可能位于label2的顶部。如何将label1与label2进行比较,因此无论label1中的文本有多长,label2的位置都将相对于label1。我不想在程序中使用计算,我想知道在其中一个控件中是否有其他类似属性的方法。

编辑: 经过长时间的思考,我决定使用XML作为我的多语言。通过这种方式,我可以让人们翻译它并为我上传,我可以在运行时使用它或重新加载程序。

关于控件的相对位置,我将使用FlowLayoutPanelTableLayoutPanel我会进一步检查哪个更好。

3 个答案:

答案 0 :(得分:3)

Satellite assemblies正是您要找的。

Q1:在VS中,将表单的Localizable属性设置为true。然后相应地选择语言属性并在设计器中键入您的翻译。这样,您只需要在启动时设置线程文化,.NET将为您加载正确的语言。无需添加额外的代码。

Q2:再次,在设计器中选择语言后,只需移动控件:它们的新位置/大小是翻译的一部分,将由.NET自动处理。

答案 1 :(得分:2)

在运行时将GUI更改为不同的文化并不是一个好主意,最好说出需要重新启动应用程序以查看更改的内容。

虽然如果你需要这样做,你需要重新加载新文化中的所有资源(或多或少与InitializeComponen相同),而不仅仅是文本,因为位置,大小等可能是改变了。您还需要更改线程文化以便错误,消息和新控件也具有正确的文化(也用正确的语言显示它们)。

您可以使用以下方式设置应用程序文化:

CultureInfo appCulture = CultureInfo.CreateSpecificCulture("fr");
Thread.CurrentThread.CurrentCulture = appCulture; 
Thread.CurrentThread.CurrentUICulture = appCulture;

您需要特定的文化才能将其用于格式化和解析。

答案 2 :(得分:1)

回答你的第一个问题:

如果您真的想要遵循该方案,可能使用Reflection或自动代码生成是更容易管理的替代方案。我通常编写自己的GetString方法,该方法将默认的英文字符串作为参数(如果没有资源可以为当前语言动态加载,则使用该方法)。但我不确定它是否是最好的解决方案......


回答你的第二个问题:

在Winforms中,使用TableLayoutPanelFlowLayoutPanel或其他布局组件来相对定位控件。例如,可以指定Label是否适合其内容(AutoSize),或者它是否应该停靠,如果是,则指定是否适合Alignment。几乎没有用例需要繁琐的自我管理或计算。

链接:http://msdn.microsoft.com/en-us/library/z9w7ek2f(v=VS.100).aspx