网站项目的多语言访问的设计构思和实例
作者:admin 日期:2008-04-03
很多电子商务外贸网站有英文版和对应的中文版,当然还有更多的语言版本,传统的做法是做几套不同语言同核心的代码来实现,但这样的效果就是有点费时费力了,若来个N个语种的对外贸易那岂不是要做N套程序?
这是我前几天遇到的一个项目,是一个对外贸易的C2C网站,客户提出需要有英文版和中文版,所有我设计了这么个模式:使用标签“{*product*}”,如这个标签就代表着产品的意思,那么他可以替换为中文的“产品”,也可以是英文的“PRODUCT ”,或者更多的语言,我利用XML来存储语言包文件,然后利用DOM来检索对应的标签,再利用.NET的精华CACHE功能,吧语言包需要使用到的部分语言模块进行缓存来达到快速读取的 功能,让我们来看看代码吧
语言包xml 代码
- <?xml version="1.0" encoding="utf-8"?>
- <!--
- 名称: ZH-CN.XML为简体中文语言包
- 更新时间:2007-12-07
- LanguageWebSiteNameNode:网站名(无实际作用,仅用于识别说明)
- LanguageBigNode:区域模块名(无实际作用,仅用于识别说明)
- LanguageSmallNode:具体字符串名
- -->
- <Language>
- <LanguageWebSiteNameNode Value="Directhood电子商务网站" Name="{*Directhood*}">
- <LanguageBigNode Value="系统管理" Name="{*SystemManage*}">
- <LanguageSmallNode Value="菜单管理" Name="{*MenuManage*}" />
- <LanguageSmallNode Value="用户管理" Name="{*UserManage*}" />
- <LanguageSmallNode Value="角色管理" Name="{*RoleManage*}" />
- </LanguageBigNode>
- <LanguageBigNode Value="产品管理" Name="{*ProductManage*}">
- <LanguageSmallNode Value="产品列表" Name="{*ProductList*}" />
- <LanguageSmallNode Value="产品分类" Name="{*ProductSort*}" />
- </LanguageBigNode>
- <LanguageBigNode Value="用户中心" Name="{*ProsceniumUserManage*}">
- <LanguageSmallNode Value="用户管理" Name="{*ProsceniumPeopleManage*}" />
- </LanguageBigNode>
- </LanguageWebSiteNameNode>
- </Language>
进行语言筛选的CS类里面的方法
- /*查找语言包区域XML内容 */
- /// <summary>
- /// 功能:查找语言包区域XML内容
- /// </summary>
- /// <param name="filePath">XML路径</param>
- /// <param name="searchTagName">大标签的NAME</param>
- /// <returns></returns>
- static public XmlNodeList GetLanguageXmlBigNode(string filePath, string searchTagName)
- {
- string tagName = "LanguageBigNode";//大标签标示
- string childTagName = "LanguageSmallNode";//小标签标示
- XmlDocument xmlDoc = new XmlDocument();
- XmlNodeList nodelist;
- filePath = System.Web.HttpContext.Current.Server.MapPath(filePath);
- //这里用到了CACHE进行缓存大模块的语言包
- if (CmdCache.GetCacheObj("LanguageXMLBigNode_" + searchTagName) == null)
- {
- xmlDoc.Load(filePath);
- CmdCache.AddObjToCache1("LanguageXMLBigNode_" + searchTagName, xmlDoc, new string[] { filePath });
- }
- xmlDoc = (XmlDocument)CmdCache.GetCacheObj("LanguageXMLBigNode_" + searchTagName);
- try
- {
- nodelist = xmlDoc.GetElementsByTagName(tagName);
- foreach (XmlNode node in nodelist)
- {
- string tempStr = node.Attributes["Name"].Value;
- if (tempStr == searchTagName)
- {
- nodelist = node.ChildNodes;
- break;
- }
- }
- }
- catch (Exception ex)
- {
- throw new Exception(ex.ToString());
- }
- return nodelist;
- }
- /*查找语言包某区域内的某个节点的XML内容 */
- /// <summary>
- /// 功能:查找语言包某区域内的某个节点的XML内容
- /// </summary>
- /// <param name="nodeList">子节点的列表</param>
- /// <param name="searchChildTagName">子节点属性的NAME</param>
- /// <returns></returns>
- static public string GetLanguageXmlSmallNode(XmlNodeList nodeList, string searchChildTagName)
- {
- string value = "";
- try
- {
- foreach (XmlNode node in nodeList)
- {
- string tempStr = node.Attributes["Name"].Value;
- if (tempStr == searchChildTagName)
- {
- value = node.Attributes["Value"].Value;
- break;
- }
- }
- }
- catch (Exception ex)
- {
- return ex.ToString();
- }
- return value;
- }
- /*查找语言包XML内容 */
- /// <summary>
- /// 功能:查找语言包XML指定的VALUE内容
- /// </summary>
- /// <param name="filePath">XML路径</param>
- /// <param name="searchTagName">大标签的NAME</param>
- /// <param name="searchChildTagName">小标签的NAME</param>
- /// <returns></returns>
- static public string LoadLanguageXml(string filePath, string searchTagName, string searchChildTagName)
- {
- XmlNodeList nodelist = GetLanguageXmlBigNode(filePath, searchTagName);
- string value = GetLanguageXmlSmallNode(nodelist, searchChildTagName);
- return value;
- }
有什么不理解或者有更好的办法的,欢迎大家和我交流!
评论: 0 | 引用: 0 | 查看次数: 2250
发表评论
上一篇
下一篇

文章来自:
Tags: 





