c# 程序多语言切换尝试

1.学习过程:修正窗口的localizable=true;Language=你要添加的言语。VS会帮我们自动添加一个对应的言语资源文件。

这时分修正窗体的text为繁体,翻开Fom1.zh_TW.resx,会发现里面有一条称号和值的对应信息:$this.Text:測試窗口。
查看结构函数:
System.ComponentModel.ComponentResourceManagerresources=newSystem.ComponentModel.ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this,”$this”);
原先的this.Text=’测试窗口’,变成了resources.ApplyResources(this,”$this”);
这个是一个很合理的逻辑,我在开端查材料,晓得会构成多个资源文件的时分,就想应该是存在一种快速切换资源的做法。
网上的很多代码是这样的:
publicForm_实验管理()
{
InitializeComponent();
System.Threading.Thread.CurrentThread.CurrentUICulture=newSystem.Globalization.CultureInfo(“en-US”);
ApplyResource();//修正控件的言语显现
}
privatevoidApplyResource()
{
System.ComponentModel.ComponentResourceManagerres=newComponentResourceManager(typeof(Form_实验管理));
foreach(ControlctlinControls)
{
res.ApplyResources(ctl,ctl.Name);
}
this.ResumeLayout(false);
this.PerformLayout();
res.ApplyResources(this,”$this”);
}
这个我隐隐觉得不对劲,还需求本人每个窗口去写循环?但是由于一开端我用的.net2.0,上面的办法不起作用,我以为是我没弄对,后来运用下面代码的时分也不起作用,我就觉得应该要运用更高版本的框架,改为.net4.0后,生效了。
两种办法都生效,但是上面这个代码明显比拟繁琐。
重复强调:在网上看到运用高版本特性的办法阐明时不带版本,或者不带援用,这点很厌恶,本人也要留意这点。

c# 程序多语言切换尝试


2.实践运用:这个办法很简单,直接让.net本人去加载对应的言语资源文件就好了。
System.Threading.Thread.CurrentThread.CurrentUICulture=newSystem.Globalization.CultureInfo(“zh-TW”);
这句话放在哪里呢,我需求整个程序都切换言语,经过配置文件一开端就设定好言语,不需求随时切换言语,所以我放在了登录窗口的load事情里面。
privatevoidLogin_Load(objectsender,EventArgse)
{
stringlan=””;
if(MConfig.Language==”臺灣繁體”)
{
lan=”zh-TW”;
}
if(MConfig.Language==”UsEnglish”)
{
lan=”en-US”;
}
System.Threading.Thread.CurrentThread.CurrentUICulture=newSystem.Globalization.CultureInfo(lan);
}
3.翻译工作:一个程序有几十个窗口,几百几千个控件,如何快速的完成其他言语录入工作?
3.1每一个窗口称号,控件称号都要有对应言语的翻译,然后要参加到资源文件。假如我们在可视化界面上一个个控件停止修正,要有个翻译坐在旁边,不时的翻译,然后我们录入,工作量庞大,效率低。
翻开资源文件看了下。原始的resx是这样的
能够分明的看到,扫除带>>符号的,剩下的就是窗口和的控件Text,或者自定义的字段。
在界面上将英文的窗口text改为Test,查看en-Us.resx的内容,发现里面的内容是这样的。
从原始resx里面复制button1.Text到en-Us并修正值为按钮1button,运转结果显现胜利。
3.2于是将form1.resx的文件内容复制到excel,去除带>>的,发给翻译,让翻译对照软件窗口,将对应的值全部改成对应的言语,完成后我们从excel直接复制到对应的资源文件中,工作就完成了。
2018-9-10号补充:我的程序窗口巨多,工作量有点大。而且上面的办法不利于后续程序更改,控件有变化的话就需求重新发资源文件停止更新。
想了一个比拟傻瓜化的办法,相似上面的资源文件,在窗口加载时从资源文件获取对应的言语。这里需求自定义根底Form控件,在load时间中加载其他言语,其他窗口全部继承此控件。
CSV文件,客户随时能够添加中文和其他言语的对照关系。客户在界面上看到某个不对的翻译时,随时能够对CSV文件停止更改或者添加。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceHSJ_p
{
publicpartialclassMBaseForm:Form
{
publicMBaseForm()
{
InitializeComponent();
}
///
///加载的时分交换相应的言语
///
///
///
privatevoidMBaseForm_Load(objectsender,EventArgse)
{
if(HSJ_p.Data.SysParameterItem.LanguageResources==null||HSJ_p.Data.SysParameterItem.LanguageResources.Columns.Count==0)return;
if(HSJ_p.Data.MConfig.Language!=”简体中文”)
{
GetLanguageText(this);
}
}
privatevoidGetLanguageText(Tobj)
{
try
{
if(typeof(Form)==typeof(T).BaseType
||typeof(Control)==typeof(T))
{
Controlc=(Control)(object)obj;
DataRow[]drs=HSJ_p.Data.SysParameterItem.LanguageResources.Select(string.Format(“简体中文='{0}’”,c.Text),””);
if(drs.Length>0)
{
c.Text=drs[0][HSJ_p.Data.MConfig.Language].ToString();
}
if(c.Controls.Count>0)
{
foreach(Controlc1inc.Controls)
{
GetLanguageText(c1);
}
}
}
//留意有些控件不是control类型的
if(typeof(ToolStrip)==obj.GetType().BaseType
||typeof(ToolStrip)==obj.GetType())
{
ToolStripc=(ToolStrip)(object)obj;
DataRow[]drs=HSJ_p.Data.SysParameterItem.LanguageResources.Select(string.Format(“简体中文='{0}’”,c.Text),””);
if(drs.Length>0)
{
c.Text=drs[0][HSJ_p.Data.MConfig.Language].ToString();
}
if(c.Items.Count>0)
{
foreach(ToolStripItemc1inc.Items)
{
GetLanguageText(c1);
}
}
}
if(typeof(MenuStrip)==obj.GetType().BaseType
||typeof(MenuStrip)==obj.GetType())
{
MenuStripc=(MenuStrip)(object)obj;
DataRow[]drs=HSJ_p.Data.SysParameterItem.LanguageResources.Select(string.Format(“简体中文='{0}’”,c.Text),””);
if(drs.Length>0)
{
c.Text=drs[0][HSJ_p.Data.MConfig.Language].ToString();
}
if(c.Items.Count>0)
{
foreach(ToolStripMenuItemc1inc.Items)
{
GetLanguageText(c1);
}
}
}
if(typeof(ToolStripItem)==obj.GetType().BaseType
||typeof(ToolStripItem)==obj.GetType())
{
ToolStripItemc=(ToolStripItem)(object)obj;
DataRow[]drs=HSJ_p.Data.SysParameterItem.LanguageResources.Select(string.Format(“简体中文='{0}’”,c.Text),””);
if(drs.Length>0)
{
c.Text=drs[0][HSJ_p.Data.MConfig.Language].ToString();
}
}
if(typeof(ToolStripMenuItem)==obj.GetType().BaseType
||typeof(ToolStripMenuItem)==obj.GetType())
{
ToolStripMenuItemc=(ToolStripMenuItem)(object)obj;
DataRow[]drs=HSJ_p.Data.SysParameterItem.LanguageResources.Select(string.Format(“简体中文='{0}’”,c.Text),””);
if(drs.Length>0)
{
c.Text=drs[0][HSJ_p.Data.MConfig.Language].ToString();
}
if(c.DropDownItems.Count>0)
{
foreach(ToolStripItemc1inc.DropDownItems)
{
GetLanguageText(c1);
}
}
}
if(typeof(DataGridView)==obj.GetType().BaseType
||typeof(DataGridView)==obj.GetType())
{
DataGridViewc=(DataGridView)(object)obj;
foreach(DataGridViewColumncolinc.Columns)
{
DataRow[]drs=HSJ_p.Data.SysParameterItem.LanguageResources.Select(string.Format(“简体中文='{0}’”,col.HeaderText),””);
if(drs.Length>0)
{
col.HeaderText=drs[0][HSJ_p.Data.MConfig.Language].ToString();
}
}
}
}
catch(Exceptionex)
{
}
}
}
———————

© 版权声明
好牛新坐标
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章