熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#的Windows編程中多語言的實現

2013-11-13 09:56:15  來源: .NET編程 

  實現多語言的方法是通過配置文件實現通過從配置文件中讀取資源然後在顯示窗口的時候即Load()方法中動態顯示相應的選擇語言
  
    下面是在C#的Windows編程中實現多語言的步驟
  
    第一步設置默認語言和修改默認語言
  
    我們定義了一個XML文件來存放默認語言文件名為LanguageDefineXML
  
    LanguageDefinexml
  
  <?xml version= standalone=yes?>
  <Language>
  <DefaultLanguage>ZH</DefaultLanguage>
  </Language>
  
    該文件只有一個DefaultLanguage屬性用於存放默認語言需要注意的是這個屬性要與語言配置文件中_後的字符串相同
  
    下面是用於讀取默認語言和修改默認語言的函數
  
  //讀取默認語言
  public static string ReadDefaultLanguage(){
   XmlReader reader = new XmlTextReader(resources/LanguageDefinexml);
   XmlDocument doc = new XmlDocument();
   docLoad(reader);
   XmlNode root = docDocumentElement;
   //選取DefaultLangugae節點
   XmlNode node = rootSelectSingleNode(DefaultLanguage);
  
   string result = EN;
   if (node != null)
    //取出節點中的內容
    result = nodeInnerText;
  
    readerClose();
   return result;
  }
  //修改默認語言
  public static void WriteDefaultLanguage(string lang){
   DataSet ds = new DataSet();
   dsReadXml(resources/LanguageDefinexml);
   DataTable dt = dsTables[Language];
  
   dtRows[][DefaultLanguage] = lang;
   dsAcceptChanges();
   dsWriteXml(resources/LanguageDefinexml);
  }
  
    我們又用一個XML文件來存儲要顯示的語言的種類和在特定的語言下語言選擇下拉菜單的顯示文字現我們只構造了兩種語言不過通過添加Item我們可以很容易的實現增加一種語言的功能
  
    我們是通過一個ComboBox下拉菜單來實現多語言的選擇的當選擇了相應的語言時我們會把系統的默認語言即LanguageDefinexml中的語言改成所選的語言同時系統馬上重新Load()以顯示所選擇的語言對應的界面
  
    ppConfigxml
  
  <?xml version= encoding=gb?>
  <AppConfig>
  <Area>
  <Language>ZH</Language>
  <List>
  <Item>中文[ZH]</Item>
  <Item>英文[EN]</Item>
  </List>
  </Area>
  <Area>
  <Language>EN</Language>
  <List>
  <Item>Chinese[ZH]</Item>
  <Item>English[EN]</Item>
  </List>
  </Area>
  <Area>
  </AppConfig>
  
    相應的讀取該配置文件的函數是
  
  public static IList GetLanguageList(string lang){
  IList result = new ArrayList();
  
  XmlReader reader = new XmlTextReader(resources/AppConfigxml);
  XmlDocument doc = new XmlDocument();
  docLoad(reader);
  
  XmlNode root = docDocumentElement;
  XmlNodeList nodelist = rootSelectNodes(Area[Language= + lang + /List/Item);
  foreach (XmlNode node in nodelist){
   resultAdd(nodeInnerText);
  }
  readerClose();
  
  return result;
  }
  
    第三步根據語言獲取要顯示頁面的顯示值
  
    通過上面的幾步我們可以在每個頁面的Load()方法中根據ReadDefaultLanguage()函數獲取這個頁面的顯示語言取得默認語言後我們要該語言的資源文件中讀取相應的資源
  
    該資源文件的格式如下(現只顯示英文的資源文件中文資源文件的格式與其相同只是text中的值換成了相應的中文值)
  
    AppResource_ENxml
  
  <?xml version= encoding=utf ?>
  <Resource>
  <Form>
  <Name>FrmLogon</Name>
  <Controls>
  <Control name=frmlogon text=User logon />
  <Control name=lblusername text=Username: />
  <Control name=lblpassword text=Password: />
  <Control name=lbllanguage text=Language: />
  <Control name=btnlogon text=Logon />
  <Control name=btncancel text=Exit />
  <Control name=btnchangepwd text=Change Password />
  </Controls>
  </Form>
  <Form>
  <Name>FrmPasswordChange</Name>
  <Controls>
  <Control name=frmpasswordchange text=Change password />
  <Control name=lblusername text=Username: />
  <Control name=lblpassword text=Old Password: />
  <Control name=lblnewpassword text=New Password: />
  <Control name=lblpasswordconfirm text=Password Confirm: />
  <Control name=btnok text=OK />
  <Control name=btncancel text=Return />
  </Controls>
  </Form>
  </Resource>
  

  我們把一個窗體中要實現多語言顯示的控件的名稱全都放在<Controls></Controls>中name指的是控件的Name屬性而text指的是控件的Text屬性
  
    讀取的函數如下
  
  /// <summary>
  /// 讀取多語言的資源文件
  /// </summary>
  /// <param name=frmName>窗體的Name</param>
  /// <param name=lang>要顯示的語言(如ZH或EN)</param>
  /// <returns></returns>
  public static Hashtable ReadResource(string frmNamestring lang){
   Hashtable result = new Hashtable();
  
   XmlReader reader = null;
   FileInfo fi = new FileInfo(resources/AppResource_ + lang + xml);
   if (!fiExists)
    reader = new XmlTextReader(resources/AppResourcexml);
   else
    reader = new XmlTextReader(resources/AppResource_ + lang + xml);
  
   XmlDocument doc = new XmlDocument();
   docLoad(reader);
  
   XmlNode root = docDocumentElement;
   XmlNodeList nodelist = rootSelectNodes(Form[Name= + frmName + ]/Controls/Control);
   foreach (XmlNode node in nodelist){
    try{
     XmlNode node = nodeSelectSingleNode(@name);
     XmlNode node = nodeSelectSingleNode(@text);
     if (node != null){
      resultAdd(nodeInnerTextToLower()nodeInnerText);
     }
     }catch(FormatException fe){
      ConsoleWriteLine(feToString());
     }
    }
    readerClose();
   return result;
  }
  
    第四步顯示相應的值
  
    我們可以在每個窗體的Load()事件中調用相應的函數來實現這個功能當然我們首先必須先獲得這個窗體要顯示的語言的代碼(如EN或ZH)該值可以存放在一個全局變量中(比如把值通過GlobalSetValue(langlangugae)存入通過GlobalGetValue(lang)取出)
  
  /// <summary>
  /// 獲取控件的名稱
  /// </summary>
  /// <param name=form></param>
  public static void getNames(Form form)
  {
  
   //根據用戶選擇的語言獲得表的顯示文字
   Hashtable table =   AppConfigReadResource(formNameGlobalGetValue(lang)ToString());
   ControlControlCollection controlNames = formControls;
   //可以在這裡設置窗體的一些統一的屬性這樣所有的窗體都會應用該設置
   // formKeyPreview = true;
   // formMaximizeBox = false;
   // formMinimizeBox = false;
   // formControlBox = false;
   // formFormBorderStyle = FormBorderStyleFixedDialog;
   // formStartPosition = FormStartPositionCenterScreen;
   // formTopMost = true;
   // formKeyDown += new KeyEventHandler(OnEnter);
   try
   {
    foreach(Control control in controlNames)
    {
     if(controlGetType() == typeof(SystemWindowsFormsPanel))
  GetSubControls(controlControlstable);
  
     if(controlGetType() == typeof(SystemWindowsFormsGrouPBox))
  GetSubControls(controlControlstable);
  
     // if(controlGetType() == typeof(SystemWindowsFormsTextBox) && controlEnabled)
     // controlGotFocus += new EventHandler(Txt_Focus);
  
     if(tableContains(controlNameToLower()))
  controlText = (string)table[controlNameToLower()];
    }
    if(tableContains(formNameToLower()))
     formText = (string)table[formNameToLower()];
   }
   catch(Exception ex)
    ConsoleWriteLine(exToString());
  }
  
    因為有些控件其內部還有子控件所以我們還要有個讀取控件中子控件的顯示值的函數
  
  /// <summary>
  /// 獲得子控件的顯示名
  /// </summary>
  /// <param name=controls></param>
  /// <param name=table></param>
  private static void GetSubControls(ControlControlCollection controlsHashtable table)
  {
   foreach(Control control in controls)
   {
    if(controlGetType() == typeof(SystemWindowsFormsPanel))
  GetSubControls(controlControlstable);
  
    if(controlGetType() == typeof(SystemWindowsFormsGroupBox))
  GetSubControls(controlControlstable);
  
    if(tableContains(controlNameToLower()))
  controlText = (string)table[controlNameToLower()];
   }
  }


From:http://tw.wingwit.com/Article/program/net/201311/12039.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.