WinForm中多国语言的实现

WinForm中多国语言的实现

1.改变程序中界面的语言
--1.先设定好默认情况下的界面.然后将localizable改为True,选择Language的某个语言,再设定该语言的界面.然后再改变Language,设定相应的界面.此时,如果再将localizable改为False,将用当前选择的Language语言界面覆写默认界面资源文件.

--2.程序开启进会自动选择当前系统的语言界面,如果没有该语言,则显示默认语言,如果在程序启动后还想改变语言,则可以参考使用下面的代码: 

        ///  取得操作系统的语言
         public   static   string  GetSystemLang()
        {
            InputLanguage currentLanguage 
=  InputLanguage.DefaultInputLanguage;
            CultureInfo cultureInfo 
=  currentLanguage.Culture;
            
return  cultureInfo.ToString();
        }
        
///  取得应用程序的界面语言
         public   static   string  GetLang()
        {
            
return  System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();
        }
        
///  设定应用程序的界面语言
         public   static   void  SetLang( string  lang)
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture 
=   new  System.Globalization.CultureInfo(lang);
        }
        
///   <summary>
        
///  设置窗体的界面资源
        
///   </summary>
        
///   <param name="lang"> language:zh-CN, en-US </param>
        
///   <param name="form"> 窗体实例,不能为null </param>
        
///   <param name="formType"> 窗体类型 </param>
         public   static   void  SetLang( string  lang, Form form, Type formType)
        {
            
// 设定窗体form的语言,使form的设置立即生效
            System.ComponentModel.ComponentResourceManager resources  =   new  System.ComponentModel.ComponentResourceManager(formType);
            resources.ApplyResources(form, 
" $this " );
            AppLang(form, resources);
        }
        
///   <summary>
        
///  遍历窗体所有控件,针对其设置当前界面资源
        
///   </summary>
        
///   <param name="control"></param>
        
///   <param name="resources"></param>
         private   static   void  AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
        {
            
if  (control  is  MenuStrip)
            {
                resources.ApplyResources(control, control.Name);
                MenuStrip ms 
=  (MenuStrip)control;
                
if  (ms.Items.Count  >   0 )
                {
                    
foreach  (ToolStripMenuItem c  in  ms.Items)
                    {
                        AppLang(c, resources);
                    }
                }
            }

            
foreach  (Control c  in  control.Controls)
            {
                
// 只改了控件的Name属性
                resources.ApplyResources(c, c.Name);
                AppLang(c, resources);
            }
        }
        
///   <summary>
        
///  遍历菜单
        
///   </summary>
        
///   <param name="item"></param>
        
///   <param name="resources"></param>
         private   static   void  AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
        {
            
if  (item  is  ToolStripMenuItem)
            {
                resources.ApplyResources(item, item.Name);
                ToolStripMenuItem tsmi 
=  (ToolStripMenuItem)item;
                
if  (tsmi.DropDownItems.Count  >   0 )
                {
                    
foreach  (ToolStripMenuItem c  in  tsmi.DropDownItems)
                    {
                        AppLang(c, resources);
                    }
                }
            }
        }

--3.在需要的地方调用以下代码:

  // 设定应用程序的语言
 SetLang( " en-CHS " );
 
// 设定窗体的资源
 SetLang(  this this .GetType());

--4.生产语言资源的工具
Resourcer.exe
下载页面:http://www.aisto.com/roeder/dotnet/

2.改变程序中数据的语言
程序中的数据一般存储在数据库中,为了支持多语言,数据库的设计有以下几个方案:
--1.在数据库级别支持多语言:为每种语言建立独立的数据库,不同语言的用户操作不同的数据库。
由于数据库中有大量的信息(如标志,编码,数字等)是用于内部处理使用的,与语言无关的,因此在数据库级别支持多语言会导致空间的极大浪费,这种方法一般不使用.

--2.在表级别支持多语言:为每种语言建立独立的表,不同语言的用户操作不同的表,但是它们在同一个数据库中。
因为并不是所有的表都需要支持多语言,对于与语言无关的表,不同语言的用户共享一套,那些和语言相关的表根据支持语言的种类来建立,不同语言的用户存取访问不同的表格。这样使得维护简单,节省了存储空间,即使是扩展起来也比较方便,只要把需要支持多语言的表,多建立一套即可。
注意:
问题1:有些表中某些字段是不同语言版本的表共享的(例如库存量),由于各种语言的表之间的相对独立性,使得数据共享有些困难。解决的方法有两个:

--(1)不同语言的表的共享字段同步:也就是说,只要修改了其中一个表的共享字段,其它语言表中该字段也作相应改变,实际上当不同语言的用户同时访问时处理还是比较麻烦的,并且扩充新语言时修改工作比较大。

--(2)增加一个新的表:把所有语言共享的字段(例如货物编号,产地编码等)全部放在这个表,支持多语言的表只存放与各种语言相关的字段。不同语言的用户在使用数据库时,需要操作两个数据表。


问题2:不同的语言可能会要求同时显示.这种情况一般只显示两种语言.如简体中文-英文,繁体中文-英文,简体中文-繁体中文,不知道有没有一次显示简-繁-英三种语言的.


--3.在字段级别支持多语言:在同一个表中为每种语言建立独立的字段,不同语言的用户操作不同的字段,它们在同一个表中。
这种方法最大的问题是一旦需要支持新的语言,由于需要修改表结构,维护起来非常麻烦,可扩展性不好。


参考文献:1.http://blog.csdn.net/tjvictor/archive/2006/12/27/1464284.aspx
 2.http://www.cnbruce.com/blog/showlog.asp?log_id=691&cat_id=0
 3.http://blog.csdn.net/leomaya/archive/2007/01/12/1481437.aspx
 4.http://hi.baidu.com/mops/blog/item/954095ece7d0433f26979198.html
 5.http://faq.csdn.net/read/170926.html

 

WinForm实现多国语言的方法有多种。一种方法是通过改变程序中界面的语言实现。首先,可以设定好默认情况下的界面,然后将localizable属性设置为True,选择某个语言,再设定该语言的界面。接着,可以改变Language属性,设定相应的界面。此时,如果将localizable属性改为False,程序将使用当前选择的Language语言界面覆写默认界面资源文件。这样就可以实现WinForm中切换不同语言的界面。\[1\] 另一种方法是在表级别支持多语言。可以为每种语言建立独立的表,不同语言的用户操作不同的表,但它们在同一个数据库中。对于与语言无关的表,不同语言的用户共享一套表。而对于与语言相关的表,根据支持语言的种类来建立不同的表格。这样可以简化维护,节省存储空间,并且方便扩展。需要注意的是,对于一些字段是不同语言版本的表共享的情况,数据共享可能会有一些困难,可以通过不同的解决方法来解决这个问题。\[2\] 综上所述,WinForm实现多国语言可以通过改变界面语言或在表级别支持多语言实现。具体选择哪种方法取决于实际需求和项目的复杂度。 #### 引用[.reference_title] - *1* [WinForm中多国语言实现 ](https://blog.csdn.net/hengbo/article/details/4106395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [WinForm中多国语言实现](https://blog.csdn.net/manimanihome/article/details/2053292)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值