當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]基于XML及反射技術(shù)的多語言界面研究與實(shí)現(xiàn)

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

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

根據(jù)文本控件在軟件界面中的關(guān)系,采用樹形結(jié)構(gòu)來描述語言環(huán)境,以解決方案為根節(jié)點(diǎn);所有的窗體都是解決方案的子節(jié)點(diǎn),其子節(jié)點(diǎn)是窗體中各種結(jié)構(gòu)類別的文本控件;解決方案根節(jié)點(diǎn)的子節(jié)點(diǎn)還包括全局提示信息,其子節(jié)點(diǎn)是所有的全局提示信息。
2 多語言界面的實(shí)現(xiàn)
2.1 軟件模塊與數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

程序設(shè)計(jì)中采用獨(dú)立界面獨(dú)立模塊的模式,每個(gè)模塊均由一個(gè)獨(dú)立界面提供相應(yīng)功能。.NET中定義Form類為所有窗體類的基類,項(xiàng)目中窗體間的關(guān)系如圖3所示。

 

 

 程序運(yùn)行前選擇需要的語言包文件。運(yùn)行后每個(gè)窗體被打開時(shí),首先在構(gòu)造函數(shù)中完成必要的數(shù)據(jù)結(jié)構(gòu)填充,繼而在加載基類時(shí)實(shí)現(xiàn)語言信息的導(dǎo)出與載入,最后 加載窗體。只要每個(gè)派生的Form類填充了相應(yīng)的數(shù)據(jù)結(jié)構(gòu),即可以利用基類中的語言信息導(dǎo)出與載入功能,實(shí)現(xiàn)整個(gè)軟件所有窗體的語言替換。
2.2 界面文字信息的導(dǎo)出
對(duì)于大型的工程項(xiàng)目,窗體數(shù)目多、組件復(fù)雜,手動(dòng)建立XML語言包文檔不僅耗費(fèi)大量時(shí)間,而且容易出錯(cuò)。因此,本文在程序運(yùn)行時(shí)生成XML文檔,每打開 一個(gè)窗體都將其界面文字信息導(dǎo)入到XML語言包文檔。反射是.NET中的重要機(jī)制,它使得.NET中的類型(包括類、結(jié)構(gòu)、委托和枚舉等)可以通過名稱動(dòng) 態(tài)檢索成員信息,并且允許在運(yùn)行的程序中操作這些信息。本文運(yùn)用反射技術(shù)動(dòng)態(tài)地提取界面提示文字信息,具體的實(shí)現(xiàn)方法如下:
(1)程序啟動(dòng)時(shí),創(chuàng)建XML文檔,寫入解決方案根節(jié)點(diǎn)。
(2)打開一個(gè)窗體,在窗體的構(gòu)造函數(shù)中完成該窗體的數(shù)據(jù)結(jié)構(gòu)填充,加載時(shí)完成文字信息的導(dǎo)入。
(3)若當(dāng)前處理的窗體未被處理過,在XML文檔根節(jié)點(diǎn)下創(chuàng)建一個(gè)新的Form子節(jié)點(diǎn),寫入窗體的名稱和標(biāo)題欄文本等屬性,并標(biāo)記處理過的窗體以防重復(fù) 處理。對(duì)于窗體的Framework控件,在Form節(jié)點(diǎn)下創(chuàng)建bars節(jié)點(diǎn)和baritem節(jié)點(diǎn),將所有的框架和菜單項(xiàng)的名稱和文本以item節(jié)點(diǎn)的形 式分別添加到這兩個(gè)節(jié)點(diǎn)下;對(duì)于TextControl類控件,在Form節(jié)點(diǎn)下創(chuàng)建textcontrol節(jié)點(diǎn),將所有該類控件的名稱和文本以item 節(jié)點(diǎn)的形式添加到textcontrol節(jié)點(diǎn)下;對(duì)于UIText類組件,在Form節(jié)點(diǎn)下創(chuàng)建uitext節(jié)點(diǎn),將該類組件的名稱和文本以item節(jié)點(diǎn) 的形式添加到uitext節(jié)點(diǎn)下。
(4)全部窗體處理結(jié)束(即退出程序時(shí)),在根節(jié)點(diǎn)下創(chuàng)建globalpromptmsg子節(jié)點(diǎn),利用反射機(jī)制獲取全局靜態(tài)類 Globalpromptmsg聲明的所有字段信息,將所有字段的名稱和文本寫到globalpromptmsg節(jié)點(diǎn)下item節(jié)點(diǎn)的name屬性和 text屬性。全部字段處理結(jié)束后向XML文檔中寫入結(jié)束標(biāo)志,完成界面文字信息的導(dǎo)出。其程序如下:
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();
     }
字段是在類中定義的變量,字段信息從元數(shù)據(jù)中獲取,F(xiàn)ieldInfo類發(fā)現(xiàn)字段屬性并提供對(duì)字段元數(shù)據(jù)的訪問權(quán)。FieldInfo類沒有公共構(gòu)造函 數(shù),故先用GetType方法獲取全局靜態(tài)類的Type對(duì)象(關(guān)于類型聲明的信息),然后調(diào)用Type對(duì)象的GetFields方法來獲取 FieldInfo對(duì)象。FieldInfo對(duì)象通過GetValue方法返回給定字段的值。
系統(tǒng)支持的語言擴(kuò)展時(shí),只要將生成的語言包文檔中各文本控件節(jié)點(diǎn)的text屬性值翻譯成目標(biāo)語言,即可得到需要的語言包文件。
2.3 界面文字信息的導(dǎo)入
在創(chuàng)建了語言包文件的基礎(chǔ)上,如何將程序和語言包文件結(jié)合起來,成為實(shí)現(xiàn)多語言界面的最后一個(gè)難題。本文在程序啟動(dòng)時(shí)讀取選擇的XML語言包文件,將數(shù)據(jù)記錄到內(nèi)存,窗體加載時(shí)進(jìn)行數(shù)據(jù)填充,替換默認(rèn)的界面文字。導(dǎo)入的過程中也使用了反射技術(shù),其方法如下:
(1)程序啟動(dòng)時(shí),打開要讀取的外部XML語言包文件。
(2)按深度遍歷方法讀取XML文件。提取所有Form節(jié)點(diǎn)的名稱和標(biāo)題欄文本屬性值,存入內(nèi)存。每個(gè)Form創(chuàng)建一個(gè)窗體信息對(duì)象,存放Framework、TextControl以及UIText組件的文本信息,多個(gè)窗體信息對(duì)象之間以標(biāo)題欄文本為區(qū)分標(biāo)識(shí)。
(3)所有窗體處理完畢后,替換全局提示信息文本:創(chuàng)建Globalpromptmsg類的一個(gè)實(shí)例,獲取它的類型信息,搜索該實(shí)例中與 globalpromptmsg節(jié)點(diǎn)下提示信息節(jié)點(diǎn)同名的公開字段,利用反射機(jī)制將對(duì)應(yīng)字段的值替換為對(duì)應(yīng)節(jié)點(diǎn)的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);
}
通過調(diào)用Type對(duì)象的GetField方法來搜索具有指定名稱的公開字段,并將其存入FieldInfo對(duì)象;然后調(diào)用FieldInfo對(duì)象的SetValue方法對(duì)給定字段值進(jìn)行修改。
(4)窗體加載時(shí),從第2步獲取的數(shù)據(jù)中查找對(duì)應(yīng)控件的各項(xiàng)文本屬性信息,替換掉組件默認(rèn)的文本,從而實(shí)現(xiàn)界面語言的導(dǎo)入。
2.4 實(shí)際界面顯示
以登錄界面為例,提取出一個(gè)簡(jiǎn)單的語言為英文的xml文件如圖6所示。

 圖中,Solution節(jié)點(diǎn)代表解決方案,Native-lan節(jié)點(diǎn)代表顯示的語言種類,F(xiàn)orm節(jié)點(diǎn)代表窗體,F(xiàn)orm的子節(jié)點(diǎn) textcontrol和uitext分別對(duì)應(yīng)窗體需顯示文本的控件和隱含在程序中的文字信息。提示信息存放在globalpromptmsg節(jié)點(diǎn)下。每 個(gè)item節(jié)點(diǎn)都指明了組件的名稱和顯示文本,擴(kuò)展支持語言時(shí)只需修改節(jié)點(diǎn)的Text值。
本設(shè)計(jì)中默認(rèn)語言是中文簡(jiǎn)體,默認(rèn)的登錄界面如圖7所示。選擇英文語言包文件時(shí),程序運(yùn)行得到的登錄界面如圖8所示。

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉