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. 字符串——AC自动机

    目录 一.前言 二.思路 三.代码 四.参考资料 一.前言 以前一直没学AC自动机,主要是被名字吓到了,自动AC,这么强的名字肯定很难,学了后才发现,其实不难. AC自动机并不是Acept autom ...

  2. 网页制作入门——HTML(2)编码与字符实体

    在上一期,我们顺口提到了——你写的网页在打开后,可能发现只是一串乱码.那么这是为什么呢? 这就是编码的神奇力量! 八卦的启示——什么是编码? 编码的思想,很早就在中国诞生了,从还不太明朗的结绳记事.算 ...

  3. shell - python 函数式编程 -- 经典例子 + 让数据自增 + while + > /dev/null 2>&1 & crontab

    1.shell #!/bin/bash anynowtime="date +'%Y-%m-%d %H:%M:%S'" NOW="echo [\`$anynowtime\` ...

  4. 影响mysql主从延迟速度的相关参数

    1.sync-binlog MySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去. 默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自 ...

  5. GS7 安装使用Oracle19c 客户端的说明

    1. 最近Oracle放出了 windows版本的oracle19c的安装文件(具体时间不详, 自己知道的时候比较晚了) 2. 发现文件其实比较多如图示: 3. 经过自己测试实现发现 不能使用  如下 ...

  6. iframe高度/宽度自适应(使用body而不是docuemntElement对象)

    iframe在ie11中会显示过于短.为了自适应,增加如下代码: <iframe *** onload='changeFrameHeight()' > <script> fun ...

  7. 2017.10.28 C组比赛总结

    这次比赛有点坑... [GDKOI2004]石子游戏 方法:判断奇偶性 输入n 如果n是奇数,输出 xiaoshi 如果n是偶数,输出 xiaoyong 比赛得分:30 错因:找错规律了(忘记了两个人 ...

  8. Dedesql数据库类详解(二次开发必备教程)

    其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结合例子去介 ...

  9. jQuery扁平化风格手风琴菜单

    在线演示 本地下载

  10. springboot添加https

    一.使用JDK工具keytool生成证书 keytool命令详解 https://blog.csdn.net/zlfing/article/details/77648430 keytool -genk ...