程序中通常會有一些錯誤代碼或標識,為了程序中方便這些東西通常不會使用漢字,經常在程序中用的是一些FileError或數字。還有就是在編碼中經常使用的枚舉標識對象的狀態。而通常這些信息會直接的或間接的現實給用戶,可用戶需要到的是容易理解的漢字描述。以前要麼將這些標識和枚舉的轉換規則硬編碼到程序中,要麼就直接提示給用戶。前者沒有很好的擴展性,而後者則讓用戶一頭霧水。現可以用流行的XML(配置文件)保存提示信息,然後用一個對象將機器中的內碼轉換為人們容易理解的信息。
轉換對象
/**////
///翻譯類,將內部碼翻譯成容易理解的中文
///
///
///根據配置文件中的信息,將系統內部碼(錯誤碼、成功碼)翻譯成中文(或人容易理解的語言)。
///
publicstaticclassTranslation
...{
privatestaticSystem.IO.FileSystemWatcherwatcher;
privatestaticXMLDocumentcontent;
privatestaticstringconfigFile;
privatestaticobjectlocker=newobject();
/**////
///加載配置文件
///
///
publicstaticvoidConfigure(stringconfigFile)
...{
LoadFile(configFile);
if(watcher!=null)
...{
watcher.Dispose();
}
watcher=newFileSystemWatcher(Path.GetDirectoryName(configFile),Path.GetFileName(configFile));
watcher.Changed+=newFileSystemEventHandler(watcher_Changed);
}
/**////
///加載默認配置文件
///
publicstaticvoidConfigure()
...{
if(System.Web.HttpContext.Current!=null)
...{
Configure(System.Web.HttpContext.Current.Server.MapPath(~/translation.config));
}
else
...{
Configure(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase+“+translation.config);
}
}
/**////
///加載文件內容
///
///
privatestaticvoidLoadFile(stringconfigFile)
...{
lock(locker)
...{
XmlDocumentdoc=newXMLDocument();
doc.Load(configFile);
content=doc;
Translation.configFile=configFile;
}
}
/**////
///當文件變更時,從新加載文件
///
///
///
privatestaticvoidwatcher_Changed(objectsender,FileSystemEventArgse)
...{
LoadFile(configFile);
}
/**////
///獲取Enum的解釋,如果Enum有Flag標記,則使用逗號分隔各個解釋
///
///
///
publicstaticstringGetEnumDescription(EnumenumValue)
...{
returnGetEnumDescription(enumValue,,);
}
/**////
///獲取Enum的解釋,如果Enum有Flag標記,則使用sparator分隔各個解釋
///
///
///
///
publicstaticstringGetEnumDescription(EnumenumValue,stringsparator)
...{
Typetype=enumValue.GetType();
//檢查類型是否有Flags特性
objectattrs=type.GetCustomAttributes(typeof(FlagsAttribute),false);
if(attrs.Length0)
...{
StringBuilderbuilder=newStringBuilder();
Arrayarr=Enum.GetValues(type);
foreach(Enumenuinarr)//循環獲取每一個值的解釋
...{
if((Convert.ToUInt64(enumValue)Convert.ToUInt64(enu))==Convert.ToUInt64(enu))//判斷是否有這個值
...{
builder.Append(GetEnumDes(type,enu.ToString()));
builder.Append(sparator);
}
}
if(builder.Length!=0)//拿掉最後的分隔符
builder.Remove(builder.Length-sparator.Length,sparator.Length);
returnbuilder.ToString();
}
else
...{
returnGetEnumDes(type,enumValue.ToString());
}
}
/**////
///獲取某一Enum類型值的解釋
///
///
///
///
privatestaticstringGetEnumDes(Typetype,stringvalue)
...{
stringxquery=/translation/enum/+type.FullName+/+value;
XMLNodenode=content.SelectSingleNode(xquery);
if(node!=null)
returnnode.InnerText;
else
returnvalue;
}
/**////
///翻譯指定值
///
///
///
publicstaticstringGetValueDescription(objectobj)
...{
returnGetValueDescription(default,obj);
}
/**////
///在指定組中翻譯指定值
///
///
///
///
publicstaticstringGetValueDescription(stringgroup,objectobj)
...{
if(obj==null)
returnnull;
stringxquery=/translation/description[@group=‘+group+‘]/add[@key=‘+obj.ToString()+‘]/@value;
XMLNodenode=content.SelectSingleNode(xquery);
if(node==null)
returnobj.ToString();
else
returnnode.Value;
}
}