用XML将机器内码转换为人们容易理解的信息
所属分类:
网页制作 / XML/XSLT
阅读数:
843
收藏 0赞 0分享
程序中通常会有一些错误代码或标识,为了程序中方便这些东西通常不会使用汉字,经常在程序中用的是一些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特性
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>
WAP教程(6):WML 任务-XML/XSLT
任务 (task) 定义了事件发生时所执行的动作,比如在输入一个卡片或选择一个链接之类的时间发生时。
任务 (task) 定义了事件发生时所执行的动作,比如在输入一个卡片或选择一个链接之类的时间发生时。
Go 任务
&l
收藏 0赞 0分享
WAP教程(5):WML 输入-XML/XSLT
输入字段可以制作让用户可输入信息的 WML 卡片,正如这个例子演示的.
输入字段
可以制作让用户可输入信息的 WML 卡片,正如这个例子演示的:
<?xml version="1.0"?>
<
收藏 0赞 0分享
WAP教程(4):WML 链接和图像-XML/XSLT
链接可以制作 WML 卡片来显示 WML 的锚功能,图像可以制作 WML 卡片来显示图像.
链接
可以制作 WML 卡片来显示 WML 的锚功能。
<anchor>
<anchor> 标签总是要规定一个任
收藏 0赞 0分享
WAP教程(8):WML 变量-XML/XSLT
变量当用户在卡片组的卡片之间切换时,我们需要在变量中存储数据。WML 变量对大小写敏感。
变量
当用户在卡片组的卡片之间切换时,我们需要在变量中存储数据。WML 变量对大小写敏感。
通过 Setvar 命令规定变量
当用户
收藏 0赞 0分享
WAP教程(2):WAP 基础-XML/XSLT
WAP 的主页与 HTML 的主页非常不同。用于 WAP 的标记语言是 WML (Wireless Markup Language)。WML 使用标签 - 类似 HTML - 但是语法更严格且遵守 XML 1.0 标准。
WAP 主页
W
收藏 0赞 0分享
WAP教程(9):WML 实例-XML/XSLT
带有两个卡片的一个卡片组 - 一个供用户输入,一个供显示结果 - 正如本例中展示的.
带有两个卡片的一个卡片组 - 一个供用户输入,一个供显示结果 - 正如本例中展示的:
<?xml version="1.0"
收藏 0赞 0分享
WAP教程(1):WAP 简介-XML/XSLT
WAP 协议被设计用来在无线客户端(比如移动电话)上展示因特网内容。
WAP 协议被设计用来在无线客户端(比如移动电话)上展示因特网内容。
您应当具备的基础知识
在继续学习之前,您需要对下面的知识有基本的了
收藏 0赞 0分享
XML入门教程:XSLT-XML/XSLT
XSLT是XSL的一部份,它是XML的一种应用,指定将一篇XML文档转换成另一种XML文档的规则。XSLT文档即是一篇XML文档,也是一个样式表,里面包含一系列的模板。XSLT处理器对输入XML文档中的元素和样式表中的模板进行比较,如果匹配,则将该模板的内
收藏 0赞 0分享
XMLHTTPRequest对象-XML/XSLT
XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。
1、XMLHTTPReque
收藏 0赞 0分享
查看更多