问题描述
接到一急活,软件的英文化工作,这周末之前必须要测试完成的,我查了网上的资料,如果是窗体中的内容,比如说窗体的控件名之类的,可以利用窗体自带的资源文件.resx中,大致操作步骤:1.选中一个Form窗体,在属性编辑器中设置Localizable属性为true(默认为false)2.设置Language属性为default,这样就可以编辑默认情况下的文化设置3.然后在Form中添加你需要的基本控件,如按钮、菜单、标签等注意,一旦Form发生变化,VS.net就会自动生成<Form名称>.resx文件4.菜单布局完成后,重新设置Language属性为另一种语言,如中文(简体)5.Form中修改刚才添加的按钮、菜单和标签的属性,比如修改Text属性为中文文字,当然,文化设置并不局限于Text,还可以设置对齐方式、布局等,保存后,你会发现在Form窗体的cs文件下又多了一个<Form名称>.zh-CN.resx文件。因为程序中还有一些Messagebox中自定义的内容,本来我是想新建一个资源文件,把自定义的内容全部放在里面,但是类似直接访问ResourceManagerrm=newResourceManager("WinFormStrings.en.resx",Assembly.GetEntryAssembly())
提示找不到相应资源,如果我自定义一个类,资源文件取成和自定义类名一样,后面加上相应语言名,那么资源文件就属于这个类,用ResourceManagerrms=newResourceManager(typeObj);returnrms.GetString(id,ci);
用这种方式可以访问得到,我本来想把MessageBox一些自定义的内容全放在这里,但是后来图省事,就把它放到窗体的.resx文件中,昨天放完之后保存了,但是问题是:第一:今天打开后,发现全是空的,我知道一旦修改窗体控件的内容,哪怕是位置,它会自动生成一个对应语言下的resx文件,但是我并没有修改窗体内任何内容。第二:比如我改变了一个控件的文职,VS.net会自动遍历所有显示控件的可修改属性,根据当前Form窗体的Language设置,会把属性更改保存在特定语言的.resx文件中,但是最基本的控件的Name这些属性文件里都没有。对于自定义消息这种内容,放在哪个资源文件里访问比较合适,我目前想到的就是所有自定义消息得一个个添加到资源文件里,再通过id访问,也挺烦的,有没有什么简单的方法?比较急,有谁知道的,望赐教。
解决方案
解决方案二:
不一定要用resx你可以用ini文件,或者用xml文件来定义,操作起来也方便
解决方案三:
只能如你所想这么做,你不要觉得VS对UI的资源自动化做的这么方便,其实它也是靠一大堆代码来实现它的。我就是用不同的资源文件取实现自定义字符串的。两个自定义语言资源文件:定义强类型变量(部分代码):classCultureRes{///<summary>///为窗体更新资源文件内容///</summary>///<paramname="form"></param>publicstaticvoidApplyResources(Formform){ComponentResourceManagerrm=newSystem.ComponentModel.ComponentResourceManager(form.GetType());foreach(Controlctlinform.Controls){rm.ApplyResources(ctl,ctl.Name);form.ResumeLayout(false);form.PerformLayout();}//Captionrm.ApplyResources(form,"$this");}///<summary>///查找类似戴晓峰的本地化字符串。///</summary>publicstaticstringAuthor{get{switch(Thread.CurrentThread.CurrentCulture.Name){case"zh-CN":returnResourceZh.Author;break;case"en-US":returnResourceEn.Author;break;default:returnResourceZh.Author;break;}}}
调用:privatevoidbutton10_Click(objectsender,EventArgse){//切换到中文//使用资源文件强名访问的方式,支持多语言系统Thread.CurrentThread.CurrentCulture=newCultureInfo("zh-CN");Thread.CurrentThread.CurrentUICulture=newCultureInfo("zh-CN");CultureRes.ApplyResources(this);//改变设计期控件内容tbAuthor.Text=CultureRes.Author;//改变动态内容,且使用强名称调用MessageBox.Show(String.Format(CultureRes.判断某字段不能为空_Arg0,CultureRes.商品名称));}
解决方案四:
直接把中英文放到ini或者xml,做个切换按钮就行了,简单快速