国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C#實現(xiàn)多語言界面程序的方法介紹

開發(fā) 后端
本文以一個C# winform項目為例,介紹了C#實現(xiàn)多語言界面程序的方法,希望對大家有所幫助。

 一直想做一個多語言的程序,研究了一下.net的本地化方法,覺得做起來比較麻煩,而且不能快速切換,就自己琢磨著寫一個。

以我做的一個C# winform 項目為例。

在建立C#實現(xiàn)多語言界面程序之前,首先設計多語言文件,這里我用XML來保存,基本結構如下。 

  1. < ?xml version = "1.0" encoding = "GB2312"?> 
  2.  < AirControl language="簡體中文"> 
  3.      < Menu> 
  4.          < Project> 
  5.              < Item id="0" key="MenuProject" value="項目(&P)" /> 
  6.              < Item id="1" key="MenuProjectItem1" value="新建(&N)" /> 
  7.              < Item id="2" key="MenuProjectItem2" value="打開(&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="注銷(&O)" /> 
  15.             < Item id="3" key="MenuManageItem3" value="修改密碼(&C)" /> 
  16.             < Item id="4" key="MenuManageItem4" value="用戶管理(&U)" /> 
  17.         < /Manage> 
  18.         < Help> 
  19.             < Item id="0" key="MenuHelp" value="幫助(&H)" /> 
  20.             < Item id="1" key="MenuHelpItem1" value="幫助內容(&H)" /> 
  21.             < Item id="2" key="MenuHelpItem2" value="關于(&A)" /> 
  22.         < /Help> 
  23.     < /Menu> 
  24.     < Toolbar> 
  25.         < Statusbar> 
  26.             < Item id="1" key="StatusItem1" value="用戶名: " /> 
  27.             < Item id="2" key="StatusItem2" value="用戶組: " /> 
  28.             < Item id="3" key="StatusItem3" value="上次登錄時間: " /> 
  29.             < Item id="4" key="StatusItem4" value="本次登錄時間:" /> 
  30.         < /Statusbar> 
  31.     < /Toolbar> 
  32.     < Form> 
  33.         < MainForm> 
  34.             < Item id="0" key="MainForm" value="xx" /> 
  35.             < Item id="1" key="buttonGo" value="開始" /> 
  36.             < Item id="2" key="buttonStop" value="停止" />          
  37.             < Item id="3" key="groupBox1" value="用戶信息" /> 
  38.             < Item id="4" key="groupBox2" value="常規(guī)數(shù)據(jù)" />      
  39.         < /MainForm> 
  40.         < UserLoginForm> 
  41.             < Item id="0" key="UserLoginForm" value="用戶登錄" /> 
  42.             < Item id="1" key="labelTitle"  value="xx" /> 
  43.             < Item id="2" key="labelUsername" value="用戶名" /> 
  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="確認" /> 
  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="添加測試" /> 
  60.             < Item id="2" key="0003" value="添加用戶" /> 
  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="用戶名或密碼錯誤" /> 
  66.             < Item id="5" key="2002" value="密碼不一致" /> 
  67.             < Item id="6" key="2003" value="用戶名已存在" /> 
  68.             < Item id="7" key="2004" value="添加用戶成功" />              
  69.         < /Message>              
  70.     < /Dialog> 
  71. < /AirControl> 

這里是語言文件的局部,主體分為四個部分,Menu, Toolbar, Form 和 Dialog,分別對應菜單,工具欄,窗體和對話框的顯示字符串。

在Form里面,其每個子樹分別對應一個窗體。XML每項有三個域,id 這個只是用來標號,程序中為用,key,value形成一個字典,key是控件的名稱,value是控件的text。在Dialog中key用數(shù)字編號。

做其他語言文件時,只用將value里面的值改成對應的語言即可。

當然,我們也不一定用XML來寫語言文件,簡單的ini文件也行。下面設計讀取這個XML的類,

  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.     /// 本地化類  
  11.     /// < /summary>  
  12.     public static class Localization  
  13.     {  
  14.         Property#region Property  
  15.         public static string Lang { getprivate set; }  
  16.         public static bool HasLang { getset; }          
  17.         #endregion //Property  
  18.  
  19.         Attribute#region Attribute  
  20.         private static Dictionary< string, Dictionary< stringstring>> forms = new Dictionary< string, Dictionary< stringstring>>();  
  21.         private static Dictionary< stringstring> menu = new Dictionary< stringstring>();  
  22.         private static Dictionary< stringstring> toolbar = new Dictionary< stringstring>();  
  23.         private static Dictionary< stringstring> dialog = new Dictionary< stringstring>();  
  24.         #endregion //Attribute  
  25.  
  26.         Method#region Method  
  27.          public static void AddForm(string formName)  
  28.          {  
  29.              forms.Add(formName, new Dictionary< stringstring>());  
  30.              //formMap.Add(formName, count++);  
  31.          }  
  32.    
  33.         /**//// < summary>  
  34.          /// 加載語言文件  
  35.          /// < /summary>  
  36.          /// < param name="lang">語言< /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< stringstring> 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< stringstring> 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< stringstring> Menu  
  119.         {  
  120.             get 
  121.             {  
  122.                 return menu;  
  123.             }  
  124.             private set 
  125.             { }  
  126.         }  
  127.  
  128.         public static Dictionary< stringstring> Toolbar  
  129.         {  
  130.             get 
  131.             {  
  132.                 return toolbar;  
  133.             }  
  134.             private set 
  135.             { }  
  136.         }  
  137.  
  138.         public static Dictionary< string, Dictionary< stringstring>> Forms  
  139.         {  
  140.             get 
  141.             {  
  142.                 return forms;  
  143.             }  
  144.             private set 
  145.             { }  
  146.         }  
  147.    
  148.         public static Dictionary< stringstring> Dialog  
  149.         {  
  150.             get 
  151.             {  
  152.                return dialog;  
  153.             }  
  154.             private set 
  155.             { }  
  156.         }  
  157.         #endregion //Property  
  158.     }  

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

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

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

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

在程序開始main 函數(shù)中,首先調用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");  

然后加載語言文件。 

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

在每個Form的Load事件中初始化每個控件的Text。 

  1. if (Localization.HasLang)  
  2.          RefreshLanguage();  
  3.  
  4.  
  5. // 更新窗體語言  
  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.          遞歸更新每個控件Text  
  13.  
  14.  /// < summary>  
  15.  /// 設置control子控件語言  
  16.  /// < /summary>  
  17.  /// < param name="control">父控件< /param>  
  18.  /// < param name="obj">語言字典< /param>  
  19.  public static void SetControlsLanguage(Control control, Dictionary< stringstring> 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就直接調用Localization中的Dialog屬性即可。

需要轉變?yōu)椴煌Z言時只需要再調用一次Localization.Load方法。

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

小結:

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

【編輯推薦】

  1. 概述C#泛型機制
  2. 淺析C#異步套接字的實現(xiàn)過程
  3. 解析C#關鍵字之get、set、value、partial、where和yield
  4. 編程入門:C#類型和C#變量
  5. C#實現(xiàn)Strategy接口
責任編輯:book05 來源: cnblogs
相關推薦

2009-08-25 10:44:50

C#實現(xiàn)多語言

2011-08-05 17:54:33

Cocoa Touch 多語言

2012-04-19 11:40:21

Titanium

2009-07-17 10:02:29

WPF程序多語言支持

2014-07-09 09:20:06

WPFWPF應用

2014-04-16 14:50:20

Spark

2021-06-29 21:48:32

開源語言架構

2021-09-07 10:17:35

iOS多語言適配設計

2024-05-09 08:14:09

系統(tǒng)設計語言多語言

2011-07-26 10:09:08

iPhone 多語言 國際化

2022-08-09 07:22:15

語言數(shù)據(jù)庫程序

2025-02-03 00:25:00

Asp語言配置

2009-08-13 17:04:09

C#語言C#程序

2009-08-20 08:50:28

Windows Ser用戶界面包

2009-08-21 18:46:30

下載Server 20

2025-08-11 07:00:00

2013-10-16 15:50:01

iOS優(yōu)化本地化

2009-08-20 16:25:59

C# 匿名方法

2023-06-29 07:27:26

知識圖譜Shopee

2023-08-04 10:18:15

點贊
收藏

51CTO技術棧公眾號

日韩免费一区二区三区| 亚洲精品无码国产| 日韩第一区第二区| 欧美一区在线视频| 情se视频网在线观看| 亚洲欧洲日韩综合一区二区| 日韩精品―中文字幕| 奇米影视在线99精品| 欧美另类一区| 蜜乳av另类精品一区二区| 99久久无色码| 欧美不卡在线| 成人动漫视频在线观看完整版| 亚洲va在线| 国产99在线免费| 亚洲福利专区| 国产伦视频一区二区三区| 欧美黄色一区| 丁香婷婷久久久综合精品国产 | 日韩尤物视频| 青青草伊人久久| 亚洲色图自拍| 成人h精品动漫一区二区三区| 免费看国产曰批40分钟| 91视频91自| 亚洲 欧美 另类人妖| 国产精品私人影院| 午夜av电影| 狠狠色香婷婷久久亚洲精品| 国产专区在线播放| 精品国产免费人成在线观看| 亚洲天堂一区二区| 久久久久久久亚洲精品| 97久久夜色精品国产| 精品一区日韩成人| 丁香婷婷综合色啪| 国产一级大片| 欧美日本在线观看| jizz内谢中国亚洲jizz| 欧美黄网免费在线观看| 91免费精品| 日本一区二区三区视频在线播放 | 中文字幕免费不卡| 国产剧情演绎av| 欧美视频一区二区三区在线观看| 天堂av最新在线| 中文字幕亚洲无线码a| 亚洲三级精品| 国产欧美日韩在线播放| 久久er99热精品一区二区| 无码人妻丰满熟妇区96| 性久久久久久久| 亚洲奶水xxxx哺乳期| 日韩中文视频免费在线观看| 精品亚洲成人| 亚洲精品日韩精品| 欧美极品美女视频| www.亚洲.com| 欧美福利视频在线| 亚洲中字在线| 奇米777影视成人四色| 日韩亚洲电影在线| 18国产精品| 精品一区二区久久久久久久网站| 国产福利一区二区三区视频在线| 热99在线观看| 欧美久久一二三四区| 91麻豆精品激情在线观看最新| 国产精品一区二区免费| 久久青草欧美一区二区三区| 18免费在线视频| 久久免费精品视频| 首页国产欧美久久| 国产国产人免费人成免费视频 | 91免费在线看| 自拍视频在线网| 欧美极品xxxx| 日韩av一区二区在线影视| 高清孕妇孕交╳╳交| 亚洲精品小视频| 精品999成人| 国产在线视频你懂| 国产亚洲欧洲高清一区| 影音国产精品| caoporn超碰国产公开| 日韩精品在线免费观看| 亚洲国产一成人久久精品| 日本一道本久久| 日韩精品一区二区三区四区| 日韩成人免费| 色综合小说天天综合网| 亚洲天堂男人天堂| 亚洲区第一页| 性xxxx丰满孕妇xxxx另类| 欧美国产日产韩国视频| 国产又黄又大久久| 男人影院在线观看| 国产日韩在线一区| 成人免费视频在线观看| 欧洲亚洲精品| 色乱码一区二区三区熟女| 宅男在线国产精品| av亚洲免费| 成年人视频在线网站| 久久精品视频中文字幕| 国产suv精品一区二区三区| 欧美人与牲禽动交com| 99re在线| 色域天天综合网| 青青草综合网| 国产色视频网站| 久久久久中文字幕2018| 97精品久久久午夜一区二区三区 | 亚洲精品美女视频| 亚洲每日更新| 成人午夜影视| 国产欧美日韩专区发布| 成人欧美一区二区三区白人| 欧美9999| 欧美成人免费高清视频| 在线观看亚洲区| 国产黄色精品网站| 校园春色亚洲| 亚洲av综合色区| 亚洲精品在线观看www| 国内一区二区视频| 国产伦久视频在线观看| 熟女熟妇伦久久影院毛片一区二区| 亚洲第一免费播放区| 久久精品国产99国产| 乱人伦视频在线| 91嫩草国产丨精品入口麻豆| 亚洲色图av在线| 99re这里都是精品| 动漫3d精品一区二区三区乱码| 男裸体无遮挡网站| 日本电影亚洲天堂| 五月开心婷婷久久| 亚洲国产免费看| h片视频在线观看| youjizz.com在线观看| 欧美成人精品一区二区三区| 国产欧美一区二区精品性色超碰 | 精品一区二区国语对白| 2020av在线| 国产96在线 | 亚洲| 在线观看国产精品91| 92精品国产成人观看免费| 欧美电影院免费观看| 婷婷福利视频导航| 成人激情av| 亚洲国产天堂网精品网站| 国产福利一区在线| 风间由美性色一区二区三区四区| 女生裸体视频网站免费观看| 97中文在线| 亚洲国产另类久久精品| 91视频免费播放| 日韩欧美高清| av最新在线| 欧美日韩美女| 国产av人人夜夜澡人人爽麻豆 | 国产99久久久国产精品成人免费| 啦啦啦在线视频免费观看高清中文| 国产精品日韩精品| 欧美日韩国产a| 国产精品一区二区免费不卡| 亚洲精品高潮| 美州a亚洲一视本频v色道| 日韩影视精品| 欧美高清在线视频观看不卡| 亚洲高清久久久| 视频一区欧美精品| 日韩三级精品| 精品乱码一区二区三四区视频 | 亚洲在线成人| 日本精品在线一区| 免费在线黄网| 日韩国产精品一区二区| 最近2019年手机中文字幕| 亚洲免费在线播放| 老妇喷水一区二区三区| 波多野结衣在线一区二区| 在线国产情侣| 天堂在线资源视频| 欧美13一14另类| 97视频免费在线看| 欧美一级艳片视频免费观看| 久久久久国产精品人| 国产精品观看| 国产精品99久久免费| 国产小视频在线观看| 国产二区视频在线| 99久久国产免费免费| 日韩在线视频二区| 欧美性videosxxxxx| 国产欧美精品一区二区色综合| aa亚洲婷婷| 亚洲资源网你懂的| 日韩欧美一区二区三区在线观看|