C# 界面控件中英切换

news2024/11/28 18:43:59

编程软件:VS 2015

需求:界面有两个按钮,点击可以将界面上所有控件进行不同语言的切换。

一共两种方案,个人认为第二种方案使用范围更广(这里以中英文切换为例)。

方案一:如图所示,建立两个资源文件

将所需控件的中英文分别填入对应的资源文件中,如下图所示:

代码如下:

        public void ApplyResource(Control control)
        {
            switch (Thread.CurrentThread.CurrentCulture.Name)
            {
                case "en":
                    crm = new ComponentResourceManager(typeof(Resource.Resource_en));
                    break;
                case "zh":
                    crm = new ComponentResourceManager(typeof(Resource.Resource_zh));
                    break;
                default:
                    crm = new ComponentResourceManager(typeof(Resource.Resource_zh));
                    break;
            }
            applyControl(control.GetType().Name, control);//调用
        }
        //递归应用到控件
        private void applyControl(string topName, Control control)
        {
            foreach (Control ctl in control.Controls)
            {
                crm.ApplyResources(ctl, topName + "." + ctl.Name, Thread.CurrentThread.CurrentCulture);
                if (ctl.HasChildren)
                {
                    applyControl(topName, ctl);
                }
            }
        }

创建两个按钮,分别是中文和英文,将方法引用就可以了。

        private void 中文ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            中文按钮是否触发 = true;
            英文按钮是否触发 = false;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("zh");//中文
            ApplyResource(注册界面对象);//传入当前的界面
        }

        private void 英文ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            英文按钮是否触发 = true;
            中文按钮是否触发 = false;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en");//英文
        }

该方法的缺点在于:界面布局不能自适应,如果英文名和中文名长度不一致就会导致布局发生变化,控件相互遮挡的情况。

 方案二:如图所示,将界面的Language改为英语

这样的操作就有有两个注册界面,一个中文的,一个英文的,可以各自调整各自的布局。切换不同的语言,显示不同的界面(界面上的控件翻译自己来)

方案一和二完全不掺和,方案二不需要建立资源文件!

代码(可以在界面加载的时候从新定义界面大小):

这个代码适用于控件嵌套控件

        public void 英文()
        {
            this.Text = "Registration interface";
            this.Size = new Size(1001, 669);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en"); //英文是en

            遍历界面控件(this);
        }
        public void 中文()
        {
            this.Text = "注册界面";
            this.Size = new Size(1001, 669);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh"); //英文是en

            遍历界面控件(this);
        }

        private void 遍历界面控件(Control fatherControl)
        {
            //结果:能获取到绝大多数控件
            //问题:Timer、ContextMenuStrip等控件获取不到
            ComponentResourceManager resources = new ComponentResourceManager(typeof(注册界面));
            Control.ControlCollection sonControls = fatherControl.Controls;
            foreach (Control control in sonControls)
            {
                if (control.Controls != null)
                {
                    遍历界面控件(control);
                    resources.ApplyResources(control, control.Name);
                }
            }
        }

如果各个控件之间不存在嵌套关系,可以用如下代码:

        public void 英文()
        {
            this.Text = "Input settings";
            this.Size = new Size(444, 340);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en"); //英文是en
            ComponentResourceManager resources = new ComponentResourceManager(typeof(注册界面));

            foreach (Control ct in this.Controls)//循环当前界面所有的控件(但是遍历不到控件中包含控件的控件)
            {
                resources.ApplyResources(ct, ct.Name);
                if (ct.HasChildren)
                {
                    resources.ApplyResources(ct, ct.Name);
                }
            }
        }
        public void 中文()
        {
            this.Text = "输入设置";
            this.Size = new Size(297, 343);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh"); //英文是en
            ComponentResourceManager resources = new ComponentResourceManager(typeof(注册界面));

            foreach (Control ct in this.Controls)//循环当前界面所有的控件
            {
                resources.ApplyResources(ct, ct.Name);
                if (ct.HasChildren)
                {
                    resources.ApplyResources(ct, ct.Name);
                }
            }

        }

创建两个按钮,分别是中文和英文,将方法引用就可以了。

        private void zhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            中文按钮是否触发 = true;
            英文按钮是否触发 = false;
            注册界面对象.中文();
        }

        private void enToolStripMenuItem_Click(object sender, EventArgs e)
        {
            英文按钮是否触发 = true;
            中文按钮是否触发 = false;
            注册界面对象.英文();
        }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.奖牌的数量

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/447 题目描述 小爱获得了 𝑎a 枚金牌,…

windows10使用触控板、鼠标(magic trackpad)———附带BootCamp6驱动下载链接

文章目录 0 背景1 步骤1.1 下载1.2 解压1.3 安装驱动 参考 0 背景 最近在台式机(windows10系统)上使用mac设备,键盘magic keybord连上数据线就可以直接使用,但是触控板magic trackpad却不行,只有鼠标左键,…

Steam下载游戏很慢?一个设置解决!

博主今天重装系统后,用steam下载发现巨慢 500MB,都要下载半小时。 平时下载软件,一般1分钟就搞定了,于是大致就知道,设置应该出问题了 于是修改了,如下设置之后,速度翻了10倍。 如下&#x…

【Docker系列】跨平台 Docker 镜像构建:深入理解`--platform`参数

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ChromaDB初探

探索ChromaDB 在当今数据驱动的世界中,随着人工智能和机器学习的广泛应用,如何高效地存储、检索和操作大量向量数据成为了一个关键问题。ChromaDB作为一种强大的向量数据库,正在为解决这一问题提供全新的解决方案。在这篇博客中,…

2024年会计、金融与工商管理国际会议(ICAFBA 2024)

2024年会计、金融与工商管理国际会议 2024 International Conference on Accounting, Finance, and Business Administration 【1】会议简介 2024年会计、金融与工商管理国际会议是一场集合了全球会计、金融与工商管理领域专家学者的学术盛会。此次会议旨在深入探讨会计、金融与…

决策树Decision Tree

目录 一、介绍发展优点缺点基本原理 二、熵1、熵2、条件熵3、信息增益4、信息增益率 三、基尼系数四、ID3算法1、建树过程2、优点3、缺点 五、C4.51、二分法处理连续变量1、流程:2、示例 2、缺点 六、CART1、连续数据处理2、离散数据处理3、CART回归原理1、均方误差…

群晖上Docker下载的几种方式

前言 去年大概也是这个时候,有不少人在问 docker 查询注册表失败的问题 文章传送门:开源URL短链接服务Shlink 这次似乎问题更严重一些,不仅仅是不能查询注册表,而是连 docker pull 都不行了 # 镜像拉取测试 docker pull alpine:…

FreeRTOS基础(十二):信号量

本篇博客,我们详细介绍另一个重要的应用,信号量。 目录 一、信号量的简介 1.0 举例理解 1.1 FreeRTOS中的应用 1.2 队列与信号量的对比 二、二值信号量 2.1 二值信号量的概念 2.2 二值信号量的API函数接口 2.2.1 使用二值信号量的过程 2.2.2 …

[linux] makefilegdb理解

目录 Linux项目自动化构建工具-make/Makefile 背景 理解 依赖关系 依赖方法 原理 Linux调试器-gdb使用 背景 开始使用 Linux项目自动化构建工具-make/Makefile 背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工…

Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

关于python中的列表和元组

变量就是一块内存空间,用来表示/存储数据 如果表示的数据较少,直接定义几个变量就行了 但是也有的时候,要表示的数据就比较多,如果只是通过定义一个变量来表示一个数据的话,这样的工作效率太低, 所以在p…

C++基础教程

目录 一.简介 二.基本语法 三. 面向对象 四.总结 一.简介 C 是一种高级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C 可运行于多种平台上,如 Win…

梯度下降: 02. 批量梯度下降BGD,随机梯度下降SGD,小批量梯度下降MBGD

简介 本文从原理上介绍了三种梯度下降的方法,相同点,异同点,优缺点。 内容包含了数学公式的推导与说明 1. 梯度下降的3种方法 梯度下降分三类,原理基本相同,操作方式略有区别 批量梯度下降BGD(BatchGradient Descent):使用全量数据进行特征抽取,模型训练小批量梯度下降…

【C++题解】1265. 爱因斯坦的数学题

问题:1265. 爱因斯坦的数学题 类型:简单循环 题目描述: 爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨 2 阶,则最最后剩一阶,若每步跨 3 阶,则最后剩 2 阶,若每…

webapi跨越问题

由于浏览器存在同源策略,为了防止 钓鱼问题,浏览器直接请求才不会有跨越的问题 浏览器要求JavaScript或Cookie只能访问同域下的内容 浏览器也是一个应用程序,有很多限制,不能访问和使用电脑信息(获取cpu、硬盘等&#…

JWT 从入门到精通

什么是 JWT JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案 JSON Web Token Introduction - jwt.ioLearn about JSON Web Tokens, what are they, how they work, when and why you should use them.https://jwt.io/introduction 一、常见会…

Kimichat使用案例010:快速识别出图片中的表格保存到Excel

文章目录 一、介绍二、图片信息三、输入内容四、输出内容五、markdown提示词六、markdown输出一、介绍 如果有一张图片格式的表格,想要快速复制到Excel表格中,那么一般要借助于OCR工具。之前试过不少在线OCR工具,识别效果差强人意。其实,kimichat就可以非常好的完成这个任务…

王学岗鸿蒙开发(北向)——————(四、五、六)ArkUi声明式组件

普通组件 1,注意,如上图,build只能有一个根节点 2,Entry表示程序的入口 Component表示自定义的组件 Preview表示可以预览 3,图片存放的地方 4, Image组件最好只给宽度,给了高度又给宽度容易失真。 build() {Row() {/…

Scanpy(3)单细胞数据分析常规流程

单细胞数据分析常规流程 面对高效快速的要求上,使用R分析数据越来越困难,转战Python分析,我们通过scanpy官网去学习如何分析单细胞下游常规分析。 数据3k PBMC来自健康的志愿者,可从10x Genomics免费获得。在linux系统上,可以取消注释并运行以下操作来下载和解压缩数据。…