我需要让遗留程序(它的巨大)支持另一种语言。尽管我非常喜欢向他们发送我的单一语言项目文件并要求他们完成剩下的工作,但翻译机构在我这样做时往往会打架。
所以我希望生成项目中所有UI控件的列表以及当前显示的默认文本。然后我将其发送给翻译人员,然后我将生成一个包含结果的.resx文件。据我了解,只要我为正在定位的语言正确命名resx文件并将localizable属性设置为true,一旦文化更改它将切换我的控件上的所有文本。让我知道如果我对此感到厌倦,我会把时间花在嵌入式世界上,出于某种原因,高层决定我应该成为解决这个问题的人。
我想我可以解析设计器文件以获取列表,但我希望有人有一个更优雅的解决方案,或者知道有人已经建立的解决方案。这似乎是一项非常普遍的任务。
答案 0 :(得分:1)
好吧,既然我不知道一些非常重要的参数,我无法确定是否寻找商业工具是一种选择;我也不知道你有多少表格或动态创建了多少表格和控件..
但是对于一个简单的控制转储功能,这可能是一个开始:
private void dumpControls(Control ctl, string parents)
{
if (parents == "") parents = ctl.Name; else parents += "." + ctl.Name;
if (ctl.Name != "" && ctl.Text != "") Console.WriteLine(parents + "=" + ctl.Text);
foreach (Control ct in ctl.Controls) dumpControls(ct, parents);
}
您可以将其放入表单的构造函数中:
public Form1()
{
InitializeComponent();
if (dumpMode) dumpControls(this, "");
..
}
如果您不想要完整的父容器列表,您可以轻松修改代码,例如:
if (parents == "") parents = this.Name + "." + ctl.Name; else parents += "." + ctl.Name;
if (ctl.Name != "" && ctl.Text != "") Console.WriteLine(parents + "=" + ctl.Text);
foreach (Control ct in ctl.Controls) dumpControls(ct, "")
您可能希望使用前面的表单来使控件在表单中具有唯一性。
显然,您不仅需要将其添加到每个表单,还要打开每个表单。 我不知道这是否会成为问题,但我确信真正的工作将通过您的代码并将所有需要翻译的硬编码文字更改为其他内容。我去过那里并且用过字典;工作得很好,但是工作量很大,也很神奇,因为我不知道有多少文字潜入我自己的代码......
我在表单加载或用户更改语言时加载字符串。除内置资源外;我还可以在字典中读取外部语言文件..
当然,不是将数据转储到控制台,而是将其填充到StringBuilder中并将其写入文件中。
答案 1 :(得分:0)
您可以使用以下代码获取表单中的控件:
foreach (Control control in this.Controls)
{
MessageBox.Show(control.Name + "\n" + control.Text);
}
但它只显示表单上的控件。如果您有一个组合框,则也应该使用相同的代码组。或者如果你有tabcontrol,你应该单独为它做。