1. 简体中文

2. 繁体中文

3. 英文

下面子丰介绍一下实现的过程:

1. 为每个窗口创建相应语言的resx文件。子丰以英文为例,右键->添加->新建项->资源文件,文件名为窗口名.en-US,如上面的两个窗口,分别为LoginForm.en-US.resx和PasswordForm.en-US.resx。简体中文为LoginForm.zh-CN.resx和PasswordForm.zh-CN.resx,繁体中文为LoginForm.zh-CHT.resx和PasswordForm.zh-CHT.resx。下面给出LoginForm.en-US.resx文件的截图。

2. 在项目的Properties的Settings.settings中添加变量DefaultLanguage,用于保存当前设置的默认语言。当下次启动程序时,会读取该变量,从而将程序的语言设置为上次程序关闭时的语言。

3. 创建一个静态类(MultiLanguage.cs)用于编写与切换语言相关的变量和代码。

(1)变量DefaultLanguage,用于保存当前默认语言

(2)函数SetDefaultLanguage修改当前默认语言

/// <summary>
/// 修改默认语言
/// </summary>
/// <param name="lang">待设置默认语言</param>
public static void SetDefaultLanguage(string lang)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
DefaultLanguage = lang;
Properties.Settings.Default.DefaultLanguage = lang;
Properties.Settings.Default.Save();
}
 

(3)函数LoadLanguage用于加载语言或切换语言

/// <summary>
/// 加载语言
/// </summary>
/// <param name="form">加载语言的窗口</param>
/// <param name="formType">窗口的类型</param>
public static void LoadLanguage(Form form, Type formType)
{
if (form != null)
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
resources.ApplyResources(form, "$this");
Loading(form, resources);
}
} /// <summary>
/// 加载语言
/// </summary>
/// <param name="control">控件</param>
/// <param name="resources">语言资源</param>
private static void Loading(Control control, System.ComponentModel.ComponentResourceManager resources)
{
if (control is MenuStrip)
{
//将资源与控件对应
resources.ApplyResources(control, control.Name);
MenuStrip ms = (MenuStrip)control;
if (ms.Items.Count > )
{
foreach (ToolStripMenuItem c in ms.Items)
{
//遍历菜单
Loading(c, resources);
}
}
} foreach (Control c in control.Controls)
{
resources.ApplyResources(c, c.Name);
Loading(c, resources);
}
} /// <summary>
/// 遍历菜单
/// </summary>
/// <param name="item">菜单项</param>
/// <param name="resources">语言资源</param>
private static void Loading(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
if (item is ToolStripMenuItem)
{
resources.ApplyResources(item, item.Name);
ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
if (tsmi.DropDownItems.Count > )
{
foreach (ToolStripMenuItem c in tsmi.DropDownItems)
{
Loading(c, resources);
}
}
}
}

4. 在主窗口的Load事件中读取Properties.Settings.Default.DefaultLanguage,并将ComboBox赋值为当前默认语言,即简体中文、繁体中文或英文。

private void LoginForm_Load(object sender, EventArgs e)
{
//设置combobox的值
string language = Properties.Settings.Default.DefaultLanguage;
if (language == "zh-CN")
{
languageTxt.Text = "简体中文(默认)";
}
else if (language == "zh-CHT")
{
languageTxt.Text = "繁體中文";
}
else if (language == "en-US")
{
languageTxt.Text = "English";
}
}

5. 在每个窗口的Load事件中调用函数MultiLanguage.LoadLanguage,使窗口在出现时即显示为当前默认语言。

private void PasswordForm_Load(object sender, EventArgs e)
{
//加载语言
MultiLanguage.LoadLanguage(this, typeof(PasswordForm));
}

6. 编写用于切换语言的ComboBox的SelectedIndexChanged事件,使得当用户选择对应的语言时,程序会切换到该语言。

//切换语言
private void languageTxt_SelectedIndexChanged(object sender, EventArgs e)
{
languageTxt.Enabled = false;
if (languageTxt.Text == "简体中文(默认)")
{
//修改默认语言
MultiLanguage.SetDefaultLanguage("zh-CN");
//对所有打开的窗口重新加载语言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
else if (languageTxt.Text == "繁體中文")
{
//修改默认语言
MultiLanguage.SetDefaultLanguage("zh-CHT");
//对所有打开的窗口重新加载语言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
else if (languageTxt.Text == "English")
{
//修改默认语言
MultiLanguage.SetDefaultLanguage("en-US");
//对所有打开的窗口重新加载语言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
languageTxt.Enabled = true;
} private void LoadAll(Form form)
{
if (form.Name == "LoginForm")
{
MultiLanguage.LoadLanguage(form, typeof(LoginForm));
}
else if (form.Name == "PasswordForm")
{
MultiLanguage.LoadLanguage(form, typeof(PasswordForm));
}
}

转自:http://blog.csdn.net/softimite_zifeng/article/details/54177825

 

C#的Winform多语言实现(resx文件)的更多相关文章

  1. C#Winform中resx文件无效 找不到路径

    问题由来 笔者因为更改了添加的图片的路径,再把路径改成图片所在的路径还是报resx文件无效,未能找到路径 问题原因 其实这个问题是因为对对象的引用修改了,但是resx文件中的应用还是没有修改.因为re ...

  2. .resources文件转.resx 文件

    最近在进行.net winform应用程序的反向工程,资源文件反向出来后都是.resources文件,工程编译和运行都没有问题,但.resources文件为二级制文件,无法在Visual Studio ...

  3. WinForm多语言版本实战项目演练

    一.课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象".俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这 ...

  4. winform 不同语言(中文,英文等)

    Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.注意黑体处为关键点.一. 窗体本地化    对于Windows 窗体,你需要做的第 ...

  5. .NET的资源并不限于.resx文件

    为了构建一个轻量级的资源管理框架以满足简单的本地化(Localization)的需求,我试图直接对现有的Resource编程模型进行扩展.虽然最终没能满足我们的需求,但是这两天也算对.NET如何进行资 ...

  6. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  7. resx文件在X64位编译,提示“未能加载文件或程序集”的问题?

    原文:resx文件在X64位编译,提示"未能加载文件或程序集"的问题? resx文件在X64位编译,提示"未能加载文件或程序集"的问题? 解答: 错误现象如下 ...

  8. C语言样式的文件操作函数

    使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...

  9. c语言的头文件-不是c++类的头文件?

    下面的概述是参考的这篇文章:http://blog.csdn.net/bingxx11/article/details/7771437 c语言编程中也有,也需要头文件, 头文件不只是C++的类才需要! ...

随机推荐

  1. 云计算核心组件--keystone身份认证服务(5)

    一.Keystone介绍: keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等 ...

  2. Linux常用命令详解(1)

    基础命令: ls man pwd cd mkdir echo touch cp mv rm rmdir cat more less head tail clear poweroff reboot 命令 ...

  3. java将base64解析图片保存到本地。

    将base64解析图片保存到本地的两个方法 /** * base64转图片 * @param base64str base64码 * @param savePath 图片路径 * @return */ ...

  4. PHP7 开启Zend Opcache

    PHP7 开启Zend Opcache 作为PHP这10年来最大的版本与性能升级,PHP7在多次的测试中都表现出很夸张的性能提升,然而,为了让它能发挥出最大的性能,需要手动开启PHP自带的opcach ...

  5. 安装Composer与PsySH

    Windows安装Composer 需要开启 openssl 配置:打开 php 目录下的 php.ini,将 extension=php_openssl.dll 前面的分号去掉就可以了. https ...

  6. ORM中的锁和事务

    锁 sql语句加锁 select * from book where id=1 for update; begin; start transaction; select * from t1 where ...

  7. split、paste命令

    一.split分割文件 语法       split [OPTION] ... [INPUT [PREFIX]] 描述       将固定大小的INPUT输出到PREFIXaa,PREFIXab,.. ...

  8. 剑指offer-数字在排序数组中出现的次数-数组-python

    题目描述 统计一个数字在排序数组中出现的次数.   python 内置函数 count()一行就能搞定   解题思路 二分查找到给定的数字及其坐标.以该坐标为中点,向前向后找到这个数字的 始 – 终 ...

  9. 为什么单线程的Redis却能支撑高并发

    Redis的高并发和快速原因 redis是基于内存的,内存的读写速度非常快: 核心是基于非阻塞的IO多路复用机制: redis是单线程的,反而省去了很多上下文切换线程的时间: 为什么Redis是单线程 ...

  10. Hadoop环境安装和集群创建

    虚拟机使用vmware,vmware可以直接百度下载安装 秘钥也能百度到 安装很简单 CentOS 7下载: 进入官网 https://www.centos.org/download/ 这里有三种 第 ...