【问题标题】:Some questions about multi language关于多语言的一些问题
【发布时间】:2011-02-14 19:32:16
【问题描述】:

最近,我决定在我的应用程序中添加 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 我会进一步检查哪个更好。

【问题讨论】:

  • 您确实明白,如果您希望这些词是法语的,您实际上必须翻译这些词,对吧?
  • 是的,我知道而且我已经用法语做了一个新的 resx...我说我成功了...
  • 我不知道你说了什么,因为你的问题不清楚。如果要根据 TextBoxA 的位置调整 TextBox B 的位置,请根据 TextboxA 的大小调整位置(调整控件的 X 位置)。

标签: c# winforms multilingual resourcemanager


【解决方案1】:

Satellite assemblies 就是你要找的东西。

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

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

【讨论】:

  • 应该的。无论如何,处理这个问题的最好方法是修正你的布局,使它在所有语言中都是正确的。
【解决方案2】:

在 GUI 运行时将其更改为不同的文化不是一个好主意,最好是说您需要重新启动应用程序才能看到更改。

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

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

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

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

【讨论】:

  • 我不需要在运行时更改 GUI 文化。我没有找到你的方法。你能给我例子/教程吗?
  • 如果您可以在 init 上设置文化(在创建表单之前),您可以使用“Thread.CurrentThread.CurrentCulture = yourCulture”和“Thread.CurrentThread.CurrentUICulture = yourCulture”来完成。此外,如果您创建新线程,您也需要为它们设置文化。如果线程文化没问题,所有错误消息、表单等都将显示为您指定的文化。
  • 我得到了一个名为“MainForm”的表单,我为这个表单做了法语资源。在构造函数 > MainForm() 我放置了你的 3 行代码(在 InitializeComponent(); 之前)并编译了代码。什么都没发生...
  • 你有中性文化还是亚文化?你的 resx 是 .fr.resx 还是 fr-xx.resx?您需要 fr resx,才能使用这种特定的文化。在将文化修复到线程(在 InitializeComponent 上)后,您能否检查正在加载的资源?
  • 中性 > MainForm.fr.resx MessageBox.Show(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString()); sais fr-FR oO 我想要 fr。不是法国...
【解决方案3】:

回答你的第一个问题:

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


回答你的第二个问题:

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

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

【讨论】:

  • 在这种情况下,我将不得不添加控件(flowLayourPanles),据我了解,它们的行为就像表格一样。是的,它将解决我的问题,谢谢。编辑:我阅读了 Serge - appTranslator 的答案,我认为他的方式更好,所以我会使用他的答案。 (我不知道每个控件的位置是文化资源的一部分。
  • 如果您没有太多控件并自己进行翻译,这听起来可能是个不错的选择。在任何其他情况下(大量字符串)或自动字符串构建(来自应用程序中的内容),那么真正动态的方法是唯一 100% 好的解决方案。我预测你会讨厌一段时间后在控件周围移动:-)
猜你喜欢
  • 2012-05-14
  • 2012-11-27
  • 1970-01-01
  • 2011-06-16
  • 2011-06-16
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多