网站项目的多语言访问的设计构思和实例

很多电子商务外贸网站有英文版和对应的中文版,当然还有更多的语言版本,传统的做法是做几套不同语言同核心的代码来实现,但这样的效果就是有点费时费力了,若来个N个语种的对外贸易那岂不是要做N套程序?

这是我前几天遇到的一个项目,是一个对外贸易的C2C网站,客户提出需要有英文版和中文版,所有我设计了这么个模式:使用标签“{*product*}”,如这个标签就代表着产品的意思,那么他可以替换为中文的“产品”,也可以是英文的“PRODUCT ”,或者更多的语言,我利用XML来存储语言包文件,然后利用DOM来检索对应的标签,再利用.NET的精华CACHE功能,吧语言包需要使用到的部分语言模块进行缓存来达到快速读取的 功能,让我们来看看代码吧

语言包xml 代码

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!--  
  3. 名称: ZH-CN.XML为简体中文语言包  
  4. 更新时间:2007-12-07  
  5. LanguageWebSiteNameNode:网站名(无实际作用,仅用于识别说明)  
  6. LanguageBigNode:区域模块名(无实际作用,仅用于识别说明)  
  7. LanguageSmallNode:具体字符串名  
  8.         --> 
  9. <Language> 
  10.   <LanguageWebSiteNameNode  Value="Directhood电子商务网站" Name="{*Directhood*}"> 
  11.     <LanguageBigNode  Value="系统管理" Name="{*SystemManage*}"> 
  12.       <LanguageSmallNode  Value="菜单管理" Name="{*MenuManage*}" /> 
  13.       <LanguageSmallNode  Value="用户管理" Name="{*UserManage*}" /> 
  14.       <LanguageSmallNode  Value="角色管理" Name="{*RoleManage*}" /> 
  15.     </LanguageBigNode> 
  16.     <LanguageBigNode  Value="产品管理" Name="{*ProductManage*}"> 
  17.       <LanguageSmallNode  Value="产品列表" Name="{*ProductList*}" /> 
  18.       <LanguageSmallNode  Value="产品分类" Name="{*ProductSort*}" /> 
  19.     </LanguageBigNode> 
  20.     <LanguageBigNode  Value="用户中心" Name="{*ProsceniumUserManage*}"> 
  21.       <LanguageSmallNode  Value="用户管理" Name="{*ProsceniumPeopleManage*}" /> 
  22.     </LanguageBigNode> 
  23.   </LanguageWebSiteNameNode> 
  24. </Language> 

 

进行语言筛选的CS类里面的方法

 
  1.  
  2.         /*查找语言包区域XML内容 */ 
  3.         /// <summary>  
  4.         /// 功能:查找语言包区域XML内容  
  5.         /// </summary>  
  6.         /// <param name="filePath">XML路径</param>  
  7.         /// <param name="searchTagName">大标签的NAME</param>  
  8.         /// <returns></returns>  
  9.         static public XmlNodeList GetLanguageXmlBigNode(string filePath, string searchTagName)  
  10.         {  
  11.             string tagName = "LanguageBigNode";//大标签标示  
  12.             string childTagName = "LanguageSmallNode";//小标签标示  
  13.  
  14.             XmlDocument xmlDoc = new XmlDocument();  
  15.             XmlNodeList nodelist;  
  16.             filePath = System.Web.HttpContext.Current.Server.MapPath(filePath);  
  17. //这里用到了CACHE进行缓存大模块的语言包  
  18.             if (CmdCache.GetCacheObj("LanguageXMLBigNode_" + searchTagName) == null)  
  19.             {  
  20.                 xmlDoc.Load(filePath);  
  21.                 CmdCache.AddObjToCache1("LanguageXMLBigNode_" + searchTagName, xmlDoc, new string[] { filePath });  
  22.             }  
  23.             xmlDoc = (XmlDocument)CmdCache.GetCacheObj("LanguageXMLBigNode_" + searchTagName);  
  24.  
  25.             try 
  26.             {  
  27.  
  28.                 nodelist = xmlDoc.GetElementsByTagName(tagName);  
  29.                 foreach (XmlNode node in nodelist)  
  30.                 {  
  31.                     string tempStr = node.Attributes["Name"].Value;  
  32.                     if (tempStr == searchTagName)  
  33.                     {  
  34.                         nodelist = node.ChildNodes;  
  35.  
  36.                         break;  
  37.                     }  
  38.                 }  
  39.  
  40.             }  
  41.             catch (Exception ex)  
  42.             {  
  43.                 throw new Exception(ex.ToString());  
  44.  
  45.             }  
  46.  
  47.             return nodelist;  
  48.         }  
  49.         /*查找语言包某区域内的某个节点的XML内容 */ 
  50.         /// <summary>  
  51.         /// 功能:查找语言包某区域内的某个节点的XML内容  
  52.         /// </summary>  
  53.         /// <param name="nodeList">子节点的列表</param>  
  54.         /// <param name="searchChildTagName">子节点属性的NAME</param>  
  55.         /// <returns></returns>  
  56.         static public string GetLanguageXmlSmallNode(XmlNodeList nodeList, string searchChildTagName)  
  57.         {  
  58.             string value = "";  
  59.             try 
  60.             {  
  61.  
  62.  
  63.                 foreach (XmlNode node in nodeList)  
  64.                 {  
  65.                     string tempStr = node.Attributes["Name"].Value;  
  66.                     if (tempStr == searchChildTagName)  
  67.                     {  
  68.                         value = node.Attributes["Value"].Value;  
  69.                         break;  
  70.                     }  
  71.                 }  
  72.  
  73.             }  
  74.             catch (Exception ex)  
  75.             {  
  76.                 return ex.ToString();  
  77.  
  78.             }  
  79.  
  80.             return value;  
  81.         }  
  82.         /*查找语言包XML内容 */ 
  83.         /// <summary>  
  84.         /// 功能:查找语言包XML指定的VALUE内容  
  85.         /// </summary>  
  86.         /// <param name="filePath">XML路径</param>  
  87.         /// <param name="searchTagName">大标签的NAME</param>  
  88.         /// <param name="searchChildTagName">小标签的NAME</param>  
  89.         /// <returns></returns>  
  90.         static public string LoadLanguageXml(string filePath, string searchTagName, string searchChildTagName)  
  91.         {  
  92.  
  93.             XmlNodeList nodelist = GetLanguageXmlBigNode(filePath, searchTagName);  
  94.  
  95.             string value = GetLanguageXmlSmallNode(nodelist, searchChildTagName);  
  96.  
  97.             return value;  
  98.  
  99.         }  

有什么不理解或者有更好的办法的,欢迎大家和我交流!



文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
评论: 0 | 引用: 0 | 查看次数: 2250
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭