程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [連載]《C#通訊(串口和網絡)框架的設計與實現》- 13.中英文版本切換設計,

[連載]《C#通訊(串口和網絡)框架的設計與實現》- 13.中英文版本切換設計,

編輯:C#入門知識

[連載]《C#通訊(串口和網絡)框架的設計與實現》- 13.中英文版本切換設計,


目       錄

第十三章     中英文版本切換設計... 2

13.1        不用自帶的資源文件的理由... 2

13.2        配置文件... 2

13.3        語言管理類... 3

13.4        應用管理類... 12

13.5        小結... 12

 

第十三章      中英文版本切換設計

13.1     不用自帶的資源文件的理由

     可以利用resx資源文件進行多語言設計,resx文件本身是kv類型的資源文件,設計好資源文件後,啟動軟件時可以通過CurrentCulture屬性設置要顯示的語言。實現代碼如下:

//設置成英文版本

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-us");

     但是,軟件涉及到多線程、線程池、異步等應用的時候,當前線程設置了英文版本,其他線程還是默認的語言文化,例如:主線程設置了en-US,但是新建線程和其他已經存在的線程還是zh-CN,如果各部分UI不在同一線程更新的話,語言文化的設置是不一樣的,所以沒有辦法實現統一的語言顯示。

     那麼,可不可以通過進程獲得所有線程信息,統一進行設置語言文化信息呢,的確是一個很好的想法。但是,通過實踐證明這是行不能的,可能造反軟件異常退出。為什麼會出現這個現象呢?我猜想,一個進程中不僅包括自定義的線程,還存在系統級的線程,這樣操作是一件危險的事。

    難道就沒有辦法實現了嗎?人不可能被尿憋死。在.NET 4.5中就簡單多了,直接使用System.Globalization命名空間內CultureInfo類型的 DefaultThreadCurrentCulture和DefaultThreadCurrentUICulture屬性。設置好後,每一個新線程的 CurrentUICulture和CurrentCulture屬性都會和這個值保持一致的。CultureInfo類具體怎麼實現的,還沒有研究過。

    為了兼容XP操作系統,還在使用.NET4.0的框架。相信也可以實現CultureInfo類的功能,但是不如自己設計一套語言版本方案更直接、更省時間。有時間的情況下可以研究一下CultureInfo類的實現。

13.2     配置文件

     先設計語言配置文件,文件格式采用XML,存儲方式采用KV的方式,文件命名可以自定義,例如:cn.xml、en.xml。如下圖:

 

     Key的定義有兩種方式,第一種:窗體命名.控件命名,可以對窗體的控件統一改變顯示的語言信息。第二種:直接定義關鍵字,可以對提示信息、狀態信息等單獨詞條改變顯示的語言信息。Value就是最終要顯示語言的具體內容,完全自定義。

13.3     語言管理類

[Serializable]
public class CultureItem
{
       /// <summary>
       /// 控件的級聯ID,中間用"."分隔
       /// </summary>
       [XmlAttribute]
       public string Key { set; get; }

       /// <summary>
       /// 中文或英文描述
       /// </summary>
       [XmlAttribute]
       public string Value { set; get; }
}
public enum CultureLanguage
{
       [EnumDescription("中文")]
       Chinese,
       [EnumDescription("英文")]
       English
}
public class CultureMananger
{
       private static Dictionary<string, string> _dic = new Dictionary<string, string>();
       private static string _cnPath = Application.StartupPath + "\\SuperIO\\Language\\cn.xml";
       private static string _enPath = Application.StartupPath + "\\SuperIO\\Language\\en.xml";
       private static object SyncObject = new object();

       /// <summary>
       /// 加載語言文件到緩存中
       /// </summary>
       public static void LoadCulture()
       {
              lock (SyncObject)
              {
                     if (IsLanguage)
                     {
                            try
                            {
                                   _dic.Clear();
                                  string path = String.Empty;
                                   if (Language == CultureLanguage.Chinese)
                                   {
                                          path = _cnPath;
                                   }
                                   else if (Language == CultureLanguage.English)
                                   {
                                          path = _enPath;
                                   }
                                   if (File.Exists(path))
                                   {
                                          List<CultureItem> itemList =SerializeOperation.SerializeOperation.GetSerialize<List<CultureItem>>(path);
                                          foreach (CultureItem item in itemList)
                                          {
                                                 _dic.Add(item.Key, item.Value);
                                          }
                                   }
                            }
                            catch (Exception ex)
                            {
                                   GeneralLog.WriteLog(ex);
                            }
                     }
              }
       }
 
       /// <summary>
       /// 清除緩存中的語言信息
       /// </summary>
       public static void ClearCache()
       {
              lock (SyncObject)
              {
                     _dic.Clear();
              }
       }

       /// <summary>
       /// 設置和獲得語言類型屬性
       /// </summary>
       public static CultureLanguage Language
       {
              set
              {
                     if (GlobalProperty.GetInstance().Language != value)
                     {
                            GlobalProperty.GetInstance().Language = value;
                            GlobalProperty.GetInstance().Save();
                            LoadCulture();
                     }
              }
              get { return GlobalProperty.GetInstance().Language; }
       }

       /// <summary>
       /// 獲得詞條對應的描述信息
       /// </summary>
       /// <param name="formName">窗體名稱</param>
       /// <param name="field">詞條字段</param>
       /// <returns>對應的描述信息</returns>
       public static string GetString(string formName, string field)
       {
              return GetString(String.Format("{0}.{1}", formName, field));
       }
 
       /// <summary>
       /// 獲得詞條對應的描述信息
       /// </summary>
       /// <param name="key">字段的關鍵字</param>
       /// <returns></returns>
       public static string GetString(string key)
       {
              lock (SyncObject)
              {
                     if (IsLanguage)
                     {
                            string val = String.Empty;
                            if (_dic.ContainsKey(key))
                            {
                                   _dic.TryGetValue(key, out val);
                            }
                            return val;
                     }
                     else
                     {
                            return String.Empty;
                     }
              }
       }

       /// <summary>
       /// 應用窗體,改變語言顯示
       /// </summary>
       /// <param name="frm"></param>
       public static void ApplyResourcesForm(Form frm)
       {
              if (IsLanguage)
              {
                    string frmText = GetString(frm.Name);
                     if (!String.IsNullOrEmpty(frmText))
                     {
                            frm.Text = frmText;
                     }
                     ApplyControls(frm.Name, frm.Controls);
              }
       }
 
       /// <summary>
       /// 應用BarManager工具具,改變語言顯示
       /// </summary>
       /// <param name="name"></param>
       /// <param name="bar"></param>
       public static void AppResourceBarItem(string name, BarManager bar)
       {
              if (IsLanguage)
              {
                     string key = String.Empty;
                     foreach (BarItem item in bar.Items)
                     {
                            key = String.Format("{0}.{1}", name, item.Name);
                            string val = GetString(key);
                            if (!String.IsNullOrEmpty(val))
                            {
                                   item.Caption = val;
                            }
                     }
              }
       }

       /// <summary>
       /// 應用控件,改變語言顯示
       /// /summary>
       /// <param name="name"></param>
       /// <param name="ctrls"></param>
       public static void ApplyControls(string name, Control.ControlCollection ctrls)
       {
              if (IsLanguage)
              {
                    foreach (Control ctrl in ctrls)
                     {
                            if (ctrl is MenuStrip) //MenuStrip StatusStrip
                            {
                                   ApplyMenuStrip(name, (MenuStrip) ctrl);
                            }
                            else if (ctrl is StatusStrip)
                            {
                                   ApplyStatusStrip(name, (StatusStrip) ctrl);
                            }
                            else if (ctrl is ListView)
                            {
                                   ApplyListView(name, (ListView) ctrl);
                            }
                            else
                            {
                                   ApplyControls(name, ctrl);
                            }

                            if (ctrl.HasChildren)
                            {
                                   ApplyControls(name, ctrl.Controls);
                            }
                     }
              }
       }

       internal static bool IsLanguage
       {
              get
              {
                     if (File.Exists(_cnPath) && File.Exists(_enPath))
                     {
                            return true;
                     }
                     else
                     {
                            return false;
                     }
              }
       }

       private static void ApplyControls(string name, Control ctrl)
       {
              string key = String.Format("{0}.{1}", name, ctrl.Name);
              string text = GetString(key);
              if (!String.IsNullOrEmpty(text))
              {
                     ctrl.Text = text;
              }
       }

       private static void ApplyMenuStrip(string name, MenuStrip menu)
       {
              foreach (ToolStripMenuItem item in menu.Items)
              {
                     ApplyMenuItem(name, item);
              }
       }

       private static void ApplyMenuItem(string name, ToolStripMenuItem item)
       {
              string key = String.Format("{0}.{1}", name, item.Name);
              string text = GetString(key);
              if (!String.IsNullOrEmpty(text))
              {
                     item.Text = text;
              }
              if (item.DropDownItems.Count > 0)
              {
                     foreach (ToolStripMenuItem subItem in item.DropDownItems)
                     {
                            ApplyMenuItem(name, subItem);
                     }
              }
       }
 
       private static void ApplyStatusStrip(string name, StatusStrip status)
       {
              string key = String.Empty;
              foreach (ToolStripItem item in status.Items)
              {
                     key = String.Format("{0}.{1}", name, item.Name);
                     string val= GetString(key);
                     if (!String.IsNullOrEmpty(val))
                     {
                            item.Text = val;
                     }
              }
       }
 
       private static void ApplyListView(string name, ListView lv)
       {
              string key = String.Empty;
              foreach (ColumnHeader header in lv.Columns)
              {
                     key = String.Format("{0}.{1}", name, header.Tag == null ? "" : header.Tag.ToString());
                     string val = GetString(key);
                     if (!String.IsNullOrEmpty(val))
                     {
                            header.Text = val;
                     }
              }
       }
}

 

13.4     應用管理類

     在軟件啟動時可以使用CultureMananger管理類,具體應用代碼如下:

CultureMananger.LoadCulture();
CultureMananger.ApplyControls("MainForm",this.Controls);
string state=CultureMananger.GetString("State.Normal");

13.5     小結

    這是一個小的工具組件,具有一定的通用性。

 

 

作者:唯笑志在

Email:[email protected]

QQ:504547114

.NET開發技術聯盟:54256083

文檔下載:http://pan.baidu.com/s/1pJ7lZWf

官方網址:http://www.bmpj.net

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved