日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#實(shí)現(xiàn)多語(yǔ)言界面程序的方法介紹

 一直想做一個(gè)多語(yǔ)言的程序,研究了一下.net的本地化方法,覺(jué)得做起來(lái)比較麻煩,而且不能快速切換,就自己琢磨著寫(xiě)一個(gè)。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括祁東網(wǎng)站建設(shè)、祁東網(wǎng)站制作、祁東網(wǎng)頁(yè)制作以及祁東網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,祁東網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到祁東省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

以我做的一個(gè)C# winform 項(xiàng)目為例。

在建立C#實(shí)現(xiàn)多語(yǔ)言界面程序之前,首先設(shè)計(jì)多語(yǔ)言文件,這里我用XML來(lái)保存,基本結(jié)構(gòu)如下。 

 
 
 
  1. < ?xml version = "1.0" encoding = "GB2312"?> 
  2.  < AirControl language="簡(jiǎn)體中文"> 
  3.      < Menu> 
  4.          < Project> 
  5.              < Item id="0" key="MenuProject" value="項(xiàng)目(&P)" /> 
  6.              < Item id="1" key="MenuProjectItem1" value="新建(&N)" /> 
  7.              < Item id="2" key="MenuProjectItem2" value="打開(kāi)(&O)" /> 
  8.              < Item id="3" key="MenuProjectItem3" value="保存(&S)" /> 
  9.              < Item id="5" key="MenuProjectItem5" value="退出(&X)" /> 
  10.         < /Project> 
  11.         < Manage> 
  12.             < Item id="0" key="MenuManage" value="管理(&M)" /> 
  13.             < Item id="1" key="MenuManageItem1" value="登錄(&I)" /> 
  14.             < Item id="2" key="MenuManageItem2" value="注銷(xiāo)(&O)" /> 
  15.             < Item id="3" key="MenuManageItem3" value="修改密碼(&C)" /> 
  16.             < Item id="4" key="MenuManageItem4" value="用戶(hù)管理(&U)" /> 
  17.         < /Manage> 
  18.         < Help> 
  19.             < Item id="0" key="MenuHelp" value="幫助(&H)" /> 
  20.             < Item id="1" key="MenuHelpItem1" value="幫助內(nèi)容(&H)" /> 
  21.             < Item id="2" key="MenuHelpItem2" value="關(guān)于(&A)" /> 
  22.         < /Help> 
  23.     < /Menu> 
  24.     < Toolbar> 
  25.         < Statusbar> 
  26.             < Item id="1" key="StatusItem1" value="用戶(hù)名: " /> 
  27.             < Item id="2" key="StatusItem2" value="用戶(hù)組: " /> 
  28.             < Item id="3" key="StatusItem3" value="上次登錄時(shí)間: " /> 
  29.             < Item id="4" key="StatusItem4" value="本次登錄時(shí)間:" /> 
  30.         < /Statusbar> 
  31.     < /Toolbar> 
  32.     < Form> 
  33.         < MainForm> 
  34.             < Item id="0" key="MainForm" value="xx" /> 
  35.             < Item id="1" key="buttonGo" value="開(kāi)始" /> 
  36.             < Item id="2" key="buttonStop" value="停止" />          
  37.             < Item id="3" key="groupBox1" value="用戶(hù)信息" /> 
  38.             < Item id="4" key="groupBox2" value="常規(guī)數(shù)據(jù)" />      
  39.         < /MainForm> 
  40.         < UserLoginForm> 
  41.             < Item id="0" key="UserLoginForm" value="用戶(hù)登錄" /> 
  42.             < Item id="1" key="labelTitle"  value="xx" /> 
  43.             < Item id="2" key="labelUsername" value="用戶(hù)名" /> 
  44.             < Item id="3" key="labelPassword" value="密碼" /> 
  45.             < Item id="4" key="buttonLogin" value="登錄" /> 
  46.         < /UserLoginForm> 
  47.         < ChangePasswordForm> 
  48.             < Item id="0" key="ChangePasswordForm" value="修改密碼" /> 
  49.             < Item id="1" key="label1" value="原密碼" /> 
  50.             < Item id="2" key="label2" value="新密碼" /> 
  51.             < Item id="3" key="label3" value="再輸入" /> 
  52.             < Item id="4" key="buttonConfirm" value="確認(rèn)" /> 
  53.             < Item id="5" key="buttonCancel" value="取消" /> 
  54.         < /ChangePasswordForm> 
  55.     < /Form> 
  56.     < Dialog> 
  57.         < Title> 
  58.             < Item id="0" key="0001" value="xx" /> 
  59.             < Item id="1" key="0002" value="添加測(cè)試" /> 
  60.             < Item id="2" key="0003" value="添加用戶(hù)" /> 
  61.             < Item id="3" key="0004" value="修改密碼" /> 
  62.         < /Title> 
  63.         < Message> 
  64.             < Item id="0" key="0000" value="一切正常" /> 
  65.             < Item id="1" key="2001" value="用戶(hù)名或密碼錯(cuò)誤" /> 
  66.             < Item id="5" key="2002" value="密碼不一致" /> 
  67.             < Item id="6" key="2003" value="用戶(hù)名已存在" /> 
  68.             < Item id="7" key="2004" value="添加用戶(hù)成功" />              
  69.         < /Message>              
  70.     < /Dialog> 
  71. < /AirControl> 

這里是語(yǔ)言文件的局部,主體分為四個(gè)部分,Menu, Toolbar, Form 和 Dialog,分別對(duì)應(yīng)菜單,工具欄,窗體和對(duì)話(huà)框的顯示字符串。

在Form里面,其每個(gè)子樹(shù)分別對(duì)應(yīng)一個(gè)窗體。XML每項(xiàng)有三個(gè)域,id 這個(gè)只是用來(lái)標(biāo)號(hào),程序中為用,key,value形成一個(gè)字典,key是控件的名稱(chēng),value是控件的text。在Dialog中key用數(shù)字編號(hào)。

做其他語(yǔ)言文件時(shí),只用將value里面的值改成對(duì)應(yīng)的語(yǔ)言即可。

當(dāng)然,我們也不一定用XML來(lái)寫(xiě)語(yǔ)言文件,簡(jiǎn)單的ini文件也行。下面設(shè)計(jì)讀取這個(gè)XML的類(lèi),

 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Xml;  
  6.  
  7. namespace AirLibrary  
  8. {  
  9.     /**//// < summary>  
  10.     /// 本地化類(lèi)  
  11.     /// < /summary>  
  12.     public static class Localization  
  13.     {  
  14.         Property#region Property  
  15.         public static string Lang { get; private set; }  
  16.         public static bool HasLang { get; set; }          
  17.         #endregion //Property  
  18.  
  19.         Attribute#region Attribute  
  20.         private static Dictionary< string, Dictionary< string, string>> forms = new Dictionary< string, Dictionary< string, string>>();  
  21.         private static Dictionary< string, string> menu = new Dictionary< string, string>();  
  22.         private static Dictionary< string, string> toolbar = new Dictionary< string, string>();  
  23.         private static Dictionary< string, string> dialog = new Dictionary< string, string>();  
  24.         #endregion //Attribute  
  25.  
  26.         Method#region Method  
  27.          public static void AddForm(string formName)  
  28.          {  
  29.              forms.Add(formName, new Dictionary< string, string>());  
  30.              //formMap.Add(formName, count++);  
  31.          }  
  32.    
  33.         /**//// < summary>  
  34.          /// 加載語(yǔ)言文件  
  35.          /// < /summary>  
  36.          /// < param name="lang">語(yǔ)言< /param>  
  37.          /// < returns>< /returns>  
  38.          public static bool Load(string lang)  
  39.          {  
  40.              string path = "";  
  41.              Localization.Lang = "English";  
  42.    
  43.              menu.Clear();  
  44.              toolbar.Clear();  
  45.              dialog.Clear();  
  46.              exception.Clear();  
  47.              foreach (Dictionary< string, string> form in forms.Values)  
  48.                  form.Clear();  
  49.                
  50.              switch (lang)  
  51.              {  
  52.                  case "zh":                     
  53.                      path = @"resources/lang-zh.xml";  
  54.                      break;  
  55.                  case "en":                    
  56.                      path = @"resources/lang-en.xml";  
  57.                      break;  
  58.                  default:                      
  59.                      path = @"resources/lang-zh.xml";  
  60.                      break;  
  61.              }  
  62.    
  63.              return readLanguage(path);  
  64.          }  
  65.          #endregion //Method  
  66.    
  67.          Function#region Function  
  68.          private static bool readLanguage(string path)  
  69.          {  
  70.              // Read the language file  
  71.              XmlReader reader;  
  72.              try 
  73.              {  
  74.                  reader = XmlReader.Create(path);  
  75.              }  
  76.              catch (Exception)  
  77.              {  
  78.                  return false;  
  79.              }  
  80.    
  81.              // Begin to parase  
  82.             try 
  83.             {  
  84.                 reader.ReadToFollowing("AirControl");  
  85.                 Localization.Lang = reader.GetAttribute("language");  
  86.  
  87.                 paraseXml(reader, "Menu", menu);  
  88.                 paraseXml(reader, "Toolbar", toolbar);  
  89.     
  90.                 foreach (string formName in forms.Keys)  
  91.                 {  
  92.                    paraseXml(reader, formName, forms[formName]);  
  93.                 }  
  94.                 paraseXml(reader, "Dialog", dialog);                 
  95.             }  
  96.             catch (Exception)  
  97.             {  
  98.                 return false;  
  99.             }  
  100.             return true;  
  101.         }  
  102.  
  103.         private static void paraseXml(XmlReader reader, string item, Dictionary< string, string> obj)  
  104.         {  
  105.             // Get the attribute key & value   
  106.             reader.ReadToFollowing(item);  
  107.  
  108.             XmlReader subreader = reader.ReadSubtree();  
  109.             while (subreader.Read())  
  110.             {  
  111.                 if (subreader.NodeType == XmlNodeType.Element && subreader.Name == "Item")  
  112.                     obj.Add(subreader.GetAttribute("key"), subreader.GetAttribute("value"));  
  113.             }  
  114.         }  
  115.         #endregion //Function  
  116.  
  117.         Property#region Property  
  118.         public static Dictionary< string, string> Menu  
  119.         {  
  120.             get 
  121.             {  
  122.                 return menu;  
  123.             }  
  124.             private set 
  125.             { }  
  126.         }  
  127.  
  128.         public static Dictionary< string, string> Toolbar  
  129.         {  
  130.             get 
  131.             {  
  132.                 return toolbar;  
  133.             }  
  134.             private set 
  135.             { }  
  136.         }  
  137.  
  138.         public static Dictionary< string, Dictionary< string, string>> Forms  
  139.         {  
  140.             get 
  141.             {  
  142.                 return forms;  
  143.             }  
  144.             private set 
  145.             { }  
  146.         }  
  147.    
  148.         public static Dictionary< string, string> Dialog  
  149.         {  
  150.             get 
  151.             {  
  152.                return dialog;  
  153.             }  
  154.             private set 
  155.             { }  
  156.         }  
  157.         #endregion //Property  
  158.     }  

這里我使用靜態(tài)類(lèi)來(lái)讀取和保存,這樣效率相對(duì)會(huì)高一些。讀取XML時(shí),我使用的是XmlReader,它使用流式讀取,速度也比較快。

Forms, Menu, Toolbar, Dialog幾個(gè)屬性分別對(duì)應(yīng)XML中的子樹(shù),使用.net中的Dictionary范型,F(xiàn)orms嵌套了一層Dictionary。

Load方法是加載語(yǔ)言文件,readLanguage 和paraseXML 函數(shù)對(duì)XML進(jìn)行解析,并保存字符串到對(duì)應(yīng)的屬性中。

AddForm這個(gè)方法是將每個(gè)窗體的動(dòng)態(tài)的添加到forms 里面。

在程序開(kāi)始main 函數(shù)中,首先調(diào)用AddForm方法,添加所有窗體。

 
 
 
  1. // 添加所有窗體用于本地化(按XML中順序)  
  2. private static void AddForm()  
  3. {  
  4.     Localization.AddForm("MainForm");  
  5.     Localization.AddForm("UserLoginForm");  
  6.     Localization.AddForm("UserManageForm");  
  7.     Localization.AddForm("ChangePasswordForm");  

然后加載語(yǔ)言文件。 

 
 
 
  1. if (!Localization.Load("zh"))  
  2.             {  
  3.                 MessageBox.Show("無(wú)法加載語(yǔ)言配置文件, 將顯示英文.", "錯(cuò)誤", MessageBoxButtons.OK,  
  4.                     MessageBoxIcon.Exclamation);  
  5.                 Localization.HasLang = false;  
  6.             }  
  7.             else 
  8.                 Localization.HasLang = true; 

在每個(gè)Form的Load事件中初始化每個(gè)控件的Text。 

 
 
 
  1. if (Localization.HasLang)  
  2.          RefreshLanguage();  
  3.  
  4.  
  5. // 更新窗體語(yǔ)言  
  6. public static void RefreshLanguage(Form form)  
  7. {            
  8.      form.Text = Localization.Forms[form.Name][form.Name];  
  9.      SetControlsLanguage(form, Localization.Forms[form.Name]);  
  10. }  
  11.  
  12.          遞歸更新每個(gè)控件Text  
  13.  
  14.  /// < summary>  
  15.  /// 設(shè)置control子控件語(yǔ)言  
  16.  /// < /summary>  
  17.  /// < param name="control">父控件< /param>  
  18.  /// < param name="obj">語(yǔ)言字典< /param>  
  19.  public static void SetControlsLanguage(Control control, Dictionary< string, string> obj)  
  20.  {  
  21.       foreach (Control ctrl in control.Controls)  
  22.       {  
  23.          // set the control which one's key in the dictionary  
  24.          string text = "";  
  25.          if (obj.TryGetValue(ctrl.Name, out text))  
  26.                ctrl.Text = text;  
  27.    
  28.          if (ctrl.HasChildren)  
  29.                SetControlsLanguage(ctrl, obj);  
  30.        }  
  31.  } 

另外主窗體的Menu和Toolbar,我采用以下的方法更新。 

 
 
 
  1. // Refresh the menu language  
  2.  foreach (ToolStripMenuItem topItem in MainMenuStrip.Items)  
  3.  {  
  4.        topItem.Text = Localization.Menu[topItem.Name];  
  5.        foreach (ToolStripItem item in topItem.DropDownItems)  
  6.        {  
  7.              if (item is ToolStripMenuItem)  
  8.              {  
  9.                   string text = "";  
  10.                   if (Localization.Menu.TryGetValue(item.Name, out text))  
  11.                        item.Text = text;  
  12.              }  
  13.        }  
  14.  }  
  15.    
  16.  // Refresh the statusbar language  
  17.  foreach (ToolStripItem item in mainStatus.Items)  
  18.  {  
  19.       string text = "";  
  20.       if (Localization.Toolbar.TryGetValue(item.Name, out text))  
  21.               item.Text = text;  
  22.  } 

Dialog就直接調(diào)用Localization中的Dialog屬性即可。

需要轉(zhuǎn)變?yōu)椴煌Z(yǔ)言時(shí)只需要再調(diào)用一次Localization.Load方法。

這樣,就完成了C#實(shí)現(xiàn)多語(yǔ)言界面程序。  

小結(jié):

這種C#實(shí)現(xiàn)多語(yǔ)言界面程序的方式我思考了很久,也在網(wǎng)上查了一些資料,最后設(shè)計(jì)了這樣一種方式,XML中利用字典來(lái)記錄控件的語(yǔ)言在添加,讀取時(shí)非常方便,Localization類(lèi)做成靜態(tài)類(lèi),在運(yùn)行時(shí)就相當(dāng)于一個(gè)常量,沒(méi)有構(gòu)造函數(shù)這樣的開(kāi)銷(xiāo),整個(gè)界面也可以再運(yùn)行時(shí)直接改變界面語(yǔ)言。當(dāng)然這種方法不一定是最好的, 如果有更好的方法歡迎指點(diǎn)。


網(wǎng)站題目:C#實(shí)現(xiàn)多語(yǔ)言界面程序的方法介紹
網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/djsocis.html