新聞中心
Silverlight開(kāi)發(fā)工具在進(jìn)行資源的引用的時(shí)候,可能會(huì)出現(xiàn)一些問(wèn)題困擾著開(kāi)發(fā)人員難以將程序進(jìn)程向前推進(jìn)。尤其是剛剛接觸這款工具不久的新手來(lái)說(shuō)尤其頭疼。我們?cè)谶@里就為大家介紹了一下Silverlight資源文件引用的一些相關(guān)問(wèn)題及解決辦法。#t#

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括威信網(wǎng)站建設(shè)、威信網(wǎng)站制作、威信網(wǎng)頁(yè)制作以及威信網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,威信網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到威信省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Silverlight資源文件引用問(wèn)題描述
最近項(xiàng)目中遇到一個(gè)和資源文件相關(guān)的很奇怪的問(wèn)題。有一個(gè)Silverlight應(yīng)用會(huì)根據(jù)當(dāng)前Url中的某個(gè)特定參數(shù)來(lái)決定使用什么文化的資源文件(關(guān)于資源的文件的使用見(jiàn)Silverlight 2 RTM 多國(guó)語(yǔ)言支持)。在其他機(jī)器上運(yùn)行沒(méi)有問(wèn)題,傳入zh-Hans和en-US界面都能正確顯示相應(yīng)語(yǔ)言的文字。但是在我的系統(tǒng)上卻不管傳入什么都是顯示的英文文字。
Silverlight資源文件引用問(wèn)題分析
打開(kāi)工程看了一下,在資源文件夾下只定義了兩個(gè)資源,一個(gè)是主資源XXX.resx,一個(gè)是英文中立資源XXX.en.resx。編譯之后,主資源會(huì)被打包到主程序集中,而其他資源則被編譯成獨(dú)立的程序集,稱(chēng)為衛(wèi)星程序集。Silverlight代碼中在提取Url參數(shù)的時(shí)候也加上了一個(gè)檢測(cè)邏輯,就是如果傳入的語(yǔ)言不是英文,那么就使用zh-Hans。也就是說(shuō)在其他人的機(jī)器上,如果你輸入了fr,那么也是顯示中文。分析加調(diào)試弄了好一會(huì)之后,我判定應(yīng)該不是程序代碼的bug。因?yàn)樵谀承┤说臋C(jī)器上是正常的,而在我的機(jī)器還有另外一個(gè)同事的機(jī)器上卻不正常,而且問(wèn)題是可重現(xiàn)的。這說(shuō)明了問(wèn)題和本地環(huán)境有關(guān)。
清緩存,清Silverlight獨(dú)立存儲(chǔ)之后發(fā)現(xiàn)問(wèn)題依然存在。難道是操作系統(tǒng)的問(wèn)題?!我用的是win7,同事用的是win2008,都是高版本的windows,而其他人用的不是xp就是2003。為了證實(shí)我的想法,我又找了一臺(tái)2008的機(jī)器,測(cè)試結(jié)果和我機(jī)器上的一樣??磥?lái)很有可能問(wèn)題就在這??墒牵瑸槭裁茨??
為了查找問(wèn)題的原因,我重新查閱了一下Silverlight使用資源文件的相關(guān)材料(和DotNet其實(shí)差不多)。
Silverlight資源文件引用的查找方式
Silverlight采用中心輻射型結(jié)構(gòu)來(lái)打包和部署資源文件程序集。圍繞在中心的是主程序集里面的資源,這個(gè)資源也被稱(chēng)為中立或者默認(rèn)資源。如果主程序集沒(méi)有顯式設(shè)定語(yǔ)言,那么一個(gè)資源要是查找失敗,最終會(huì)使用主程序集中的資源。每個(gè)輻射點(diǎn)指向的是每一種語(yǔ)言對(duì)應(yīng)的衛(wèi)星程序集。
Silverlight在查找資源文件的時(shí)候采用了如下的方式:
最***是應(yīng)用程序的默認(rèn)程序集。第二級(jí)是語(yǔ)言相關(guān)程序集,它代表的是地域無(wú)關(guān)的語(yǔ)言文化,如英文,簡(jiǎn)體中文,繁體中文(zh-Hant)等;第三級(jí)是和地域相關(guān)的文化程序集,如美國(guó)英語(yǔ),英國(guó)英語(yǔ),大陸簡(jiǎn)體中文,新加坡簡(jiǎn)體中文。Silverlight在加載本地資源的時(shí)候首先會(huì)根據(jù)CultureInfo.CurrentUICulture屬性來(lái)判斷應(yīng)該加載哪一種文化對(duì)應(yīng)的資源。在查找的時(shí)候是按照上面的層次結(jié)構(gòu)從下到上進(jìn)行查找的。具體說(shuō)來(lái),當(dāng)ResourceManager在查找一個(gè)資源時(shí)會(huì)經(jīng)過(guò)以下幾個(gè)步驟:
1. 查找具體語(yǔ)言相應(yīng)的程序集是否存在。如設(shè)置了zh-CN,那么就查找XXX.zh-CN.resx資源文件是否存在(存在于衛(wèi)星程序集中),如果程序集不存在或者在該程序集中找不到此資源的定義,那么查找失敗。如果操作系統(tǒng)支持回溯(Fallback)邏輯,那么跳到第二步;否則跳到第三步。
2. 操作系統(tǒng)提供一份推薦的語(yǔ)言回溯清單,上面包含了具體語(yǔ)言文化字符串(如en-US)和相應(yīng)的中立語(yǔ)言字符串(如en)。Resource Manager會(huì)根據(jù)這份清單去查找相應(yīng)的衛(wèi)星程序集和程序集內(nèi)指定資源是否存在。如果查找失敗,則跳到下一步。
3. 如果上面兩步都失敗,那么查找此具體文化的上一級(jí)文化的衛(wèi)星程序集,也就是地域無(wú)關(guān)的文化,例如en-US查找失敗,則查找en是否存在。
4. 如果上面3步都失敗的話,那么Silverlight會(huì)查看主程序集的NeutralResourcesLanguageAttribute屬性。NeutralResourcesLanguageAttribute是用在程序集上的屬性,它是用來(lái)告知ResourceManager,某個(gè)程序集使用的語(yǔ)言是什么。ResourceManager會(huì)查看此屬性的值,看是否滿足條件。如果主程序集沒(méi)有指定此屬性,那么將會(huì)使用主程序集中的資源作為默認(rèn)資源。
5. 如果第4步也查找失敗,那么ResourceManager將使用文化無(wú)關(guān)(Invarient Culture)的資源。
Silverlight資源文件引用問(wèn)題所在
在網(wǎng)上查到MSDN的文章說(shuō),自打Vista開(kāi)始,操作系統(tǒng)開(kāi)始支持這種“Fallback”的邏輯了。通過(guò)系統(tǒng)API GetThreadPreferredUILanguages可以獲取操作系統(tǒng)核心推薦使用的語(yǔ)言清單。
由于工程里面并沒(méi)有指定zh-Hans的資源文件(于是也就沒(méi)有zh-Hans的衛(wèi)星程序集),也沒(méi)有設(shè)置主程序集使用的語(yǔ)言是什么(通過(guò)NeutralResourcesLanguageAttribute屬性指定)因此在***步的時(shí)候查找失??;這個(gè)時(shí)候,在我win7的機(jī)器上,由于操作系統(tǒng)支持fallback邏輯,因此Silverlight會(huì)使用操作系統(tǒng)提供的語(yǔ)言清單去查找,由于我的系統(tǒng)是中文系統(tǒng),因此清單上***項(xiàng)肯定是zh-CN,接下來(lái)的猜測(cè)應(yīng)該是en-US和en(老美搞的操作系統(tǒng)嘛,當(dāng)然要把自家語(yǔ)言排前一點(diǎn)了)。查找zh-CN肯定又失敗,但是查找en卻能夠找到,因此就出現(xiàn)了不管你參數(shù)中輸入什么語(yǔ)言文化字符串,都會(huì)顯示英文。
而在其他低版本的windows上,因?yàn)椴僮飨到y(tǒng)不支持這份清單,那么Silverlight始終沒(méi)有辦法找到zh-Hans相關(guān)的衛(wèi)星程序集,而主程序集又沒(méi)有顯式的設(shè)置語(yǔ)言,因此ResourceManager就會(huì)使用主程序集里面的資源文件,也就是中文。
這就是為什么在低版本windows上,亂輸入語(yǔ)言,顯示的默認(rèn)是中文,而在Vista等高版本windows上,默認(rèn)顯示的是英文的緣故。
再插一句,如果在主程序集中顯式設(shè)置了NeutralResourcesLanguageAttribute為zh-Hans,然后在低版本的windows上訪問(wèn)此應(yīng)用程序的時(shí)候輸入例如fr等不支持的語(yǔ)言,那么Silverlight將會(huì)使用語(yǔ)言無(wú)關(guān)的資源(語(yǔ)言無(wú)關(guān)的資源具體被定義在哪不是很確定,可能是dotnet類(lèi)庫(kù),也可能是本地操作系統(tǒng)),如果該語(yǔ)言無(wú)關(guān)的資源沒(méi)有定義,則ResourceManager得到的是空字符串。因?yàn)榇藭r(shí)ResourceManager就不會(huì)把主程序集里的資源當(dāng)作最終Fallback的資源了。
解決Silverlight資源文件引用問(wèn)題的辦法
經(jīng)過(guò)上面的分析,解決問(wèn)題的辦法已經(jīng)很清楚了,要么再添加一個(gè)zh-Hans的資源文件,要么顯式的使用NeutralResourcesLanguageAttribute通知ResourceManager,主程序集使用的資源語(yǔ)言是zh-Hans。
網(wǎng)站欄目:Silverlight資源文件引用相關(guān)難題解析
當(dāng)前路徑:http://www.5511xx.com/article/dpcpipg.html


咨詢(xún)
建站咨詢(xún)
