C#上位机软件支持中英文多语言切换MultiLanguage

2023-11-15

最近遇到一个项目,客户是国外的,开发上位机程序是在中国。需支持中英文多语言切换。

多语言切换思路:

使用不同的xml配置文件来映射不同的语言,窗体加载时从默认语言DefaultLanguage.xml中读取配置,比如中文语言 对应Chinese.xml
英文语言 对应English.xml
比如一个Button控件 btnLogin,因某个窗体的某一个控件的变量名是绝对唯一的
我们可以通过键值对字典来进行处理,键名都是控件的变量名称,值为控件的文本内容
中文语言在Chinese.xml 设置Name="btnLogin" Text="登录"
英文语言在English.xml 设置Name="btnLogin" Text="Login"

我们以登录窗体FormLogin和主窗体FormMain为例,来进行多语言切换显示。

新建windows窗体应用程序MultiLanguageDemo,将默认的Form1修改为FormLogin

第一步,Language配置文件

在项目MultiLanguageDemo上新建文件夹Language,在Language文件夹下新建三个xml配置文件Chinese.xml,DefaultLanguage.xml,English.xml并将其【复制到输出目录】设置为【始终复制】

 ①Chinese.xml文件内容

<?xml version="1.0" encoding="utf-8" ?>
<Root Language="Chinese">
	<Form>
		<FormName Name="MultiLanguageDemo.FormLogin" Text="登录"></FormName>
		<Controls>
			<Control Name="label1" Text="语言"/>
			<Control Name="label2" Text="账号"/>
			<Control Name="label3" Text="密码"/>
			<Control Name="chkRememberUserName" Text="记住账号"/>
			<Control Name="chkDisplayPassword" Text="显示密码"/>
			<Control Name="btnLogin" Text="登录"/>
			<Control Name="btnClose" Text="关闭"/>
		</Controls>
	</Form>
	<Form>
		<FormName Name="MultiLanguageDemo.FormMain" Text="主页"></FormName>
		<Controls>
			<Control Name="label1" Text="这是主界面"/>
			<Control Name="groupBox1" Text="操作按钮"/>
			<Control Name="btnRun" Text="运行"/>
			<Control Name="btnStop" Text="停止"/>
		</Controls>
	</Form>
</Root>

 ②DefaultLanguage.xml文件内容

<?xml version="1.0" standalone="yes"?>
<Root Language="Default Language">
  <DefaultLanguage>Chinese</DefaultLanguage>
</Root>

 ③English.xml文件内容

<?xml version="1.0" encoding="utf-8" ?>
<Root Language="English">
	<Form>
		<FormName Name="MultiLanguageDemo.FormLogin" Text="Login Page"></FormName>
		<Controls>
			<Control Name="label1" Text="Language"/>
			<Control Name="label2" Text="UserName"/>
			<Control Name="label3" Text="Password"/>
			<Control Name="chkRememberUserName" Text="Remember User Name"/>
			<Control Name="chkDisplayPassword" Text="Show Password"/>
			<Control Name="btnLogin" Text="Login"/>
			<Control Name="btnClose" Text="Close"/>
		</Controls>
	</Form>
	<Form>
		<FormName Name="MultiLanguageDemo.FormMain" Text="Main Page"></FormName>
		<Controls>
			<Control Name="label1" Text="This is the homepage"/>
			<Control Name="groupBox1" Text="operating button"/>
			<Control Name="btnRun" Text="Run"/>
			<Control Name="btnStop" Text="Stop"/>
		</Controls>
	</Form>
</Root>

第二步,关键辅助类MultiLanguageUtil

用于读取默认语言并根据选择的语言设置窗体以及该窗体的所有控件的文本内容

MultiLanguageUtil.cs源程序如下

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;

namespace MultiLanguageDemo
{
    /// <summary>
    /// 多语言切换辅助类:
    /// 思路:使用不同的xml配置文件来映射不同的语言,窗体加载时从默认语言DefaultLanguage.xml中读取配置
    /// 中文语言 对应Chinese.xml
    /// 英文语言 对应English.xml
    /// 比如一个Button控件 btnLogin,因控件的变量名是绝对唯一的
    /// 我们可以通过键值对字典来进行处理,键名都是控件的变量名称,值为控件的文本内容
    /// 中文语言在Chinese.xml 设置Name="btnLogin" Text="登录"
    /// 英文语言在English.xml 设置Name="btnLogin" Text="Login"
    /// </summary>
    public class MultiLanguageUtil
    {
        /// <summary>
        /// 获取默认语言,从 Language\DefaultLanguage.xml 配置文件中读取
        /// </summary>
        /// <returns></returns>
        public static string GetDefaultLanguage()
        {
            string defaultLanguage = "English";
            XmlReader reader = new XmlTextReader($"{AppDomain.CurrentDomain.BaseDirectory}Language\\DefaultLanguage.xml");
            XmlDocument doc = new XmlDocument();
            doc.Load(reader);
            XmlNode root = doc.DocumentElement;
            //默认语言节点  
            XmlNode node = root.SelectSingleNode("DefaultLanguage");
            if (node != null)
            {
                defaultLanguage = node.InnerText;
            }
            reader.Close();
            reader.Dispose();
            return defaultLanguage;
        }

        /// <summary>
        /// 设置默认语言
        /// </summary>
        /// <param name="defaultLanguage"></param>
        public static void SetDefaultLanguage(string defaultLanguage)
        {
            DataSet ds = new DataSet();
            ds.ReadXml($"{AppDomain.CurrentDomain.BaseDirectory}Language\\DefaultLanguage.xml");
            DataTable dt = ds.Tables["Root"];
            dt.Rows[0]["DefaultLanguage"] = defaultLanguage;
            ds.AcceptChanges();
            ds.WriteXml($"{AppDomain.CurrentDomain.BaseDirectory}Language\\DefaultLanguage.xml");
        }

        /// <summary>
        /// 读取默认语言配置,将【key=控件名称,value=语言描述】添加到字典集合中
        /// </summary>
        /// <param name="formName"></param>
        /// <param name="language"></param>
        /// <returns></returns>
        public static Dictionary<string, string> ReadXMLText(Form form, string language)
        {
            string formName = form.GetType().ToString();
            try
            {
                Dictionary<string, string> dict = new Dictionary<string, string>();
                //判断是否存在该语言的配置文件
                if (!System.IO.File.Exists($"{AppDomain.CurrentDomain.BaseDirectory}Language\\{language}.xml"))
                {
                    return dict;
                }
                XmlReader reader = new XmlTextReader($"{AppDomain.CurrentDomain.BaseDirectory}Language\\{language}.xml");
                
                XmlDocument doc = new XmlDocument();
                doc.Load(reader);
                XmlNode root = doc.DocumentElement;
                //获取XML文件中对应该窗口的内容  
                XmlNode nodeFind = root.SelectSingleNode($"Form/FormName[@Name='{formName}']");
                if(nodeFind == null)
                {
                    //如果没有配置该窗体的语言描述,就返回空
                    return dict;
                }
                //添加窗体到字典中
                dict.Add(formName, nodeFind.SelectSingleNode("@Text").InnerText);
                XmlNodeList nodeList = nodeFind.ParentNode.SelectNodes("Controls/Control");
                foreach (XmlNode node in nodeList)
                {
                    //修改内容为控件的Text值  
                    XmlNode node1 = node.SelectSingleNode("@Name");
                    XmlNode node2 = node.SelectSingleNode("@Text");
                    if (node1 != null)
                    {
                        dict.Add(node1.InnerText, node2.InnerText);
                    }
                }
                reader.Close();
                reader.Dispose();
                return dict;
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 设置窗体以及该窗体的所有控件的文本内容
        /// </summary>
        /// <param name="form">窗体</param>
        /// <param name="dict">键值对字典,键为控件名称,值为控件文本</param>
        public static void SetTextContentForAllControls(Form form, Dictionary<string, string> dict) 
        {
            string formName = form.GetType().FullName;
            if (dict.ContainsKey(formName)) 
            {
                //设置窗体的文本内容
                form.Text = dict[formName];
            }
            //设置所有控件的文本内容:只考虑已配置的控件 并且 在字典中存在的控件名称
            for (int i = 0; i < dict.Count; i++)
            {
                KeyValuePair<string, string> keyValuePair = dict.ElementAt(i);
                Control[] controls = form.Controls.Find(keyValuePair.Key, true);
                if (controls != null && controls.Length > 0)
                {
                    controls[0].Text = keyValuePair.Value;
                }
            }
        }

        /// <summary>
        /// 设置窗体以及该窗体的所有控件的文本内容
        /// </summary>
        /// <param name="form">窗体</param>
        /// <param name="language">语言标识:中文Chinese,英文English</param>
        public static void SetTextContentForAllControls(Form form, string language)
        {
            Dictionary<string, string> dict = ReadXMLText(form, language);
            SetTextContentForAllControls(form, dict);
        }
    }
}

第三步,登录窗体FormLogin和主窗体FormMain设计以及加载指定语言的文本

①窗体FormLogin设计器 FormLogin.Designer.cs代码如下:


namespace MultiLanguageDemo
{
    partial class FormLogin
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.cboLanguage = new System.Windows.Forms.ComboBox();
            this.label2 = new System.Windows.Forms.Label();
            this.chkRememberUserName = new System.Windows.Forms.CheckBox();
            this.btnLogin = new System.Windows.Forms.Button();
            this.txtUserName = new System.Windows.Forms.TextBox();
            this.label3 = new System.Windows.Forms.Label();
            this.txtPassword = new System.Windows.Forms.TextBox();
            this.chkDisplayPassword = new System.Windows.Forms.CheckBox();
            this.btnClose = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(10, 16);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(29, 12);
            this.label1.TabIndex = 0;
            this.label1.Text = "语言";
            // 
            // cboLanguage
            // 
            this.cboLanguage.FormattingEnabled = true;
            this.cboLanguage.Location = new System.Drawing.Point(77, 13);
            this.cboLanguage.Name = "cboLanguage";
            this.cboLanguage.Size = new System.Drawing.Size(283, 20);
            this.cboLanguage.TabIndex = 1;
            this.cboLanguage.SelectedIndexChanged += new System.EventHandler(this.cboLanguage_SelectedIndexChanged);
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(10, 56);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(29, 12);
            this.label2.TabIndex = 2;
            this.label2.Text = "账号";
            // 
            // chkRememberUserName
            // 
            this.chkRememberUserName.AutoSize = true;
            this.chkRememberUserName.Location = new System.Drawing.Point(366, 58);
            this.chkRememberUserName.Name = "chkRememberUserName";
            this.chkRememberUserName.Size = new System.Drawing.Size(72, 16);
            this.chkRememberUserName.TabIndex = 3;
            this.chkRememberUserName.Text = "记住账号";
            this.chkRememberUserName.UseVisualStyleBackColor = true;
            // 
            // btnLogin
            // 
            this.btnLogin.Location = new System.Drawing.Point(207, 133);
            this.btnLogin.Name = "btnLogin";
            this.btnLogin.Size = new System.Drawing.Size(75, 23);
            this.btnLogin.TabIndex = 4;
            this.btnLogin.Text = "登录";
            this.btnLogin.UseVisualStyleBackColor = true;
            this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
            // 
            // txtUserName
            // 
            this.txtUserName.Location = new System.Drawing.Point(77, 53);
            this.txtUserName.Name = "txtUserName";
            this.txtUserName.Size = new System.Drawing.Size(283, 21);
            this.txtUserName.TabIndex = 5;
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(10, 96);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(29, 12);
            this.label3.TabIndex = 6;
            this.label3.Text = "密码";
            // 
            // txtPassword
            // 
            this.txtPassword.Location = new System.Drawing.Point(77, 93);
            this.txtPassword.Name = "txtPassword";
            this.txtPassword.PasswordChar = '*';
            this.txtPassword.Size = new System.Drawing.Size(283, 21);
            this.txtPassword.TabIndex = 7;
            // 
            // chkDisplayPassword
            // 
            this.chkDisplayPassword.AutoSize = true;
            this.chkDisplayPassword.Location = new System.Drawing.Point(366, 98);
            this.chkDisplayPassword.Name = "chkDisplayPassword";
            this.chkDisplayPassword.Size = new System.Drawing.Size(72, 16);
            this.chkDisplayPassword.TabIndex = 8;
            this.chkDisplayPassword.Text = "显示密码";
            this.chkDisplayPassword.UseVisualStyleBackColor = true;
            this.chkDisplayPassword.CheckedChanged += new System.EventHandler(this.chkDisplayPassword_CheckedChanged);
            // 
            // btnClose
            // 
            this.btnClose.Location = new System.Drawing.Point(308, 133);
            this.btnClose.Name = "btnClose";
            this.btnClose.Size = new System.Drawing.Size(75, 23);
            this.btnClose.TabIndex = 9;
            this.btnClose.Text = "关闭";
            this.btnClose.UseVisualStyleBackColor = true;
            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
            // 
            // FormLogin
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(562, 194);
            this.Controls.Add(this.btnClose);
            this.Controls.Add(this.chkDisplayPassword);
            this.Controls.Add(this.txtPassword);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.txtUserName);
            this.Controls.Add(this.btnLogin);
            this.Controls.Add(this.chkRememberUserName);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.cboLanguage);
            this.Controls.Add(this.label1);
            this.Name = "FormLogin";
            this.Text = "多语言切换示例";
            this.Load += new System.EventHandler(this.FormLogin_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.ComboBox cboLanguage;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.CheckBox chkRememberUserName;
        private System.Windows.Forms.Button btnLogin;
        private System.Windows.Forms.TextBox txtUserName;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.TextBox txtPassword;
        private System.Windows.Forms.CheckBox chkDisplayPassword;
        private System.Windows.Forms.Button btnClose;
    }
}

②窗体FormLogin.cs源程序如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MultiLanguageDemo
{
    public partial class FormLogin : Form
    {
        public FormLogin()
        {
            InitializeComponent();
            cboLanguage.Items.AddRange(new string[] 
            {
                "中文",
                "English"
            });
            cboLanguage.SelectedIndex = 0;
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        FormMain formMain;
        private void btnLogin_Click(object sender, EventArgs e)
        {
            //设置默认语言
            MultiLanguageUtil.SetDefaultLanguage(cboLanguage.SelectedIndex == 0 ? "Chinese" : "English");
            if (formMain == null || formMain.IsDisposed)
            {
                formMain = new FormMain();
                formMain.Show();
            }
            else 
            {
                formMain.Activate();
            }
        }

        private void chkDisplayPassword_CheckedChanged(object sender, EventArgs e)
        {
            if (chkDisplayPassword.Checked)
            {
                txtPassword.PasswordChar = '\0';
            }
            else 
            {
                txtPassword.PasswordChar = '*';
            }
        }

        private void FormLogin_Load(object sender, EventArgs e)
        {
            string language = MultiLanguageUtil.GetDefaultLanguage();
            MultiLanguageUtil.SetTextContentForAllControls(this, language);
            if (language == "Chinese")
            {
                cboLanguage.SelectedIndex = 0;
            }
            else if (language == "English")
            {
                cboLanguage.SelectedIndex = 1;
            }
        }

        private void cboLanguage_SelectedIndexChanged(object sender, EventArgs e)
        {
            string language = string.Empty;
            if (cboLanguage.SelectedIndex == 0) 
            {
                language = "Chinese";
            }
            else if (cboLanguage.SelectedIndex == 1)
            {
                language = "English";
            }
            //过滤掉未选中语言
            if (cboLanguage.SelectedIndex >= 0) 
            {
                MultiLanguageUtil.SetTextContentForAllControls(this, language);
            }
        }
    }
}

③窗体设计器FormMain.Designer.cs源程序如下


namespace MultiLanguageDemo
{
    partial class FormMain
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.btnRun = new System.Windows.Forms.Button();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.btnStop = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Font = new System.Drawing.Font("宋体", 20F);
            this.label1.Location = new System.Drawing.Point(149, 52);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(147, 27);
            this.label1.TabIndex = 0;
            this.label1.Text = "这是主界面";
            // 
            // btnRun
            // 
            this.btnRun.Font = new System.Drawing.Font("宋体", 15F);
            this.btnRun.Location = new System.Drawing.Point(117, 29);
            this.btnRun.Name = "btnRun";
            this.btnRun.Size = new System.Drawing.Size(75, 50);
            this.btnRun.TabIndex = 1;
            this.btnRun.Text = "运行";
            this.btnRun.UseVisualStyleBackColor = true;
            // 
            // groupBox1
            // 
            this.groupBox1.Controls.Add(this.btnStop);
            this.groupBox1.Controls.Add(this.btnRun);
            this.groupBox1.Font = new System.Drawing.Font("宋体", 15F);
            this.groupBox1.Location = new System.Drawing.Point(75, 152);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(339, 100);
            this.groupBox1.TabIndex = 2;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "操作按钮";
            // 
            // btnStop
            // 
            this.btnStop.Font = new System.Drawing.Font("宋体", 15F);
            this.btnStop.Location = new System.Drawing.Point(229, 29);
            this.btnStop.Name = "btnStop";
            this.btnStop.Size = new System.Drawing.Size(75, 50);
            this.btnStop.TabIndex = 2;
            this.btnStop.Text = "停止";
            this.btnStop.UseVisualStyleBackColor = true;
            // 
            // FormMain
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(653, 382);
            this.Controls.Add(this.groupBox1);
            this.Controls.Add(this.label1);
            this.Name = "FormMain";
            this.Text = "主界面";
            this.Load += new System.EventHandler(this.FormMain_Load);
            this.groupBox1.ResumeLayout(false);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Button btnRun;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.Button btnStop;
    }
}

④窗体FormMain.cs源程序如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MultiLanguageDemo
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            string language = MultiLanguageUtil.GetDefaultLanguage();
            MultiLanguageUtil.SetTextContentForAllControls(this, language);
        }
    }
}

第四步,程序运行多语言切换如图:

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#上位机软件支持中英文多语言切换MultiLanguage 的相关文章

随机推荐

  • 基于Sqli-Labs靶场的SQL注入-29~31关

    目录 Less 29 基于GET 双服务器 单引号 字符型注入 双服务器解析 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less 30 基于GET 双服务器 双引号 字符型注入 Less 31 基于GET 双服务器 双引号加括号 字符型
  • Java Web: JDBC、数据库连接池、Maven

    1 JDBC JDBC 全称Java DataBase Connection Java 数据库连接 在前面我们已经学习过Java和DataBase 数据库 了 JDBC就是使用Java语言操作关系型数据的一套API 本质上就是一个接口 用于
  • java实现 手写体识别_java手写体英文数字识别系统 识别预处理如何实现 采用什么语言比较好...

    展开全部 转载 1 引言 手写体数字识别是文字识别中的一个研究课题 是多年来的研究热点 也是模62616964757a686964616fe4b893e5b19e31333337373638式识别领域中最成功的应用之一 由于识别类型较少 在
  • 微信小程序:横向滚动卡片列表模板

    文章目录 1 前言 2 代码详解 3 样例展示 4 结语 1 前言 在开发微信小程序时 横向可滚动卡片列表是一个必不可缺的页面组件 其不仅美观还可以节省屏幕空间 具体截图如下 2 代码详解 主要用的是scroll x 具体代码如下 wxml
  • 开启win10下Ubuntu子系统的SSH服务 并设置为开机启动

    Win10中安装Ubuntu子系统后默认是没有开启SSH服务的 需要手动配置开启 1 先通过 bash 进入子系统修改配置 vi etc ssh sshd config 备注 输入i 表示键入 按键 ESC 外加 冒号 WQ 退出保存 如果
  • 笔记,后期整理

    VM 虚拟各种系统的工具 安装目录 不要放在C盘 需要下载的镜像Windows NT win7 xp server08R2 server12类Nnix centos 6 7 8 ubuntu 14 16 18 kali安装 win7 1g
  • Android TabLayout控件

    前言 TabLayout是5 0版本出现的控件 显示水平方向的tab页 需要添加Design依赖库 并且使用Theme AppCompat主题 1 TabLayout类 布局文件
  • 程序语言翻译器的设计与实现----算术表达式转换四元式(编译原理)

    此篇博客是将前面的内容进行整合并进一步提升 真正实现一个简单表达式语法的编译器 如果有不了解的地方请查看下面链接 词法分析 LR 1 分析 一 LR 1 分析 二 这里说的程序语言编译器是指将算术表达式部分进行翻译 暂时不包括优化以及目标语
  • Failed to execute /linuxrc. Attempting defaults... 解决方案

    今天想移植个根文件系统 使用的板子是友善之臂的S3C2440 这个很多书上都有介绍 难度倒也不是很大 按照手册一步步的来 移植完之后 烧写到flash里面 发现不能运行 怎么回事 检查了一遍 发现和教材上一样 难道教材有问题 在网上找了移植
  • MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]

    MarshalAs 指示如何在托管代码和非托管代码之间封送数据 简单点说 托管代码是一Microsoft的中间语言 它主要的作用是在 NET Farmework的CLR执行代码前去编译源代码 也就是说托管代码充当着翻译的作用 源代码在运行时
  • 初识网络原理

    目录 局域网 简称LAN 广域网 IP地址 端口号 协议 协议分层 互联网的分层 网络设备的分层 封装和分用 局域网 简称LAN 简单来说就是把两台或多台机器连接在一起 局部组建的一种私有网络 局域网内的主机之间能方便的进行网络通信 而局域
  • Mysql 数据库创建用户,管理用户权限

    一 创建用户 为什么要创建不同的用户呢 因为root用户权限太大 为了安全起见 创建不同的用户 并赋予不同的权限 可以有效保证数据库的安全 1 使用 root 用户登录 Mysql mysql u root p 注意 若 mysql u r
  • 两波形相位差的计算值_连续模式PFC功率MOSFET电流有效值、平均值计算

    中大功率的ACDC电源都会采用有源功率因数校正PFC电路来提高其功率因数 减少对电网的干扰 在PFC电路中 常用的结构是BOOST电路 功率MOSFET工作在开关状态 将输入的电流斩波为和输入正弦波电压同相位的 具有正弦波包络线的开关电流波
  • linux日志清理脚本

    日常日志清理脚本 1 压缩文件 SUFFIX date d yesterday Y m d CURRENT date s echo CURRENT 压缩 FILES data logs shop nohup for file in FILE
  • 技术宅学会几招FFmpeg

    有些时候 我需要对某个视频文件做一些简单的处理 也或者是受亲戚朋友的委托吧 又不好意思推辞 因为人家觉得你是搞技术的 这点小事应该能轻松搞定 但是 我犯不着为这点事去安装一个笨重的多媒体软件 我也不想去网上随便找个免费的小工具 怕它不干净
  • C++ 惯用法之 PIMPL

    背景 PIMPL 是 C 中的一个编程技巧 意思为指向实现的指针 具体操作是把类的实现细节放到一个单独的类中 并用一个指针进行访问 二进制兼容性 概述 二进制兼容是指当库文件升级后所有使用该库的应用程序不必重新编译 其本质就是类的内存布局不
  • 闭环系统的零极点图判定稳定性_负反馈系统

    负反馈的作用机理是 当受外在激励或外界干扰时 系统将通过负反馈抑制或者减弱这种外在激励或者干扰 而使系统达到一个新的平衡状态 负反馈系统在工作过程是一个闭环系统 而分析开环特性只是辅助理解 因为闭环系统不容易模拟 模型不直观 在图1 1 a
  • 测试总结报告写法简单总结

    1 编写目的 编写目的先总的说本文档是什么文档 编写此文档的目的是什么 总的说一下 然后在写以下具体的编写目的 最后的预期读者从需求里粘过来 2 项目背景 从方案中粘项目背景 完全粘过来 不用任何改动 3 测试参考文档 参考文档写任务书和需
  • window重启Nginx的BAT脚本

    1 脚本入参 SET NGINX DIR C Zone nginx 1 21 4 nginx 1 21 4 该路径配置成nginx的根目录文件夹 2 Nginx管理脚本 echo off chcp 65001 color 0a rem 当前
  • C#上位机软件支持中英文多语言切换MultiLanguage

    最近遇到一个项目 客户是国外的 开发上位机程序是在中国 需支持中英文多语言切换 多语言切换思路 使用不同的xml配置文件来映射不同的语言 窗体加载时从默认语言DefaultLanguage xml中读取配置 比如中文语言 对应Chinese