《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于XML及反射技術的多語言界面研究與實現
基于XML及反射技術的多語言界面研究與實現
來源:微型機與應用2012年第13期
顧薛平,吳 寧
(南京航空航天大學 電子信息工程學院,江蘇 南京 210016)
摘要: 針對飛行員飛行品質評估系統中的多語言界面問題,采用擴展XML外部語言包的方法,結合反射技術,實現了C#語言環境下對應用軟件的多語言支持。實現過程中對界面文字的導入/導出功能進行了封裝處理,消除了冗余代碼。該方法對源程序修改較少,而擴展性強、維護成本小、程序直觀性好。
Abstract:
Key words :

摘  要: 針對飛行員飛行品質評估系統中的多語言界面問題,采用擴展XML外部語言包的方法,結合反射技術,實現了C#語言環境下對應用軟件的多語言支持。實現過程中對界面文字的導入/導出功能進行了封裝處理,消除了冗余代碼。該方法對源程序修改較少,而擴展性強、維護成本小、程序直觀性好。
關鍵詞:  XML;反射技術;多語言界面;C#

 為保證飛行安全、降低事故發生率,國內外民航系統普遍重視飛行員的培訓工作。目前,國內飛行員培訓中心對飛行員操作水平的評估一般都是采用教練員觀察和打分的方式,不夠客觀和全面。飛行員飛行品質評估系統是一個能夠實現自動規范評分的軟件,它面向的客戶是訓練中心的教員、各航空公司的受訓飛行員和高層管理者等,因此,要求軟件能夠針對不同國家的用戶,提供不同語言版本的界面,以便于用戶能夠更快地接受和使用該產品。
 多語言界面軟件的設計,通常采取應用程序和界面文字顯示相分離的技術[1]:程序代碼獨立編寫,語言資源從核心代碼中分離出來儲存到文件,運行時根據用戶需求選擇相應的語言資源文件并顯示。常用的方法有:(1)將系統支持的語言資源生成一個多語言的可執行文件或獨立的資源文件[2]。這種方法比較常用,但是資源更新時需要重新編譯,擴展性差;(2)將支持的語言資源存放在外部語言包中,通過替換語言包達到切換語種的目的[3-4]。這種方法不需要重新編譯程序,外部語言包保持獨立,可以動態修改。
 基于軟件開發過程中提出的對源程序進行最少的修改,達到盡可能高的效率、可靠性和擴展性的要求,本文利用XML外部語言包實現多語言界面,并且在系統運行的同時生成語言包文件,便于擴展;對界面文字的導入/導出功能進行了封裝處理,避免了代碼的冗余,對源程序修改代價最小,后期維護方便;在語言包處理過程中運用了.NET的反射技術以提取和組裝界面提示文字信息,增加了程序的靈活性和直觀性。
1 XML語言文件包格式
 實現多語言界面的一個重要步驟是設計外部語言包文件??蓴U展標記語言XML具有自解釋性和靈活的結構,可實現跨平臺交互,表述任意復雜程度的數據格式和無限量的自定義格式描述符,適合作為語言包的格式。
 用戶從軟件獲取的信息都顯示在用戶界面上,用戶界面由控件對象組成,而語言信息都是由文本控件對象的屬性值來體現的。建立XML語言包文件的基本思想,就是從用戶界面中獲取所有文本控件的標識和屬性值,按照結構類別存放到XML文檔中,這樣語言包文件即可通過控件的標識映射到用戶界面。應用程序的用戶界面通常包含的文本組件如圖1所示。

 用戶界面要處理的文本控件對象主要有以下部分:
?。?)Framework:菜單欄、工具欄、狀態欄等顯示文本信息的窗體框架,其文字信息包括各欄框架Bar的Text屬性、各欄菜單項baritem的Caption屬性(顯示文字)和Hint屬性(提示文字)?;诿阑缑婧头奖闶褂玫囊螅疚闹惺褂肂arManager控件來組裝Framework,在程序中分別遍歷其Bar和Items成員即可獲取框架和菜單項的信息。
?。?)TextControl:只具有(需要)顯示文字功能的控件,如標簽控件Label等。
?。?)PromptMsg:人機交互過程中顯示的提示信息。提示信息是解決方案中所有窗體共用的,因此,將其以公共靜態變量的形式存放在一個全局靜態類中。軟件運行時,利用C#的反射技術動態獲取該類的信息,或創建類的實例并調用和訪問這些實例。
 (4)UIText:在程序中需要處理而在界面上沒有顯示(或需要經過處理后顯示)的文字信息,如表格控件GridView的表頭等。
 為確保切換語言時能夠置換所有的界面文字信息,所有的文本控件對象都必須在XML語言包中有唯一的節點與之對應。本文中設定的XML語言包文件的結構如圖2所示。

根據文本控件在軟件界面中的關系,采用樹形結構來描述語言環境,以解決方案為根節點;所有的窗體都是解決方案的子節點,其子節點是窗體中各種結構類別的文本控件;解決方案根節點的子節點還包括全局提示信息,其子節點是所有的全局提示信息。
2 多語言界面的實現
2.1 軟件模塊與數據結構設計

 程序設計中采用獨立界面獨立模塊的模式,每個模塊均由一個獨立界面提供相應功能。.NET中定義Form類為所有窗體類的基類,項目中窗體間的關系如圖3所示。

 

 

 程序運行前選擇需要的語言包文件。運行后每個窗體被打開時,首先在構造函數中完成必要的數據結構填充,繼而在加載基類時實現語言信息的導出與載入,最后加載窗體。只要每個派生的Form類填充了相應的數據結構,即可以利用基類中的語言信息導出與載入功能,實現整個軟件所有窗體的語言替換。
2.2 界面文字信息的導出
 對于大型的工程項目,窗體數目多、組件復雜,手動建立XML語言包文檔不僅耗費大量時間,而且容易出錯。因此,本文在程序運行時生成XML文檔,每打開一個窗體都將其界面文字信息導入到XML語言包文檔。反射是.NET中的重要機制,它使得.NET中的類型(包括類、結構、委托和枚舉等)可以通過名稱動態檢索成員信息,并且允許在運行的程序中操作這些信息。本文運用反射技術動態地提取界面提示文字信息,具體的實現方法如下:
?。?)程序啟動時,創建XML文檔,寫入解決方案根節點。
?。?)打開一個窗體,在窗體的構造函數中完成該窗體的數據結構填充,加載時完成文字信息的導入。
?。?)若當前處理的窗體未被處理過,在XML文檔根節點下創建一個新的Form子節點,寫入窗體的名稱和標題欄文本等屬性,并標記處理過的窗體以防重復處理。對于窗體的Framework控件,在Form節點下創建bars節點和baritem節點,將所有的框架和菜單項的名稱和文本以item節點的形式分別添加到這兩個節點下;對于TextControl類控件,在Form節點下創建textcontrol節點,將所有該類控件的名稱和文本以item節點的形式添加到textcontrol節點下;對于UIText類組件,在Form節點下創建uitext節點,將該類組件的名稱和文本以item節點的形式添加到uitext節點下。
 (4)全部窗體處理結束(即退出程序時),在根節點下創建globalpromptmsg子節點,利用反射機制獲取全局靜態類Globalpromptmsg聲明的所有字段信息,將所有字段的名稱和文本寫到globalpromptmsg節點下item節點的name屬性和text屬性。全部字段處理結束后向XML文檔中寫入結束標志,完成界面文字信息的導出。其程序如下:
Type type = Globalpromptmsg.GetType();
FieldInfo[] currfiledinfos=type.GetFields(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
foreach (FieldInfo filedinfo in currfiledinfos)
{
 XmlWriter.WriteStartElement("item");
 XmlWriter.WriteAttributeString("name",filedinfo.Name);
 XmlWriter.WriteAttributeString("text",filedinfo.GetValue(filedinfo).ToString());
    XmlWriter.WriteEndElement();
     }
字段是在類中定義的變量,字段信息從元數據中獲取,FieldInfo類發現字段屬性并提供對字段元數據的訪問權。FieldInfo類沒有公共構造函數,故先用GetType方法獲取全局靜態類的Type對象(關于類型聲明的信息),然后調用Type對象的GetFields方法來獲取FieldInfo對象。FieldInfo對象通過GetValue方法返回給定字段的值。
系統支持的語言擴展時,只要將生成的語言包文檔中各文本控件節點的text屬性值翻譯成目標語言,即可得到需要的語言包文件。
2.3 界面文字信息的導入
在創建了語言包文件的基礎上,如何將程序和語言包文件結合起來,成為實現多語言界面的最后一個難題。本文在程序啟動時讀取選擇的XML語言包文件,將數據記錄到內存,窗體加載時進行數據填充,替換默認的界面文字。導入的過程中也使用了反射技術,其方法如下:
?。?)程序啟動時,打開要讀取的外部XML語言包文件。
?。?)按深度遍歷方法讀取XML文件。提取所有Form節點的名稱和標題欄文本屬性值,存入內存。每個Form創建一個窗體信息對象,存放Framework、TextControl以及UIText組件的文本信息,多個窗體信息對象之間以標題欄文本為區分標識。
?。?)所有窗體處理完畢后,替換全局提示信息文本:創建Globalpromptmsg類的一個實例,獲取它的類型信息,搜索該實例中與globalpromptmsg節點下提示信息節點同名的公開字段,利用反射機制將對應字段的值替換為對應節點的text屬性值。其程序如下:
Globalpromptmsg gmp=new Globalpromptmsg ();
Type type=gmp.GetType();
FieldInfo currfieldinfo = null;
foreach(XmlNode msgnode in formnode.ChildNodes)
{
 currfieldinfo=type.GetField(msgnode.Attributes["name"].Value);
 if (currfieldinfo != null)
    currfieldinfo.SetValue(currfieldinfo, msgnode.
Attributes["text"].Value);
}
 通過調用Type對象的GetField方法來搜索具有指定名稱的公開字段,并將其存入FieldInfo對象;然后調用FieldInfo對象的SetValue方法對給定字段值進行修改。
?。?)窗體加載時,從第2步獲取的數據中查找對應控件的各項文本屬性信息,替換掉組件默認的文本,從而實現界面語言的導入。
2.4 實際界面顯示
 以登錄界面為例,提取出一個簡單的語言為英文的xml文件如圖6所示。

 圖中,Solution節點代表解決方案,Native-lan節點代表顯示的語言種類,Form節點代表窗體,Form的子節點textcontrol和uitext分別對應窗體需顯示文本的控件和隱含在程序中的文字信息。提示信息存放在globalpromptmsg節點下。每個item節點都指明了組件的名稱和顯示文本,擴展支持語言時只需修改節點的Text值。
 本設計中默認語言是中文簡體,默認的登錄界面如圖7所示。選擇英文語言包文件時,程序運行得到的登錄界面如圖8所示。

 本文采用擴展外部XML語言包的方法,在對源程序修改代價最小的情況下實現了對軟件的多語言支持,語言增加或界面變化時無需重新編譯源程序,動態增加或修改語言包文件即可,實現簡單、擴展性強、維護成本小,是一個設計良好的多語言資源實現模型。在界面語言導入導出時使用了.NET反射技術、動態調用需要的方法和屬性信息,其程序靈活直觀。本文方法在飛行員飛行品質評估系統中得到了成功應用。
參考文獻
[1] 陳傳波,洪慧芳.基于XML的本地化技術研究[J].計算機工程與科學,2006,28(10):95-97.
[2] 司國東. .NET環境下的一種多語言界面解決方案[J].農業網絡信息,2007(2):35-36.
[3] 唐勇,李秀龍.多語言用戶界面的研究與實現[J].計算機應用研究,2002(4):112-113.
[4] 王鋒,魏曉麗,江開耀,等.基于XML的C#多語言界面實現[J].計算機工程與設計,2008,29(15):4073-4078.

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          免费中文日韩| 久久久久9999亚洲精品| 欧美在线资源| 国产一区观看| 一区免费观看视频| 日韩一区二区免费高清| 亚洲香蕉伊综合在人在线视看| 亚洲一区二区三区午夜| 一本色道久久综合亚洲精品小说| 欧美午夜精品久久久久久久| 久久国产精品久久久| 亚洲一区激情| 欧美一区二区在线观看| 欧美亚洲午夜视频在线观看| 亚洲精选中文字幕| 亚洲电影中文字幕| 午夜精品久久久久久久久久久久| 国产精品欧美久久久久无广告| 一区二区亚洲精品| 欧美一区二区三区四区在线| 久久精品水蜜桃av综合天堂| 一本久久精品一区二区| 亚洲国产精品123| 韩日欧美一区| 亚洲精品欧美专区| 久久久久久久一区| 亚洲第一视频网站| 夜夜爽夜夜爽精品视频| 欧美v亚洲v综合ⅴ国产v| 久久免费视频网| 黄色精品网站| 黑丝一区二区三区| 亚洲网站在线看| 欧美精品免费播放| 国产欧美日韩| 亚洲国产精品va在线看黑人| 午夜日韩在线观看| 免费亚洲视频| 欧美国产精品人人做人人爱| 美女尤物久久精品| 亚洲高清久久久| 好男人免费精品视频| 亚洲伦理久久| 日韩午夜激情av| 狠狠色丁香久久综合频道| 欧美一区二区免费观在线| 韩国精品主播一区二区在线观看| 欧美午夜欧美| 亚洲性人人天天夜夜摸| 免费成人高清在线视频| 亚洲视频每日更新| 亚洲国产黄色| 在线亚洲精品福利网址导航| 欧美成人一品| 久久er99精品| 在线播放中文一区| 欧美国产三区| 国产一级一区二区| 欧美在线播放高清精品| 快播亚洲色图| 亚洲人成人77777线观看| 久久精品欧洲| 欧美人在线视频| 亚洲免费中文| 国产一二三精品| 精品成人国产在线观看男人呻吟| 中日韩男男gay无套| 欧美日韩国产a| 一本色道久久综合狠狠躁篇怎么玩| 免费一级欧美在线大片| 国产精品久久久久久久一区探花| 久久另类ts人妖一区二区| 国产日韩一区在线| 欧美日韩在线另类| 欧美日韩精品免费在线观看视频| 欧美一级欧美一级在线播放| 午夜在线一区二区| 午夜精品区一区二区三| 久久国产精品久久w女人spa| 99在线|亚洲一区二区| 久久久精品tv| 亚洲精品一区在线观看香蕉| 欧美激情视频一区二区三区不卡| 美女啪啪无遮挡免费久久网站| 136国产福利精品导航网址| 欧美日韩久久不卡| 欧美午夜寂寞影院| 亚洲国产成人精品女人久久久| 久久国产精品99精品国产| 激情一区二区| 欧美大片一区二区三区| 亚洲精品网址在线观看| 国产乱码精品| 国产精品一区二区a| 性一交一乱一区二区洋洋av| 久久免费国产精品| 欧美啪啪一区| 9久re热视频在线精品| 国产目拍亚洲精品99久久精品| 欧美精品一区在线| 久久久午夜视频| 女生裸体视频一区二区三区| 中文日韩在线| 91久久国产综合久久蜜月精品| 亚洲九九精品| 亚洲乱码视频| 国产欧美日本在线| 蜜桃av噜噜一区二区三区| 在线色欧美三级视频| 久久人人爽爽爽人久久久| 娇妻被交换粗又大又硬视频欧美| 久久精品道一区二区三区| 日韩视频免费在线| 欧美一区三区三区高中清蜜桃| 欧美精品 国产精品| 亚洲国产精品一区二区久| 国产日韩欧美制服另类| 亚洲欧美久久久| 亚洲精品一区二区在线| 久久久噜噜噜| 久久久久久尹人网香蕉| 国产欧美日韩视频| 国产精品久久久久永久免费观看| 亚洲视频在线观看网站| 亚洲一区网站| 一区二区欧美日韩视频| 激情成人av在线| 亚洲一区二区三区精品在线观看| 亚洲人成在线播放| 亚洲国产精品v| 国产精自产拍久久久久久| 久久躁日日躁aaaaxxxx| 国产一区二区三区在线观看免费| 亚洲一区精品视频| 欧美日韩国产在线播放网站| 亚洲国产精品久久人人爱蜜臀| 午夜亚洲伦理| 亚洲欧美三级伦理| 欧美劲爆第一页| 久久久国产亚洲精品| 一个色综合导航| 女女同性女同一区二区三区91| 国产欧美视频在线观看| 欧美激情小视频| 欧美三级视频在线| 免费观看不卡av| 午夜在线成人av| 欧美日韩国产精品一区| 欧美日韩视频一区二区三区| 99精品国产高清一区二区| 国产一区二区三区电影在线观看| 久久久久久亚洲综合影院红桃| 欧美华人在线视频| 久久亚洲国产精品日日av夜夜| 性欧美xxxx大乳国产app| 久久狠狠久久综合桃花| 一区二区三区精品视频| 欧美国产日韩一区二区在线观看| 欧美日韩大陆在线| 欧美精品一区二区三区久久久竹菊| 中国成人在线视频| 国产精品sm| 欧美午夜精品久久久久久人妖| 亚洲欧美一区在线| 欧美高清一区| 欧美黄色一区二区| 欧美日韩视频在线一区二区观看视频| 久久综合伊人77777蜜臀| 欧美国产日本在线| 国产美女精品在线| 亚洲欧美日韩系列| 免费h精品视频在线播放| 欧美日韩日本网| 欧美国产精品v| 亚洲三级免费| 国产精品久久国产愉拍| 一区二区三区色| 亚洲女性喷水在线观看一区| 亚洲国产小视频| 久久超碰97中文字幕| 亚洲国产婷婷香蕉久久久久久99| 欧美在线国产| 国产精品视频免费观看www| 欧美日韩一区二区视频在线| 亚洲国产一区二区三区青草影视| 亚洲一区自拍| 欧美一区二区在线免费观看| 欧美一区二区视频97| 久久在线精品| 国产欧美丝祙| 久久久久www| 欧美日韩一区二区三区在线| 久久久久网址| 麻豆九一精品爱看视频在线观看免费| 国产欧美日韩视频一区二区三区| 免费在线观看日韩欧美| 免费国产一区二区| 欧美亚洲视频在线看网址| 亚洲一级在线观看| 亚洲精品黄色| 欧美在线3区| 两个人的视频www国产精品| 久久综合网hezyo| 国产精品丝袜白浆摸在线| 国产精品高潮呻吟久久av无限| 影音先锋日韩精品| 欧美另类变人与禽xxxxx| 在线观看成人网| 在线不卡中文字幕播放| 国产精品美女主播在线观看纯欲| 亚洲第一二三四五区| 另类酷文…触手系列精品集v1小说| 99re热这里只有精品视频| 亚洲影院污污.| 国产日韩亚洲| 欧美日韩一区二区三区免费看| 国模私拍一区二区三区| 欧美日韩综合久久| 亚洲黄色成人网| 国产精品推荐精品| 国产日韩av一区二区| 久久国产精品高清| 欧美丰满少妇xxxbbb| 亚洲视频免费看| 一本色道久久综合亚洲精品按摩| 国产午夜精品麻豆| 亚洲一二三级电影| 国产日韩精品在线播放| 久久婷婷影院| 暖暖成人免费视频| 国产伦精品一区二区三区视频黑人| 亚洲成人自拍视频| 在线日本高清免费不卡| 国产精品美女久久久久av超清| 久久精品日韩一区二区三区| 在线日本成人| 另类av一区二区| 欧美夫妇交换俱乐部在线观看| 在线播放精品| 国产精品资源| 99国产精品久久久| 国产精品一区=区| 欧美日韩一区免费| 久久一区二区三区国产精品| 欧美日韩一区二区三区四区在线观看| 亚洲视频一区在线| av不卡免费看| 久久漫画官网| 国产精品久久久久久久久久久久久| 男人的天堂亚洲在线| 亚洲一区二区三区777| 亚洲免费在线精品一区| 亚洲黄色尤物视频| 亚洲丶国产丶欧美一区二区三区| 国产精品成人免费视频| 久久精选视频| 欧美日本在线播放| 欧美精品久久99久久在免费线| 亚洲精品综合精品自拍| 欧美日韩一区二区免费视频| 99re热这里只有精品免费视频| 欧美视频久久| 久久aⅴ乱码一区二区三区| 国产精品国产三级国产aⅴ入口| 欧美视频日韩| 国产精品专区第二| 国产一区二区三区无遮挡| 久久综合亚洲社区| 亚洲色无码播放| 亚洲成人在线观看视频| 激情久久影院| 欧美精品一区在线| 亚洲午夜黄色| 国产日韩欧美a| 久久成人免费视频| 在线亚洲激情| 在线不卡亚洲| 久久一区视频| 亚洲第一福利视频| 久久亚洲春色中文字幕| 国产精品国产三级国产专播精品人| 久久久久**毛片大全| 亚洲精品在线免费| 欧美色另类天堂2015| 一区二区三区我不卡| 国产欧美一二三区| 国产午夜久久久久| 亚洲高清不卡| 国产精品手机视频| 欧美日韩四区| 久久亚洲欧美国产精品乐播| 亚洲精品综合精品自拍| 久久影院午夜片一区| 亚洲精品国久久99热| 在线看片日韩| 亚欧成人在线| 欧美中文字幕第一页| 在线电影院国产精品| 欧美激情亚洲精品| 国产精品一区在线播放| 久久偷窥视频| 免费观看亚洲视频大全| 欧美色欧美亚洲高清在线视频| 久久精品久久99精品久久| 一区二区三区免费网站| 国产精品日日摸夜夜摸av| 国产精品久久久久99| 国产日韩精品一区二区三区在线| 日韩午夜电影在线观看| 免费在线欧美黄色| 国产欧美日韩视频在线观看| 一区精品在线播放| 国产九九精品视频| 欧美午夜精品久久久久久浪潮| 在线中文字幕不卡| 久久久国产一区二区| 亚洲免费婷婷| 欧美日产国产成人免费图片| 在线一区二区三区四区五区| 一区精品在线| 欧美午夜不卡影院在线观看完整版免费| 亚洲欧美日韩一区二区三区在线观看| 香蕉成人啪国产精品视频综合网| av不卡在线| 欧美国产日韩a欧美在线观看| 亚洲在线不卡| 一本久久知道综合久久| 亚洲二区在线视频|