志在指尖
用双手敲打未来

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)
{
}
}
}
———————

未经允许不得转载:IT技术网站 » c# 程序多语言切换尝试
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载