亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 13:35:45
字體:
來源:轉載
供稿:網友

目       錄

第十三章     中英文版本切換設計... 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     語言管理類

  1. 定義一個詞條對應的可序列化的類。代碼如下:
[Serializable]public class CultureItem{       /// <summary>       /// 控件的級聯ID,中間用"."分隔       /// </summary>       [XmlAttribute]       public string Key { set; get; }       /// <summary>       /// 中文或英文描述       /// </summary>       [XmlAttribute]       public string Value { set; get; }}
  1. 定義一個設置語言屬性的枚舉。代碼如下:
public enum CultureLanguage{       [EnumDescr
  1. 開發一個語言管理類庫,本質上是根據語言配置文件對Dictionary<string, string>字典緩存進行操作。實現代碼如下:
public class CultureMananger{       PRivate static Dictionary<string, string> _dic = new Dictionary<string, string>();       private static string _cnPath = application.StartupPath + "http://SuperIO//Language//cn.xml";       private static string _enPath = Application.StartupPath + "http://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:504547114@QQ.com

QQ:504547114

.NET開發技術聯盟:54256083

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲人成网站在线观看| 日韩高清电影免费观看完整版| 91久久国产精品| 黑人巨大精品欧美一区二区| 久久久久久久久91| 国产精品美女免费| 亚洲欧美国产精品| 日本久久久久久久久| 久热99视频在线观看| 亚洲精品第一国产综合精品| 日韩在线观看高清| 亚洲福利视频二区| 亚洲国产日韩欧美综合久久| 亚洲第一国产精品| 欧美另类老肥妇| 亚洲电影免费观看高清完整版在线观看| 奇米一区二区三区四区久久| 国产欧美在线看| 亚洲激情 国产| 九九热这里只有精品免费看| 中文字幕av一区二区| 久久资源免费视频| 精品国产老师黑色丝袜高跟鞋| 久久精品国产91精品亚洲| 国产日韩欧美成人| 正在播放欧美一区| 国产亚洲一区二区在线| 中文字幕日韩欧美精品在线观看| 日韩中文av在线| 一区二区三区视频免费在线观看| 国产性猛交xxxx免费看久久| 欧美日韩一区免费| 国产一区二区三区在线观看视频| 亚洲永久免费观看| 色一情一乱一区二区| 亚洲激情自拍图| 国产亚洲人成a一在线v站| 亚洲在线第一页| 久久99久国产精品黄毛片入口| 亚洲欧洲国产精品| 欧美国产极速在线| 伦伦影院午夜日韩欧美限制| 精品香蕉一区二区三区| 成人性生交xxxxx网站| 中文字幕免费精品一区| 九九精品在线播放| 久久久精品999| 精品欧美一区二区三区| 欧美日本精品在线| 成人性生交大片免费看小说| 91免费福利视频| 日韩av中文字幕在线播放| 亚洲精品不卡在线| 国内外成人免费激情在线视频网站| 91网站免费看| 欧美日韩久久久久| 久久精品福利视频| 成人日韩av在线| 69视频在线免费观看| 亚洲国产成人精品一区二区| 亚洲成年网站在线观看| 一区二区在线视频播放| 国内精品久久久久久中文字幕| 成人一区二区电影| 日韩最新av在线| 亚洲综合社区网| 国产日韩欧美夫妻视频在线观看| 欧美精品中文字幕一区| 国产亚洲精品91在线| 欧美久久精品午夜青青大伊人| 久久久精品国产| 亚洲视频欧美视频| 黄色成人av在线| 欧美主播福利视频| 欧美在线激情网| 国产亚洲精品美女| 国产成人啪精品视频免费网| 欧美高清在线观看| 日韩中文理论片| 国产精品一区二区久久久| 黑人巨大精品欧美一区免费视频| 亚洲天堂av电影| 欧美一级大胆视频| 日韩精品在线观看一区| 国产成人精品久久二区二区| 日韩电影免费观看中文字幕| 欧美极品在线视频| 亚洲综合一区二区不卡| 日韩av电影手机在线观看| 日韩av在线影视| 亚洲国产成人精品一区二区| 色婷婷亚洲mv天堂mv在影片| 亚洲精品美女视频| 欧美日韩国产精品一区二区三区四区| 成人网欧美在线视频| 精品国内产的精品视频在线观看| 欧美日韩国产在线播放| 午夜欧美大片免费观看| 精品福利樱桃av导航| 97国产suv精品一区二区62| 疯狂做受xxxx欧美肥白少妇| 国产一区二区动漫| 久久久视频在线| 亚洲视频欧洲视频| 日本精品久久中文字幕佐佐木| 亚洲欧美制服中文字幕| 欧美一级淫片videoshd| 亚洲国产古装精品网站| 国产精品久久久久久搜索| 国产精品va在线播放我和闺蜜| 亚洲成av人乱码色午夜| 国产91ⅴ在线精品免费观看| 亚洲一区二区三区四区在线播放| 久久久国产一区二区| 国产成人午夜视频网址| 一本色道久久综合狠狠躁篇怎么玩| 国产丝袜高跟一区| 国产亚洲一区二区在线| 中文字幕在线成人| 欧美精品电影免费在线观看| 一本色道久久综合亚洲精品小说| yellow中文字幕久久| 久久精品成人一区二区三区| 亚洲国产成人精品久久久国产成人一区| 亚洲人成亚洲人成在线观看| 91久久精品国产91性色| 色偷偷偷综合中文字幕;dd| 中文字幕久热精品视频在线| 国产女精品视频网站免费| 69视频在线免费观看| 色偷偷噜噜噜亚洲男人| 免费av一区二区| 日韩视频在线观看免费| 538国产精品一区二区在线| 97免费在线视频| 欧美日韩国产精品一区二区三区四区| 日韩男女性生活视频| 97超级碰在线看视频免费在线看| 欧美激情亚洲自拍| 北条麻妃一区二区在线观看| 亚洲最大福利视频网站| 性欧美暴力猛交69hd| 2020欧美日韩在线视频| 亚洲精品视频播放| 欧美天天综合色影久久精品| 国产精品美女在线| 亚洲精品乱码久久久久久金桔影视| 欧美亚洲成人精品| 欧美日韩国产综合视频在线观看中文| 日韩欧美中文字幕在线观看| 中文字幕亚洲欧美日韩高清| 精品中文字幕视频| 亚洲一区免费网站| www.日韩av.com| 色视频www在线播放国产成人| 日本国产欧美一区二区三区| 中文字幕亚洲图片| 九九热r在线视频精品| 久久99精品久久久久久青青91| 91av福利视频| 麻豆乱码国产一区二区三区| 深夜福利日韩在线看| 亚洲欧美另类在线观看| 欧美在线免费观看|