Winform双语实现
文章目录一、前言二、思路三、语言的存储 cache.XML1、建cache.xml2、读写Helper CacheHelper.cs四、双语实现1、建JSON2、建读取 LangHelper.cs五、调用1、Program.cs 缓存语言2、frmMain中总结一、前言好久没写了记录一个winform双语实现。之前使用Winform自带的 resx 实现双语出现 控件跑位、各版本部对齐、翻译好的文本莫名丢失的情况。 一怒之下自己写了个实现。二、思路1、中文、英文两个Josn文件2、读取helper3、Form_Load里 给控制Text初始化4、Program.cs里 先初始化 语言类型发现少了一个存语言的建一个cache.XML三、语言的存储 cache.XML1、建cache.xml?xmlversion1.0encodingutf-8?SystemConfigureLanguagezh-CN/Language/SystemConfigure2、读写Helper CacheHelper.csusingOrg.BouncyCastle.Ocsp;usingSystem;usingSystem.Diagnostics;usingSystem.Net.NetworkInformation;usingSystem.Xml;/// summary/// 配置状态缓存 读写类/// /summarypublicclassCacheHelper{// 你的XML文件路径按实际修改privatestaticreadonlystringXmlPathPath.Combine(AppDomain.CurrentDomain.BaseDirectory,LocalCache.xml);publicstaticstringReadLgg(){returnReadData(Language);}/// summary/// 修改并保存 FileSrcs 节点/// /summarypublicstaticboolWriteLgg(stringreq){returnWriteData(Language,req);}/// summary/// 读取 节点/// /summarypublicstaticstringReadData(stringkey){try{XmlDocumentdocnewXmlDocument();doc.Load(XmlPath);returndoc.SelectSingleNode(SystemConfigure/key).InnerText;}catch{return;}}/// summary/// 修改并保存 节点/// /summarypublicstaticboolWriteData(stringkey,stringvalue){try{XmlDocumentdocnewXmlDocument();doc.Load(XmlPath);doc.SelectSingleNode(SystemConfigure/key).InnerTextvalue;doc.Save(XmlPath);returntrue;}catch{returnfalse;}}}切换语言的缓存CacheHelper.WriteLgg(“zh-CN”);CacheHelper.WriteLgg(“en-US”);四、双语实现1、建JSON//lang.en-US.json{main:{Text:MainForm,button1:CN/EN,label1:This is a test,},setting:{Text:Testfrom,}}//lang.zh-CN.json{main:{Text:主窗体,button1:中文 / English,label1:这是个测试,},setting:{Text:测试窗体,}}2、建读取 LangHelper.csusingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingNewtonsoft.Json;publicstaticclassLang{// 顶级是main/setting每个里面都是键值对最简单的结构privatestaticDictionarystring,Dictionarystring,string_lang;publicstaticstringCurrentLang{get;privateset;}zh-CN;publicstaticvoidLoadLang(stringlangCode){try{CurrentLanglangCode;stringlangFile(langCode.ToLower().Contains(zh)?lang.zh-CN.json:lang.en-US.json);stringpathPath.Combine(AppDomain.CurrentDomain.BaseDirectory,Language,langFile);// 用Newtonsoft.Json反序列化最稳妥不会有任何坑stringjsonFile.ReadAllText(path);_langJsonConvert.DeserializeObjectDictionarystring,Dictionarystring,string(json);}catch(Exceptionex){_langnewDictionarystring,Dictionarystring,string();}}publicstaticstringT(stringkey){if(_langnull||string.IsNullOrEmpty(key))returnkey;try{string[]partskey.Split(.);if(parts.Length2_lang.TryGetValue(parts[0],outvarsection)){if(section.TryGetValue(parts[1],outvarvalue))returnvalue;}returnkey;}catch{returnkey;}}}五、调用1、Program.cs 缓存语言staticvoidMain(){ApplicationConfiguration.Initialize();// 读取本地保存的语言stringlangCacheHelper.ReadLgg();Lang.LoadLang(lang);//-endApplication.Run(newfrmMain());}2、frmMain中//刷新语言privatevoidRefreshLang(){// 窗体标题this.TextLang.T(main.Text);// 按钮button1.TextLang.T(main.button1);// 标签label1.TextLang.T(main.label1);}//窗体控件 文本初始化//记得在窗体事件里绑定Main_Load: Load frmMain_Load;privatevoidfrmMain_Load(objectsender,EventArgse){//初始化RefreshLang();}//中英切换事件privatevoidbutton1_Click(objectsender,EventArgse){stringlggCacheHelper.ReadLgg();if(lggzh-CN)lggen-US;elselggzh-CN;CacheHelper.WriteLgg(lgg);Lang.LoadLang(lgg);RefreshLang();}总结切换还是很丝滑的没有VUE的 i18n 那么方便但resx是真的坑。