國際化你的程序
(Windows)
事情也源于一個網友的問題﹐她說在Java中很好實現: “在JAVA中用一個資源文件存起來,然後在瀏覽器裡選擇國家就行了
“這是她的原話。﹐因為她曾上過一段時間的.NET的課程﹐然后她想知道.NET中如何實現。我當時是這么告訴她的﹕
屬性中有一個叫Localizable的﹐設為True
然后Language選不同國家語言就行了。
不一會兒﹐又到了我們下班的時間﹐也就只好如此﹐沒有細說﹐吃飯的時候﹐想想或者這樣子說﹐人家不一定能做出完整的可行性方案出來。所以我在這里重述一遍﹕
第一種﹐最簡便的方法﹕
1﹑新建一個Windows專案。在窗體屬性中找到Localizable的﹐設為True,Lanuguage就用默認的好了。
2﹑在工具箱中拖一個標簽過來。Name不改變﹐保持為label1,Text設為”Hello, English !” 再拖兩個 RadioButton﹐Name分別設為:rbEnglish和rbChinese,Text屬性分別為English 和Chinese。
3﹑再次回到窗體屬性中找到Lanuguage,設為你想要的國家的語言。例如中文(台灣)。這樣在你的專案運行目錄下面就會有一個叫”zh-TW”的文件夾﹐里面有一個叫”你的專案名.resources.dll”的文件。
4﹑找到剛拖進來的標簽label1﹐將Text屬性設為”你好﹐中國” ,將rbEnglish的Text屬性為"英文",將rbChinese的Text的屬性設為"中文繁體"。
5﹑回到代碼編輯區﹐在建構函數加入
運行后﹐你的界面就是中文繁體的啦。顯示”你好﹐中國”.當然﹐如果你要顯示英文或其它什么語言﹐只需將5中的”zh-TW”換成你要的語言代號就可以了。
第二種,使用Xml文件﹕
1﹑這個需要對xml文件有一定的了解。首先新建一個xml文件﹐假設名為:LanguageMenu.xml,輸入內容如下﹕
<LanguageMenu>
<English label1="Hello,English" rbEnglish ="English" rbChinese="Chinese"/>
<Chinese label1="你好﹐中國" rbEnglish ="英文" rbChinese="中文繁體"/>
</LanguageMenu>
2﹑回到上面建的Windows專案中﹐ 將Localizable改回False.
3﹑新加如下方法﹕
{
//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﹑新加如下方法﹕
{
switch((sender as RadioButton).Name)
{
case "rbEnglish":
loadMenu("English");
break;
case "rbChenese":
loadMenu("Chinese");
break;
}
}
5﹑將兩個RadionButton的CheckedChanged事件跟4中的方法挂鉤。
當時﹐我跟那位網友說有三種方法。說第三種是使用國內某MVP的寫的一個工具﹐其實跟第一種方法的原理差不多﹐只是可以快速一點而憶。由于本人沒有使用過﹐也就不提了吧。再說也沒有這個工具﹗
呵呵...