2

最近,我决定在我的应用程序中添加 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 用于我的多语言。这样我可以让人们翻译它并为我上传它,而且我可以在运行时使用它或重新加载程序。

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

4

3 回答 3

3

卫星组件是您正在寻找的。

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

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

于 2011-02-14T19:48:45.977 回答
2

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

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

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

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

您需要一种特定的文化才能在格式化和解析中使用它。

于 2011-02-14T19:43:11.633 回答
1

回答你的第一个问题:

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


回答你的第二个问题:

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

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

于 2011-02-14T19:42:26.013 回答