资源本地化——Localization

时间:2023-01-24 03:18:06

为了支持Localization,同样借鉴XML这一强大技术,我的本地资源化非常简单:

Resource.GetModule(“Menu”)[“New”]

通过这样一个句代码,你便可获取Unicode的字符了。

当然,你要问这是怎么来的呢?下面让我们看一下配置文件:

< Resource >
    
< config  module ="Product" >
       
< item  key ="Title" > 智睿方案框架管理系统 </ item >
            
< item  key ="SubTitle" > ——基于面向服务的多层架构 </ item >
       
< item  key ="Copyright" > 版权所有 ZIVSOFT 2000年-2008年 </ item >
            
< item  key ="Architect" > 沪ICP备07505171号 </ item >
    
</ config >
    
< config  module ="Login" >
       
< item  key ="Login" > 登陆 </ item >
            
< item  key ="Logout" > 退出 </ item >
       
< item  key ="UserName" > 用户 </ item >
       
< item  key ="Password" > 密码 </ item >
       
< item  key ="Title" > 登陆系统 </ item >
    
</ config >
</ Resource >


这样的文件你可以写多个,比如
ResourceCN.xmlResourceEN.xml等等。 

1   < Localization  loc ="en-us" >
2     
< en-us > App_Data"Localization"ResourceEn.xml </ en-us >
3     
< zh-cn > App_Data"Localization"ResourceCn.xml </ zh-cn >
4     
< zh-tw > App_Data"Localization"ResourceTw.xml </ zh-tw >
5     
< jp-wh > App_Data"Localization"ResourceJp.xml </ jp-wh >
6     
< ko-kr > App_Data"Localization"ResourceKo.xml </ ko-kr >
7     
< es-mx > App_Data"Localization"ResourceEs.xml </ es-mx >
8  
</ Localization >


注意:当loc类型设置为”en-us”,系统控件的UI默认值便是en-us了。 

为满足回帖人要求,把最主要的Resource类帖出来了:

  1 using System;
  2 using System.Collections;
  3 using System.Configuration;
  4 using System.Xml;
  5 using System.IO;
  6 using System.Reflection;
  7 using System.Diagnostics;
  8 
  9 /*
 10  * Created by Lihua at 2006-11-26
 11  * http://www.zivsoft.com
 12  */
 13 
 14 namespace Zivsoft.Localization
 15 {
 16     /// <summary>
 17     /// Resource Files, Language Version Solution.
 18     /// </summary>
 19     public class Resource:IResource
 20     {
 21         /// <summary>
 22         /// string is stored in hashtable
 23         /// </summary>
 24         private static Hashtable _htStrRes;
 25         
 26         /// <summary>
 27         /// 
 28         /// </summary>
 29         private Hashtable _htData;
 30         /// <summary>
 31         /// 
 32         /// </summary>
 33         private string _module;
 34 
 35         /// <summary>
 36         /// 
 37         /// </summary>
 38         private Resource(string module)
 39         {
 40             this._module = module;
 41             this._htData = new Hashtable();
 42         }
 43 
 44         /// <summary>
 45         /// 
 46         /// </summary>
 47         static Resource()
 48         {
 49             _htStrRes = new Hashtable();
 50         }
 51 
 52         public static string CultureId
 53         {
 54             get
 55             {
 56                 var loader = new ResourceFileLoader();
 57                 return loader.GetCurrentLanguage();
 58             }
 59         }
 60 
 61         /// <summary>
 62         /// Get Resource By Module ID
 63         /// </summary>
 64         public static Resource GetModule(string module)
 65         {
 66 
 67             if (module == null || module.Trim() == "")
 68             {
 69                 throw new Exception("Resource-Instance: Module's value is null in resource files.");
 70             }
 71             //
 72             if (_htStrRes.ContainsKey(module))
 73             {
 74                 return _htStrRes[module] as Resource;
 75             }
 76             Resource strRes = new Resource(module);
 77             strRes.LoadData();
 78             _htStrRes.Add(module, strRes);
 79             return strRes;
 80         }
 81 
 82         /// <summary>
 83         /// 
 84         /// </summary>
 85         private void LoadData()
 86         {
 87             //clear
 88             this._htData.Clear();
 89             //read XML file, and store the value in hashtable
 90             string configName = null;
 91             ResourceFileLoader loader = new ResourceFileLoader();
 92             configName = loader.GetFullFilePath();
 93             if (configName == string.Empty)
 94             {
 95                 this._htData.Clear();
 96                 return;
 97             }
 98 
 99             //configuration file
100             XmlDocument xmlDoc = new XmlDocument();
101             try
102             {
103                 xmlDoc.Load(configName);
104                 XmlNode root = xmlDoc.DocumentElement;
105                 foreach (XmlNode xNode in root.ChildNodes)
106                 {
107                     //node is Config
108                     if (xNode.Name != "config")
109                     {
110                         continue;
111                     }
112 
113                     //node is module
114                     XmlAttribute attr = xNode.Attributes["module"];
115                     if (null == attr)
116                     {
117                         continue;
118                     }
119 
120                     //if it is current module
121                     if (this._module == xNode.Attributes["module"].Value)
122                     {
123                         foreach (XmlNode item in xNode.ChildNodes)
124                         {
125                             attr = item.Attributes["key"];
126                             if (null == attr || this._htData.ContainsKey(attr.Value))
127                             {
128                                 continue;
129                             }
130                             this._htData.Add(attr.Value, item.InnerText);
131                         }
132                         break;
133                     }
134                 }
135             }
136             catch (Exception e)
137             {
138                 Debug.WriteLine(e);
139                 this._htData.Clear();
140             }
141         }
142 
143         /// <summary>
144         /// 
145         /// </summary>
146         public string this[string key]
147         {
148             get
149             {
150                 string s = this._htData[key] as string;
151                 string def = "[" + this._module + "][" + key + "]";
152                 return s == null ? def : s;
153             }
154         }
155         /// <summary>
156         /// 
157         /// </summary>
158         public string GetKey(string key)
159         {
160             return this[key];
161         }
162 
163     }
164 }