news 2026/6/4 2:30:37

Winform双语实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Winform双语实现

文章目录

  • 一、前言
  • 二、思路
  • 三、语言的存储 cache.XML
    • 1、建cache.xml
    • 2、读写Helper CacheHelper.cs
  • 四、双语实现
    • 1、建JSON
    • 2、建读取 LangHelper.cs
  • 五、调用
    • 1、Program.cs 缓存语言
    • 2、frmMain中
    • 总结:

一、前言

好久没写了,记录一个winform双语实现。

之前使用Winform自带的 resx 实现双语,出现 控件跑位、各版本部对齐、翻译好的文本莫名丢失的情况。 一怒之下自己写了个实现。

二、思路

1、中文、英文两个Josn文件
2、读取helper
3、Form_Load里 给控制Text初始化
4、Program.cs里 先初始化 语言类型
发现少了一个存语言的,建一个cache.XML

三、语言的存储 cache.XML

1、建cache.xml

<?xmlversion="1.0"encoding="utf-8"?><SystemConfigure><Language>zh-CN</Language></SystemConfigure>

2、读写Helper CacheHelper.cs

usingOrg.BouncyCastle.Ocsp;usingSystem;usingSystem.Diagnostics;usingSystem.Net.NetworkInformation;usingSystem.Xml;/// <summary>/// 配置状态缓存 读写类/// </summary>publicclassCacheHelper{// 你的XML文件路径(按实际修改)privatestaticreadonlystringXmlPath=Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"LocalCache.xml");publicstaticstringReadLgg(){returnReadData("Language");}/// <summary>/// 修改并保存 FileSrcs 节点/// </summary>publicstaticboolWriteLgg(stringreq){returnWriteData("Language",req);}/// <summary>/// 读取 节点/// </summary>publicstaticstringReadData(stringkey){try{XmlDocumentdoc=newXmlDocument();doc.Load(XmlPath);returndoc.SelectSingleNode("SystemConfigure/"+key).InnerText;}catch{return"";}}/// <summary>/// 修改并保存 节点/// </summary>publicstaticboolWriteData(stringkey,stringvalue){try{XmlDocumentdoc=newXmlDocument();doc.Load(XmlPath);doc.SelectSingleNode("SystemConfigure/"+key).InnerText=value;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.cs

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingNewtonsoft.Json;publicstaticclassLang{// 顶级是main/setting,每个里面都是键值对,最简单的结构privatestaticDictionary<string,Dictionary<string,string>>_lang;publicstaticstringCurrentLang{get;privateset;}="zh-CN";publicstaticvoidLoadLang(stringlangCode){try{CurrentLang=langCode;stringlangFile=(langCode.ToLower().Contains("zh")?"lang.zh-CN.json":"lang.en-US.json");stringpath=Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Language",langFile);// 用Newtonsoft.Json反序列化,最稳妥,不会有任何坑stringjson=File.ReadAllText(path);_lang=JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>(json);}catch(Exceptionex){_lang=newDictionary<string,Dictionary<string,string>>();}}publicstaticstringT(stringkey){if(_lang==null||string.IsNullOrEmpty(key))returnkey;try{string[]parts=key.Split('.');if(parts.Length==2&&_lang.TryGetValue(parts[0],outvarsection)){if(section.TryGetValue(parts[1],outvarvalue))returnvalue;}returnkey;}catch{returnkey;}}}

五、调用

1、Program.cs 缓存语言

staticvoidMain(){ApplicationConfiguration.Initialize();// 读取本地保存的语言stringlang=CacheHelper.ReadLgg();Lang.LoadLang(lang);//-endApplication.Run(newfrmMain());}

2、frmMain中

//刷新语言privatevoidRefreshLang(){// 窗体标题this.Text=Lang.T("main.Text");// 按钮button1.Text=Lang.T("main.button1");// 标签label1.Text=Lang.T("main.label1");}//窗体控件 文本初始化//记得在窗体事件里绑定Main_Load: Load += frmMain_Load;privatevoidfrmMain_Load(objectsender,EventArgse){//初始化RefreshLang();}//中英切换事件privatevoidbutton1_Click(objectsender,EventArgse){stringlgg=CacheHelper.ReadLgg();if(lgg=="zh-CN")lgg="en-US";elselgg="zh-CN";CacheHelper.WriteLgg(lgg);Lang.LoadLang(lgg);RefreshLang();}

总结:

切换还是很丝滑的,没有VUE的 i18n 那么方便,但resx是真的坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 2:29:00

论文反复修改到心累?博导推荐这几个AI写作辅助软件

论文写作总是反复修改、反复推翻&#xff0c;效率低到让人崩溃&#xff1f;其实关键在于用对 AI 工具、走对流程——资深教授普遍推荐&#xff1a;千笔AI&#xff08;中文全流程首选&#xff09; 豆包学术版&#xff08;轻量高效&#xff09; DeepSeek 学术版&#xff08;理工 …

作者头像 李华
网站建设 2026/6/4 2:13:58

告别网络依赖!手把手教你将30M的腾讯TBS X5内核直接打包进Android APK

深度解析Android应用静态集成腾讯TBS X5内核的完整方案在企业级应用开发中&#xff0c;WebView作为承载H5内容的核心组件&#xff0c;其性能与稳定性直接影响用户体验。腾讯TBS X5内核凭借其优异的渲染能力、视频播放支持和兼容性优化&#xff0c;成为众多Android开发者的首选。…

作者头像 李华
网站建设 2026/6/4 2:10:58

4x4矩阵键盘电子密码锁 FPGA 设计 Verilog Quartus

名称&#xff1a;4x4矩阵键盘电子密码锁 FPGA 设计 Verilog Quartus软件&#xff1a;Quartus语言&#xff1a;Verilog开发板/平台&#xff1a;Cyclone IV FPGA开发板功能介绍本设计实现一个基于 FPGA 的 4x4 矩阵键盘电子密码锁系统&#xff0c;采用 Verilog 编写&#xff0c;工…

作者头像 李华