C#winform界面的语言切换

winform使用本地化,中英文切换 在有些软件中,需要中英文切换的功能,甚至其他语言切换的功能,都可以使用winform自带的本地化功能。 1.首先建立一个项目,拖几个控件上去,如图所示。 2.点击Form1的属性,设置以下2项 此时,窗体就会变成带有英语的字样 3.这个时候,我们选择窗体界面上的控件,对控件的Text属性,进行英文填写,如图所示 4.如果想要切换到中文模式,也就是我们的默认模式,点击Form1的属性,把语言设置成默认,就是我们一开始的中文模式。如果要增加其他语言模式,重复第3步即可. 阅读详情

1、效果图

2、导入导出 

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace LanguageSwitch
{
    public enum Language
    {
        /// <summary>
        /// 英文
        /// </summary>
        en,
        /// <summary>
        /// 中文简体
        /// </summary>
        zh_cn,
    }

    public class ComponentControl
    {
        public Type Type { get; set; }

        public string NameTag { get; set; }

        public string TextTag { get; set; }
    }

    public class XmlLang
    {
        Form _form;
        List<ComponentControl> _listComponent;
        public XmlLang(Form form)
        {
            _form = form;
            _listComponent = new List<ComponentControl>();
        }

        public XmlLang(Form form, List<ComponentControl> listComponent) : this(form)
        {
            _listComponent = listComponent;
        }

        public void Load(Language lang)
        {
            Type type = _form.GetType();
            string xmlPath = string.Format("Language\\{0}\\{1}.xml", lang, type.Namespace.Replace('.', '\\'));
            string dire = Path.GetDirectoryName(xmlPath);
            Directory.CreateDirectory(dire);

            if (!File.Exists(xmlPath))  //不存在xml文件,创建文件并写入根节点
            {
                using (StreamWriter streamWriter = new StreamWriter(xmlPath, false, Encoding.UTF8))
                {
                    streamWriter.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
                    streamWriter.WriteLine("<!DOCTYPE Root[");
                    streamWriter.WriteLine("	<!ELEMENT Form ANY>");
                    streamWriter.WriteLine("	<!ATTLIST Form Name ID #REQUIRED>");
                    streamWriter.WriteLine("]>");
                    streamWriter.WriteLine("<Root>");
                    streamWriter.WriteLine("</Root>");
                }
            }
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlPath);
            XmlNode xmlNode = xmlDoc.GetElementById(_form.Name);
            if (xmlNode == null)  //不存在该名称的窗体节点就写入默认的值
            {
                XmlNode root = xmlDoc.DocumentElement;
                addNode(xmlDoc, root, _form);
                xmlDoc.Save(xmlPath);
            }
            setControlText(xmlDoc, _form);
        }

        void addNode(XmlDocument xmlDoc, XmlNode xmlNode, Control ctr)
        {
            Type type = ctr.GetType();
            XmlElement xmlElement = xmlDoc.CreateElement(ctr is Form ? "Form" : type.Name);
            setAttribute(xmlElement, ctr.Name, ctr.Text);
            xmlNode.AppendChild(xmlElement);
            setComponent(xmlDoc, xmlElement, ctr);
            foreach (Control c in ctr.Controls)
            {
                addNode(xmlDoc, xmlElement, c);
            }
        }

        void setAttribute(XmlElement xmlElement, string name, string text)
        {
            xmlElement.SetAttribute("Name", name);
            double num;
            if (!string.IsNullOrWhiteSpace(text) && !double.TryParse(text.Trim(), out num))
            {
                xmlElement.SetAttribute("Text", text);
            }
        }

        void setComponent(XmlDocument xmlDoc, XmlNode xmlNode, Control ctr)
        {
            Type t = ctr.GetType();
            FieldInfo[] fieldInfos = t.GetFields(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic);
            foreach (FieldInfo field in fieldInfos)
            {
                foreach (ComponentControl com in _listComponent)
                {
                    if (com.Type.IsAssignableFrom(field.FieldType))
                    {
                        object val = field.GetValue(ctr);
                        if (val != null)
                        {
                            XmlElement xmlElement = xmlDoc.CreateElement(field.FieldType.Name);
                            string name = getValue(val, com.Type, com.NameTag);
                            if (name != null)
                            {
                                string text = getValue(val, com.Type, com.TextTag);
                                setAttribute(xmlElement, name, text);
                                xmlNode.AppendChild(xmlElement);
                            }
                        }
                    }
                }
            }
        }

        string getValue(object val, Type type, string tag)
        {
            PropertyInfo propertyInfo = type.GetProperty(tag);
            if (propertyInfo != null)
            {
                object value = propertyInfo.GetValue(val, null);
                if (value != null)
                {
                    return (string)value;
                }
            }
            return null;
        }

        void setControlText(XmlDocument xmlDoc, Form form)
        {
            XmlNode xmlNode = xmlDoc.GetElementById(form.Name);
            if (xmlNode != null)
            {
                setCtrText(xmlNode, form);
            }
        }

        void setCtrText(XmlNode xmlNode, Control ctr)
        {
            XmlAttribute xmlAttribute = xmlNode.Attributes["Text"];
            if (xmlAttribute != null)
            {
                ctr.Text = xmlAttribute.Value;
            }
            Dictionary<object, ComponentControl> dictComponent = getComponent(ctr);
            foreach (XmlNode node in xmlNode.ChildNodes)
            {
                XmlAttribute attributeName = node.Attributes["Name"];
                if (attributeName != null)
                {
                    string attriName = attributeName.Value;
                    Control currCtr = ctr.Controls[attriName];
                    if (currCtr != null)
                    {
                        setCtrText(node, currCtr);
                    }
                    else
                    {
                        XmlAttribute nodeAttribute = node.Attributes["Text"];
                        if (nodeAttribute != null)
                        {
                            foreach (var kv in dictComponent)
                            {
                                string propertyName = getValue(kv.Key, kv.Value.Type, kv.Value.NameTag);
                                if (propertyName != null && propertyName == attriName)
                                {
                                    PropertyInfo propertyText = kv.Value.Type.GetProperty(kv.Value.TextTag);
                                    if (propertyText != null)
                                    {
                                        propertyText.SetValue(kv.Key, nodeAttribute.Value, null);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }

        Dictionary<object, ComponentControl> getComponent(Control ctr)
        {
            Dictionary<object, ComponentControl> dictT = new Dictionary<object, ComponentControl>();
            Type typeCtr = ctr.GetType();
            FieldInfo[] flds = typeCtr.GetFields(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic);
            foreach (FieldInfo field in flds)
            {
                foreach (ComponentControl com in _listComponent)
                {
                    if (com.Type.IsAssignableFrom(field.FieldType))
                    {
                        object val = field.GetValue(ctr);
                        if (val != null)
                        {
                            PropertyInfo nameInfo = com.Type.GetProperty(com.NameTag);
                            if (nameInfo != null)
                            {
                                dictT[val] = com;
                            }
                        }
                    }
                }
            }
            return dictT;
        }


    }
}

3、界面调用 

 由于不是所有控件都继承Control类,所以在遍历窗体中的控件时不能加载这些控件。例如:DataGridViewTextBoxColumn,ToolStripMenuItem

 所以需要自己指定是哪些控件,也不是所有控件显示的文本都是Text,所以也需自己指定NameTag和TextTag。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    XmlLang _xmlLang;
    private void Form1_Load(object sender, EventArgs e)
    {
        _xmlLang = new XmlLang(this, new List<ComponentControl>()
        {
            new ComponentControl() { Type = typeof(ToolStripItem), NameTag = "Name", TextTag = "Text" },
            new ComponentControl() { Type = typeof(DataGridViewColumn), NameTag = "Name", TextTag = "HeaderText" },
        });
        _xmlLang.Load(Language.zh_cn);
    }

    private void 简体中文ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        _xmlLang.Load(Language.zh_cn);
    }

    private void englishToolStripMenuItem_Click(object sender, EventArgs e)
    {
        _xmlLang.Load(Language.en);
    }
}

4、XML 

中文XML:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Root[
	<!ELEMENT Form ANY>
	<!ATTLIST Form Name ID #REQUIRED>
]>
<Root>
  <Form Name="Form1" Text="简历">
    <ToolStripMenuItem Name="toolStripMenuItem2" Text="你好" />
    <ToolStripSeparator Name="toolStripSeparator1" />
    <ToolStripMenuItem Name="简体中文ToolStripMenuItem" Text="简体中文" />
    <ToolStripMenuItem Name="englishToolStripMenuItem" Text="English" />
    <DataGridViewTextBoxColumn Name="dgvColumn1" Text="时间" />
    <DataGridViewTextBoxColumn Name="dgvColumn2" Text="地点" />
    <DataGridViewCheckBoxColumn Name="dgvColumn3" Text="进行中" />
    <TabControl Name="tabControl1">
      <TabPage Name="tabPage1" Text="教育经历">
        <Panel Name="panel1">
          <DataGridView Name="dataGridView1">
            <HScrollBar Name="" />
            <VScrollBar Name="" />
          </DataGridView>
        </Panel>
      </TabPage>
      <TabPage Name="tabPage2" Text="工作经历">
        <Panel Name="panel2" />
      </TabPage>
    </TabControl>
    <PictureBox Name="pictureBox1" />
    <Label Name="label3" Text="个人简介" />
    <GroupBox Name="groupBox3" Text="基本信息">
      <TextBox Name="textBox2" />
      <Label Name="label2" Text="年龄" />
      <Button Name="button3" Text="确定" />
      <RadioButton Name="radioButton2" Text="女" />
      <TextBox Name="textBox1" />
      <RadioButton Name="radioButton1" Text="男" />
      <Label Name="label1" Text="姓名" />
    </GroupBox>
  </Form>
</Root>

英文XML: 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Root[
	<!ELEMENT Form ANY>
	<!ATTLIST Form Name ID #REQUIRED>
]>
<Root>
  <Form Name="Form1" Text="Resume">
    <ToolStripMenuItem Name="toolStripMenuItem2" Text="Hello" />
    <ToolStripSeparator Name="toolStripSeparator1" />
    <ToolStripMenuItem Name="简体中文ToolStripMenuItem" Text="简体中文" />
    <ToolStripMenuItem Name="englishToolStripMenuItem" Text="English" />
    <DataGridViewTextBoxColumn Name="dgvColumn1" Text="Time" />
    <DataGridViewTextBoxColumn Name="dgvColumn2" Text="Place" />
    <DataGridViewCheckBoxColumn Name="dgvColumn3" Text="Ing" />
    <TabControl Name="tabControl1">
      <TabPage Name="tabPage1" Text="Education">
        <Panel Name="panel1">
          <DataGridView Name="dataGridView1">
            <HScrollBar Name="" />
            <VScrollBar Name="" />
          </DataGridView>
        </Panel>
      </TabPage>
      <TabPage Name="tabPage2" Text="Work">
        <Panel Name="panel2" />
      </TabPage>
    </TabControl>
    <PictureBox Name="pictureBox1" />
    <Label Name="label3" Text="Personal Information" />
    <GroupBox Name="groupBox3" Text="Information">
      <TextBox Name="textBox2" />
      <Label Name="label2" Text="Age" />
      <Button Name="button3" Text="Confirm" />
      <RadioButton Name="radioButton2" Text="Female" />
      <TextBox Name="textBox1" />
      <RadioButton Name="radioButton1" Text="Male" />
      <Label Name="label1" Text="Name" />
    </GroupBox>
  </Form>
</Root>

 

 

winform中英文切换(实测简单可用) C# winform中英文切换国际化 阅读详情

相关推荐

Winform工程界面中英文切换:基于本地化生成资源文件Form.en-US.resx

在一个软件中支持英文、中文两种语言,那么就必须有这两种语言的资源文件,这在Winform中可以采用资源文件(后缀名为.resx)来实现。在Visual Studio开发环境中生成资源文件可使项目系统为可本地化的用户界面元素(如窗体上的文本和图像)生成资源文件。然后将该资源文件生成到附属程序集中。上述资源文件称作基于窗体的资源。通常,应对特定于 Windows 窗体应用程序中的某个窗体的所有资源使用基于窗体的资源。

weixin_44377414的博客 4356

C#WinForm实现多语言切换

C#窗体实现多语言切换

啊鹏的博客 8660

C#winform程序—信息验证登录界面设计

C#是设计windows窗体程序的良好语言,基于C#中各式各样封装好的控件,设计程序界面变得很简单!本文介绍登录信息验证界面的设计,包含数据库的连接!(此模块在大学生毕业设计中常常用到)。

qq_44218712的博客 6514

C# 中英文切换

简介:         一个项目如果要面对外国的客户时,需要语言切换。本文使用XML,XML是可扩展标记语言(Extensible Markup Language)的缩写,仅用于存储数据。        代码下载链接。   中文 英文   1.使用 新建三个文件。文件的路径和格式需要和MultiLanguage类对应。 readme.xml存放的是记录选择的语言类型。 Ch...

路过 1万+

C# winform 的中英文切换怎么做,有哪几种方式都有什么优缺点?

C# winform 的中英文切换怎么做,有哪几种方式都有什么优缺点?

qq_35320456的博客 5013

C#winform多国语言应用实例

我们在开发项目中,一般需要软件支持多种语言,供不同客户使用。本文实例讲解实现办法。

qq_30725967的博客 1755

C#Winform界面通过资源文件进行多语言切换

来源:http://www.jb51.net/article/45675.htm,今天看到了借鉴过了,保存一下,下次开发直接用哈哈 软件行业发展到今天,国际化问题一直都占据非常重要的位置,而且应该越来越被重视。对于开发人员而言,在编写程序之前,国际化问题是首先要考虑的一个问题,也许有时候这个问题已经在设计者的考虑范围之内,但终归要开发人员去做实现的。因此,如何实现国际化,是开发人员必须掌握的一项...

weixin_33722405的博客 541

C#实现界面以及界面控键中英文版本

超简单的Winform程序,实现界面以及界面控键中英文版本

C#实现多语言界面程序的方法介绍

本文以一个C# winform项目为例,介绍了C#实现多语言界面程序的方法,希望对大家有所帮助。 AD: 一直想做一个多语言的程序,研究了一下.net的本地化方法,觉得做起来比较麻烦,而且不能快速切换,就自己琢磨着写一个。 以我做的一个C# winform 项目为例。 在建立C#实现多语言界面程序之前,首先设计多语言文件,这里我用XML来保存,基本结构...

DreamHigh 436

Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量

在移动互联网时代,H5页面因其跨平台、低成本、易传播的特性,成为许多企业的首选。Uniapp作为一款优秀的前端跨端开发框架,能够快速开发H5、小程序、App等多端应用。然而,由于Uniapp默认采用SPA(单页应用)架构,H5端在SEO(搜索引擎优化)方面存在一定劣势,如爬虫难以抓取动态内容、页面标题和描述不易优化等。 本文将系统性地介绍Uniapp H5端的SEO优化方案,涵盖基础优化、SPA优化策略、内容优化、技术优化、外部优化及监测分析,帮助开发者提升网站在搜索引擎中的排名,获取更多自然流量。

vvilkin的学习备忘 1973

NCCL分布式训练中ibv_reg_mr_iova2内存分配失败的3种解决方案(附详细排查流程)

本文深入探讨了NCCL分布式训练中ibv_reg_mr_iova2内存分配失败的3种解决方案,包括快速临时修复、标准系统配置和PAM模块根治方案。详细分析了错误原因,提供了完整的排查流程和性能优化建议,帮助开发者高效解决RDMA网络环境下的内存锁定问题。

nut55的博客 625

c winform应用程序语言切换,写了一个winform 多国语言切换的助手组件类

最近在网上综合了各种资料,写了一个完整的切换语言助手类。接口SetLanguage(string languageName,Form form)可以对某个窗口进行语言切换。languageName是语言的代码。目前可以支持窗口,菜单,工具栏,按钮等。但是还没有找到比较好的,通用的listbox,combobox的方法。希望兄弟们涌跃讨论,能否找到一个解决listbox,combobox的方法。主要...

weixin_36378771的博客 306

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

XD1996CD的博客 4109

C#Winform多语言切换

cmbLanguages.Items.Add(new LanguageItem("中文", "zh-CN"));在软件开发中时常会遇到软件支持多种语言,而多种语言的本质就是通过访问多种不同的静态资源,来达到多语言的切换,多的不说直接上代码。// 如果不存在,则创建文件夹。// 这里可以从配置文件读取用户上次选择的语言。// 如果没有设置,使用系统语言。// 如果失败,使用默认语言。// 设置当前线程的语言。// 设置应用程序语言。/// 应用程序的主入口点。// 语言选择器辅助类。5.第五步使用语言切换。

m0_70784995的博客 862

科研人必备!用WisPaper搭建个人文献知识库的完整指南(附Zotero联动技巧)

本文详细介绍了如何利用WisPaper搭建高效的个人文献知识库,包括文件命名标准化、文件夹结构设计、语义搜索技巧及与Zotero的深度联动方法。通过智能标签系统和知识图谱功能,科研人员可以快速定位关键文献,提升研究效率。特别适合需要管理大量学术文献的研究者。

weixin_30823001的博客 267

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4457

C#Winform使用按键和下拉框切换中英文语言状态

使用c#语言在winform中使用按键和下拉框切换中英文

weixin_46078387的博客 2481

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1686

【C# winform 两种方式实现多语言切换】

最近做程序的时候需要用到软件进行多语言版本的问题,在网上收集了一些资料后,现对两种文件方式实现,具体内容整理如下,请参考。

weixin_37864926的博客 5250

Power EM与Signal EM解决办法与原理分析

1.面对power EM,首先检查missing via,补全via,还可以加宽,加密局部power mesh,一些power IO出pin有power EM问题,可以叠加多层线和垂直方向补power形成网络降低并联电阻和提供更多电流通路解决,这种方法还可以降低ir drop。3.先进工艺有一个via ladder的方法可以解决power/signal em问题,clock cell出pin绕线或者power rail连接power stripe通过搭梯子的方式连接,原理还是分流。

m0_61544122的博客 4746

C 语言多文件编程 : 大型程序的组织与管理

本文介绍了C语言多文件编程的核心概念与实践方法。主要内容包括:1. 多文件编程的必要性:解决单文件编程在大型项目中的维护和协作问题;2. 文件组织方式:头文件(.h)负责声明接口,源文件(.c)实现具体功能;3. 编译链接过程:分阶段编译和链接多个源文件;4. 头文件设计原则:包含接口声明、使用保护机制、保持自包含性;5. 模块化实践:通过示例展示学生信息管理系统的模块划分;6. 构建工具:介绍Makefile的编写和使用方法。文章还提供了创建静态库和动态库的指导,并强调了模块化设计、信息隐藏等软件工程原则

2503_91057718的博客 1947

【亲测免费】 轻松实现C WinForm多语言界面切换:一个强大的开源解决方案

轻松实现C# WinForm多语言界面切换:一个强大的开源解决方案 【下载地址】CWinForm多语言界面切换实现 本资源文件提供了一个完整的C# WinForm应用程序示例,展示了如何实现界面的多语言切换功能。通过使用XML文件导入导出界面控件的显示文本,用户可以轻松地在不同语言之间切换,而无需重新编译应用程序 ...

gitblog_09753的博客 389

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

探索C WinForm多语言切换的便捷之道:C多语言切换Demo

探索C# WinForm多语言切换的便捷之道:C#多语言切换Demo 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当今全球化的软件开发环境中,多语言支持已成为应用程序不可或缺的一部分。为了帮助开发者轻松实现这一功能,我们推出了C#多语言切换Demo项目。这是一个基于C# WinForm的应用程序,通过XML文件管理不同语言的资源,实现了多语言切换的功能。无论您是初...

gitblog_09733的博客 881

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

c winform应用程序语言切换,C# Winform程序多语言国际化实现的一个小Demo

Demo目的:实现界面的多语言国际化编程语言:C#步骤如下:1、建立一个基于窗体的c#应用程序,在Form1窗体中添加控件label1,label2,button1;2、添加资源文件Resource1.zh-CN.resx,Resource1.zh-TW.resx,Resource1.en-US.resx;(方法:右键项目->添加类->资源文件)3、然后在资源文件resxResourc...

weixin_29531989的博客 710

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C#下WinForm多语种切换

这是应一个网友要求写的,希望对你有所帮助。本文将介绍如何在一个WinForm应用程序中实现多语种切换。通过一个简单的示例,你将了解到如何使用资源文件管理不同语言的文本,并通过用户界面实现语言切换。打开Visual Studio,创建一个新的WinForm项目。在项目创建向导中,选择合适的模板并填写项目名称。在Solution Explorer中,右键点击项目,选择。选择,并命名为(默认语言),这里默认语种为英文重复步骤1-2,命名其他语言的资源文件,例如(中文)(法语)在主窗体 (Form1。

2401_82584055的博客 1906
上一篇: C#窗体自定义控件特性(Attribute)的使用
下一篇: C#针对PropertyGrid控件修改其常用的几个特性的值
Bridge_go
博客等级 码龄9年 64粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bridge_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值