凯锐

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

國際化你的程序

(Windows)

事情也源于一個網友的問題﹐她說在Java中很好實現: “JAVA中用一個資源文件存起來,然後在瀏覽器裡選擇國家就行了 “這是她的原話。﹐因為她曾上過一段時間的.NET的課程﹐然后她想知道.NET中如何實現。我當時是這么告訴她的﹕

屬性中有一個叫Localizable的﹐設為True

然后Language選不同國家語言就行了。

不一會兒﹐又到了我們下班的時間﹐也就只好如此﹐沒有細說﹐吃飯的時候﹐想想或者這樣子說﹐人家不一定能做出完整的可行性方案出來。所以我在這里重述一遍﹕

第一種﹐最簡便的方法﹕

1﹑新建一個Windows專案。在窗體屬性中找到Localizable的﹐設為True,Lanuguage就用默認的好了。

2﹑在工具箱中拖一個標簽過來。Name不改變﹐保持為label1,Text設為”Hello, English !” 再拖兩個 RadioButtonName分別設為:rbEnglishrbChinese,Text屬性分別為English Chinese 

3﹑再次回到窗體屬性中找到Lanuguage,設為你想要的國家的語言。例如中文(台灣)。這樣在你的專案運行目錄下面就會有一個叫”zh-TW”的文件夾﹐里面有一個叫”你的專案名.resources.dll”的文件。

4﹑找到剛拖進來的標簽label1﹐將Text屬性設為”你好﹐中國” ,rbEnglishText屬性為"英文",rbChineseText的屬性設為"中文繁體" 

5﹑回到代碼編輯區﹐在建構函數加入

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-TW");

運行后﹐你的界面就是中文繁體的啦。顯示”你好﹐中國”.當然﹐如果你要顯示英文或其它什么語言﹐只需將5中的”zh-TW”換成你要的語言代號就可以了。

第二種,使用Xml文件﹕

1﹑這個需要對xml文件有一定的了解。首先新建一個xml文件﹐假設名為:LanguageMenu.xml,輸入內容如下﹕

<?xml version="1.0" encoding="utf-8" ?>
<LanguageMenu>
    
<English label1="Hello,English" rbEnglish ="English" rbChinese="Chinese"/>
    
<Chinese label1="你好﹐中國" rbEnglish ="英文" rbChinese="中文繁體"/>
</LanguageMenu>

2﹑回到上面建的Windows專案中﹐ 將Localizable改回False.

3﹑新加如下方法﹕

 private void loadMenu(string _language)
  {
     
   
//Check whether file LanguageMenu.xml is exisit or not exist
   DirectoryInfo d=new DirectoryInfo(Application.StartupPath);
   FileSystemInfo[] f
=d.GetFileSystemInfos();

   
//Declared a variable path to stored a path of Application
   string path="";
   
bool exist=false;
   
   
   
   
foreach(FileSystemInfo f1 in f)
   {
    
if(f1.Name.ToString()=="LanguageMenu.xml")
    {
     
//If file is existed, then received a path of Application
     path=f1.FullName.ToString().Trim();
     exist
=true;
    }
   }

   
if(exist)
   {
    
    
//Created an object of XmlDocument
    XmlDocument doc=new XmlDocument();   
      
    
//Load XmlDocument with path
    doc.Load(path);   
    
    XmlNodeList objXList 
= doc.SelectNodes("//LanguageMenu");

    
//Iterate through each node
    foreach (XmlNode objNode in objXList)
    {
     
//Read each node
     XmlNodeReader objNdRd = new XmlNodeReader(objNode);

     
//Read through all child nodes of this node

     
while (objNdRd.Read())
     {
      
//Get element nodes
      if (objNdRd.NodeType == XmlNodeType.Element)
      {
       
//Find  elements
       if (objNdRd.Name == _language)
       {
        
this.label1.Text = objNdRd.GetAttribute("label1");
        
this.rbEnglish.Text = objNdRd .GetAttribute("rbEnglish");
        
this.rbChenese.Text = objNdRd.GetAttribute("rbChinese");
       }
      }
     }
    }
   }
   
else
   {
    MessageBox.Show(
"Can not find LanguageMenu.xml");
   }
 
  }

 4﹑新加如下方法﹕

 

  private void radioButtonCheckedChanged(object sender, System.EventArgs e)
  {
   
switch((sender as RadioButton).Name)
   {
    
case "rbEnglish":
     loadMenu(
"English");
     
break;
    
case "rbChenese":
     loadMenu(
"Chinese");
     
break;
   }
  }

5﹑將兩個RadionButtonCheckedChanged事件跟4中的方法挂鉤。

當時﹐我跟那位網友說有三種方法。說第三種是使用國內某MVP的寫的一個工具﹐其實跟第一種方法的原理差不多﹐只是可以快速一點而憶。由于本人沒有使用過﹐也就不提了吧。再說也沒有這個工具﹗ 呵呵...

 

 

 

posted on 2006-11-20 15:49  凯锐  阅读(998)  评论(2编辑  收藏  举报