国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

26.4.使用本地化資源模塊

2024-04-27 13:52:38
字體:
來源:轉載
供稿:網友
26.4.1. 問題
我的應用程序需要支持多種區域設置。
26.4.2. 解決辦法
在運行時根據需要使用資源模塊載入特定本地化資源。
26.4.3. 討論
根據程序需要支持的語言,將每個本地化資源包都編譯進應用程序將使得SWF文件大小倍增,而絕大多數用戶其實只需要一種區域語言,這將浪費大量的時間用在SWF文件的下載上。還好Flex 3添加一種功能可以編譯資源包,這被稱作資源模塊,它可以在運行時動態加載到應用程序中。你可以先檢測用戶的區域設置,然后載入相應的資源模塊。

要想根據本地化屬性文件構建資源模塊,首先要檢測應用程序需要什么資源,這不僅包括你定義的資源,而且也包括Flex框架所需的資源。你可以使用mxmlc編譯器分析應用程序,輸出所需資源列表。這可以修改Flex Builder 3的項目屬性對話框中的額外編譯器參數達到目的。不過命令行模式下也照樣可做到,而且更方便快捷。當調用編譯器時,沒有指定區域,一個編譯器分析結果輸出的保存文件和MXML文件名稱:
mxmlc -locale= -resource-bundle-list=resources.txt ResourceModules.mxml

當命令完成后,resources.txt的內容類似這樣:
bundles = containers controls core effects localizedContent skins styles

這個輸出內容告訴編譯器哪些資源包將被構建到資源模塊中。如果使用資源模塊編譯應用程序,必須使用命令行編譯。指定source path為本地化屬性文件,資源包列表和上面一樣。例如為26.4的ResourceModules.mxml 例子編譯:
mxmlc -locale=en_US -source-path=.,locale/{locale}
-include-resource-bundles=containers,controls,core,effects,localizedContent,skins,styles
-output en_US_resources.swf


編譯為法語模塊:
mxmlc -locale=fr_FR -source-path=.,locale/{locale}
-include-resource-bundles=containers,controls,core,effects,localizedContent,skins,styles
-output fr_FR_resources.swf


這個命令有幾項內容。起先,使用-locale參數定義區域,其二,source path參數可能已經很熟悉了,這個例子中包括當前目錄(.) 。這個例子中localizedContent屬性文件包含一個嵌入類引用,如果source path中沒有應用程序根目錄,編譯器可能就找不到類引用。注意假定你在工程源文件目錄下調用了mxmlc,接著include-resource-bundles 參數設置為之前例子生成的列表內容,這個列表有逗號分割符和未含空格的包名組成。最后,這個例子告訴編譯器輸出文件名稱為en_US_resources.swf。你可以命名為其他的。但最好是根據區域標識取名稱,這樣你就可以根據文件名編程實現載入合適的資源模塊了。

當你使用mxmlc編譯資源模塊后,嵌入資源如圖片的引用路徑將是相對于本地化屬性文件的位置。也就是說,如果應用程序使用編譯的資源包資源路徑是相對于工程源文件目錄的。

程序代碼中,使用資源管理器的loadResourceModule方法載入資源模塊。給此方法傳遞一個標識你要使用的資源模塊URL,這個方法和其他ActionScript載入方法機理類似,比如SWFLoader或傳統模塊。一個需要SWF文件的請求發送到服務器,然后SWF被瀏覽器下載。

如果所需資源模塊來自其他域這需要cross-domain策略文件。你必須等資源模塊下載完成后才可使用,當子模塊可以使用時,ResourceEvent事件會被觸發。你可以監聽這些事件如ResourceEvent.COMPLETE。

loadResourceModule方法返回一個實現IEventDispatcher接口的對象引用。下面摘錄自ResourceModules.mxml例子代碼演示如何載入和使用資源模塊:
+展開
-ActionScript
import mx.events.ResourceEvent;
import mx.resources.ResourceManager;
private var selectedLocale:String;
private function setAppLocale(locale:String):void
{
this.selectedLocale = locale;
if (resourceManager.getLocales().indexOf(locale) == -1)
{
var dispatcher:IEventDispatcher = resourceManager.loadResourceModule(locale + "_resources.swf");
dispatcher.addEventListener(ResourceEvent.COMPLETE, onResourceLoaded);
}
else
{
onResourceLoaded(null);
}
}
private function onResourceLoaded(e:ResourceEvent):void
{
resourceManager.localeChain = [this.selectedLocale];
views.selectedIndex = 1;
contentBackground.setStyle("borderSkin",
resourceManager.getClass('localizedContent''borderSkin'));
contentBackground.invalidateDisplayList();
contentBackground.validateNow();
}

在這個例子中,用戶可在美國英語和法語中做出選擇。當用戶選擇一個語言后,setAppLocale方法被調用,載入所需資源模塊。這個方法首先通過資源管理器的getLocales方法輸出結果檢測所需資源是否已經被載入。這樣做很有好處,如果資源沒有被載入過,再調用loadResourceModule方法載入資源模塊,并且監聽complete事件以便可以知道資源模塊是否已經準備好。

在complete事件的響應中,應用程序設置localeChain屬性為最近使用的資源模塊。接著調用了contentBackgroud對象的三個方法。使用資源模塊更新樣式。

loadResourceModule方法還可接收一些可選的參數。如果程序需要載入多個資源模塊,將會載入所以模塊,但最后個update參數需設置為false。這樣就不會多次重復調用資源管理器的update而節省開銷。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福贡县| 嵩明县| 江北区| 扎囊县| 军事| 五莲县| 赣榆县| 迁安市| 屯留县| 互助| 阜宁县| 梁山县| 永城市| 襄樊市| 开封县| 阳谷县| 莱州市| 青冈县| 红原县| 鄂尔多斯市| 司法| 济阳县| 阳山县| 融水| 岑巩县| 杭锦旗| 琼中| 苍溪县| 江门市| 沂源县| 拜城县| 九龙坡区| 镇江市| 龙州县| 曲阳县| 盐城市| 冀州市| 西藏| 墨玉县| 绿春县| 娄底市|