/**////
///翻译类,将内部码翻译成容易理解的中文
///
///
///根据配置文件中的信息,将系统内部码(错误码、成功码)翻译成中文(或人容易理解的语言)。
///
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特性
object[]attrs=type.GetCustomAttributes(typeof(FlagsAttribute),false);
if(attrs.Length>0)
...{
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)
return"null";
stringxquery="/translation/description[@group='" group "']/add[@key='" obj.ToString() "']/@value";
XmlNodenode=content.SelectSingleNode(xquery);
if(node==null)
returnobj.ToString();
else
returnnode.Value;
}
}
#p#
在这个对象使用前需要使用Configure方法来加载xml配置文件,默认的配置文件名称为translation.config。转换对象使用单例模式,使用了一个FileSystemWatcher对象来监视XML文件,如果XML有变化,则从新加载。查询XML使用了XPath表达式。
然后即可使用GetEnumDescription和GetValueDescription方法来翻译枚举和标识了。如果没有找到可以翻译的值,则会返回对象的ToString方法的返回值。
示例XML配置:
<?xmlversion="1.0"encoding="utf-8"?>
<translation>
<enum>
<!--此出要用枚举的全名-->
<Library.UserType>
<Unknow>未知</Unknow>
<AfterPayUser>后付费用户</AfterPayUser>
<BeforePayUser>预付费用户</BeforePayUser>
</Library.UserType>
</enum>
<descriptiongroup="default">
<addkey="FileErrorl"value="文件已损坏"/>
</description>
<descriptiongroup="skin">
<addkey="Default"value="默认皮肤"/>
</description>
<descriptiongroup="topic">
<addkey="space"value="<spanclass='red'>您剩余的空间不足,请您删除部分文件。</span><br/>"/>
<addkey="yue"value="<spanclass='red'>您的余额不足,请尽快充值。</span><br/>"/>
</description>
</translation>
以上就是使用XML将机器内码转换为人们能够理解的信息案例分享的详细内容,更多请关注php中文网其它相关文章!
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
程序员必备接口测试调试工具:点击使用
Apipost = Postman + Swagger + Mock + Jmeter
Api设计、调试、文档、自动化测试工具
网页生成APP,用做网站的技术去做APP:立即创建
手机网站开发APP、自助封装APP、200+原生模块、2000+映射JS接口按需打包
相关文章
相关视频