《和小雷一起学开发》 之 C#的国际化方法

博主按: 《和小雷一起学开发》系列为电子、软件开发的入门系列教程,旨在实际解决初学者开发中遇到的问题,每次解决一个小问题。面向的读者是大专院校学生、应届毕业生、助理工程师及电子、软件爱好者。发表的前后顺序并无关联,有机会的话后期会整理成册。欢迎转载,转载请注明出处。

本次主题:C#的国际化方法

编程语言:C#

开发环境:VS2010

====正文====

  使用C#进行软件开发,常常涉及到国际化的问题,一个国际化的软件至少要包含“中文(简体)”和“英文(美国)”这两种语言才能显出高大上来吧,理想的情况当然是能够在程序运行过程当中动态切换语言。实现国际化的方法比较多,网上介绍的文章也不少,但有些并不很完整,有些并不方便,有些还有错误。针对这种情况,本文给出了一种非常方便且好用的方法,也是小雷自己常用的方法。该方法主要有以下优点:

1. 利用VS2010,无论在编程初期、中期或后期都可以随时用此方法来进行国际化,灵活方便。

2. 国际化的不仅仅是语言,还包括布局,好处显而易见,可以使不同语言完整显示。

3. 编程环节少,过程容易理解。

好, 下面就和小雷一起来看一下:把大象关冰箱里总共分几步?

第一步: 当然需要一个例子,这里使用一个我制作的简单程序。界面如下:


Form1中的“中文”和“English”两个按钮用作语言切换。 “弹出对话框”按钮用来弹出一个新的对话框Form2,这是我们程序中常见的结构。

到现在为止,一切和我们正常编程没什么两样。

第二步:制作英文菜单。

在窗口编辑器中选中“Form1”,然后在右侧的属性窗口找到“Language”属性。如下图:

  此时的“解决方案资源管理器”中Form1是这样的:

Language属性默认是(Default),因为我们现在要做另一个英文界面,所以在下来菜单中选择“英语(美国)”, 如下图:


这时“设计管理器”中变成这样:, 按“Ctrl+S”保存一下。

就在这个状态下编辑英文菜单,如下图:


这里要注意一下: 英文界面中的Label和Button尺寸明显和中文界面中的不同,为了完整显示字符。

编辑完成后再保存一下,此时会发现在“解决方案资源管理器”中自动生成了一个新的资源文件:Form1.en-US.resx,这个文件其实是Form1.resx的一个副本,但是改动了其中的字符串的值为英文。大家可以仔细对比一下这两个文件。

接下来用同样的方法制作Form2的英文菜单,如下:


第三步:制作中文菜单

由于默认的就是中文界面,这里只需要在生成一个中文的资源文件就可以了,方法很简单。 在刚才的步骤完成后,选择“Language”下拉菜单中的“中文(中国)”,如下图:


这时候什么都不用改,直接Ctrl+S保存,注意到此时还没有生成我们想要的资源文件,没关系,再次选择“Language”下拉菜单,切换到(Default), 然后随便改一点什么,比如把“Form1”改成“界面1”,然后再保存。这时就自动生成了一个“Form1.zh-CN.resx"文件。如下图:



同理,生成Form2的中文资源文件,如下图:



第四步: 完成动态切换功能。

 这一步要用到ComponentResourceManager类和其中的ApplyResources方法。

在Form1.cs文件中,class Form1中添加以下代码:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));  
  2. private void ApplyResource()  
  3. {  
  4.     foreach (Control ctl in this.Controls)  
  5.     {  
  6.         resources.ApplyResources(ctl, ctl.Name);  
  7.     }  
  8.     this.ResumeLayout(false);  
  9.     this.PerformLayout();  
  10.     resources.ApplyResources(this"$this");  
  11. }  

接下来分别写“中文”和“English”两个按钮的响应方法,如下:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private void button2_Click(object sender, EventArgs e)  
  2. {  
  3.     Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");  
  4.     ApplyResource();  
  5. }  
  6.   
  7. private void button3_Click(object sender, EventArgs e)  
  8. {  
  9.     Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");  
  10.     ApplyResource();  
  11. }  

这里注意要using System.Threading;一下。

第五步:运行一下看效果
可以看到:
  1. “界面1”的中英文的切换成功。
  2. 中英文的布局都按照之前的调整了,没有出现文字显示不完全的情况。
  3. 弹出的“界面2”也能自动切换语言。


第六步:举一反三,请大家思考以下问题,欢迎跟帖讨论。
   问题1:不是写在界面中的语言如何切换? 如在程序运行中对string的赋值,向下面这样:
                  string str = "这个如何切换成英文?";


   问题2:AppResource方法中的 foreach (Control ctl in this.Controls) 就能够遍历所有的控件了吗? 多级的控件怎么办? 这时候还好用吗? 怎样修改才好用?


附加: 本文用到的例子源码。 《和小雷一起学开发》 之 C#的国际化方法
====以上====

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值