slobber | 06 十月, 2006 10:03
é¦–å…ˆè§£ä¸‹é¢˜ç›®ï¼Œä¸€èˆ¬éƒ½è¯´æŠ›ç –å¼•çŽ‰ï¼Œä½†æ˜¯æˆ‘æ‰”å‡ºåŽ»è¿™å—ç –ï¼Œä¸çŸ¥é“能ä¸èƒ½å¼•æ¥çŽ‰ï¼Œä¸è¿‡å°±ç®—引䏿¥çŽ‰ï¼Œå¤§å®¶è·Ÿè´´ç»™ç‚¹å»ºè®®ï¼Œå°„è¿‡æ¥å‡ 个ç®å¤´ï¼Œæˆ‘也会很满足了。å¦å¤–一个è¦å£°æ˜Žçš„,这个è¯å¹¶ä¸æ˜¯æˆ‘创的,虽然网上还æœä¸åˆ°ï¼Œä¸è¿‡ç¡®å®žæ˜¯æŸç½‘å‹çš„创æ„,我借用下。这篇东西算是我的第一篇æˆç¯‡å¹…çš„æ–‡ç« äº†ï¼Œä¸èƒ½è¯´æ˜¯æ•™ç¨‹ï¼Œåªæ˜¯æŠŠæˆ‘é‡åˆ°çš„问题åŠè§£å†³çš„æ–¹æ³•ï¼Œå’Œå¤§å®¶åˆ†äº«ä¸€ä¸‹ã€‚è¿™ç³»åˆ—æ–‡ç« å°†ä¼šç»§ç»å‡ºä¸‹åŽ»ï¼Œä¼šæ˜¯ä¸åŒä¸»é¢˜ï¼Œä¸è¿‡éƒ½è¿˜æ˜¯æ¯”较基础的内容,给åˆå¦Flex的朋å‹å¼€æ‹“æ€è·¯ã€‚
在本文ä¸ï¼Œå°†è¦åŽ»æŽ¢è®¨å¦‚ä½•åœ¨Flexä¸åˆ©ç”¨XML构建多è¯è¨€è®¾ç½®ã€‚
在ActionScript 2ä¸ï¼ŒFlash使用了mx.lang.Localeç±»æ¥è¿›è¡Œå¤šè¯è¨€æ–‡æœ¬æŽ§åˆ¶ï¼Œå½“然,通过类似
myLabel.text = Locale.loadString("IDS_TITLE");
è¿™æ ·çš„ActionScriptè¯å¥æ¥è޷得当å‰è¯è¨€çš„相关å—符串,Locale所需è¦çš„è¯è¨€æ–‡æœ¬æ˜¯ä»Žä¸€ä¸ªXML文件ä¸èŽ·å¾—çš„ï¼Œå…·ä½“çš„æ–¹æ³•å¤§å®¶å¯ä»¥åŽ»å‚考livedoc的相关内容,ä¸è¿‡å¦‚æžœä¸€ä¸ªé¡¹ç›®ä¸æœ‰æˆç™¾ä¸Šåƒä¸ªLabel需è¦è¿›è¡Œæœ¬åœ°åŒ–工作,通过ActionScript一个个的写,这也是一个大工程。
值得庆幸的,在ActionScript 3䏿ˆ‘们ä¸å†éœ€è¦mx.lang.Localeï¼Œå› ä¸ºAdobeå·²ç»æŠŠå®ƒå–æ¶ˆäº†ï¼Œé‡‡ç”¨ResourceBundle类,åƒJAVA借鉴的。ä¸å¹¸çš„æ˜¯ï¼ŒFlexæœ¬èº«å¹¶ä¸æ”¯æŒåЍæ€åŠ è½½å¹¶æ˜¾ç¤ºè¯è¨€æ–‡ä»¶ï¼Œå¸®åŠ©åŽŸæ–‡ä¸å†™é““The localization feature currently supports static inclusion of localized resources and not dynamic retrieval of resources at run time.”。关于如何使用ResourceBundle类以åŠå¦‚何利用.properties文件编译多è¯è¨€æ–‡ä»¶ï¼Œè¯·å‚é˜…å¸®åŠ©å’Œè¿™ç¯‡æ–‡ç« ï¼ˆä»–ä¹Ÿå°†è¦å†™ä¸€ç¯‡å¦‚何从XMLåŠ è½½å¹¶æ˜¾ç¤ºè¯è¨€æ–‡æœ¬ï¼Œåº”该会比我的这篇更有价值,我本æ¥ä¹Ÿæ‰“算看看他的,ç‰äº†å¿«ä¸€ä¸ªæœˆäº†ï¼Œè¿˜ä¸å‡ºæ¥ï¼Œå¸Œæœ›ä¸æ˜¯å¤ªç›‘æ–‡å¦ï¼‰ã€‚
为了克æœåˆšæ‰æåˆ°ActionScript 2ä¸çš„é‚£æ ·çš„é—®é¢˜ï¼Œæœ€å¥½çš„è§£å†³æ–¹æ³•æ˜¯ä»€ä¹ˆï¼Ÿæ˜¯ç»‘å®šã€‚ç»‘å®šå¯æ˜¯ä¸€ä¸ªå¥½ä¸œè¥¿ï¼Œå¯ä»¥è®©ä½ çœå´å¾ˆå¤šä»£ç ,ç¹ççš„æ“作。将文本与Labelçš„textå±žæ€§ç»‘å®šï¼Œè¿™æ ·å½“ä½ é€‰æ‹©å…¶ä»–è¯è¨€æ—¶ï¼Œå°±å¯ä»¥è‡ªåŠ¨ä¿®æ”¹å†…å®¹ï¼Œè€Œä¸éœ€è¦ä½ 去特别编写什么了。
æºä»£ç :MultiLanguage.zip
好了,æ¥çœ‹ä»£ç å§ã€‚locale/zh-cn.xml
<locale> <phrase id="title" value="æ ‡é¢˜" /> <phrase id="content" value="内容" /> </locale>
æ¯ä¸€ä¸ªphrase就是一个æ¡ç›®ï¼Œä¾æ¬¡æŽ’下去就å¯ä»¥äº†ã€‚ç„¶åŽå°±æ˜¯è¿™ä¸ªè‡ªå®šä¹‰çš„Locale类了。在这个类ä¸ï¼Œä¸»è¦ç”¨åˆ°äº†ä»¥ä¸‹çŸ¥è¯†ï¼Œç»‘å®šå…ƒæ ‡è®°ï¼ŒXML读å–åŠæ“ä½œï¼Œé¼ æ ‡æŒ‡é’ˆï¼Œä»¥åŠé™æ€å˜é‡åŠæ–¹æ³•。locale/en-us.xml
<locale> <phrase id="title" value="Title" /> <phrase id="content" value="Content" /> </locale>
使用时,主程åºçš„代ç Locale.as
package { import flash.net.URLRequest; import flash.net.URLLoader; import mx.managers.CursorManager; public class Locale { private static var_phrase:Object; public static function get phrase():Object { return _phrase; } [Bindable] public function get phrase():Object { return _phrase; } private function set phrase(p:Object):void { phrase = p; } public function getLanguage(lang:String = 'zh-cn'):void { var xmlURL:String = "locale/" + lang + ".xml"; var xmlRequest:URLRequest = new URLRequest(xmlURL); var xmlLoader:URLLoader = new URLLoader(xmlRequest); xmlLoader.addEventListener(Event.COMPLETE, loadedHandler); mx.managers.CursorManager.setBusyCursor(); } private function loadedHandler(event:Event):void { var xml:XML = new XML(event.target.data); var p:Object = new Object(); for each (var pxml:XML in xml.children()) { p[pxml.@id] = pxml.@value; } phrase = p; CursorManager.removeBusyCursor(); } } }
代ç 其实很简å•,但是为了让它更好工作,我其实å°è¯•了很多的方法,首先我考虑,这个Localeåº”è¯¥æ˜¯ä¸€ä¸ªé™æ€çš„å¯¹è±¡ï¼Œå› ä¸ºå½“ä½ åœ¨æ•´ä¸ªåº”ç”¨ç¨‹åºé‡ŒåŽ»å¸ƒç½®è¯è¨€å—符串时,ä¸åº”è¯¥ä½¿ç”¨ç±»çš„å®žä¾‹ï¼Œè€Œæ˜¯ç›´æŽ¥åŽ»è°ƒç”¨ç±»çš„é™æ€æ–¹æ³•,但是Flex跟我说声对ä¸èµ·ï¼Œbindable isn’t support static。结果到最åŽï¼Œæˆ‘ä¸å¾—ä¸åŽ»ä½¿ç”¨ä¸€ä¸ªæŠ˜ä¸çš„æ–¹æ³•ï¼Œä¸ºå®ƒå‡†å¤‡äº†ä¸¤å¥—è¾“å‡ºï¼Œä¸€ä¸ªé™æ€çš„,用在ActionScript脚本ä¸ï¼Œè¿™æ ·å†™èµ·æ¥ä¹ŸçŸäº›ï¼›å¦ä¸€ä¸ªå°±æ˜¯ç”¨äºŽç»‘å®šçš„ï¼Œå½“ä½ åœ¨ä¸€ä¸ªè‡ªå®šä¹‰ç»„ä»¶å†…ä½¿ç”¨æ—¶éœ€è¦åŽ»è°ƒç”¨application下的locale对象,ä¸è¦åŽ»å°è¯•在自定义组件ä¸å»ºç«‹ä¸€ä¸ªå¯¹locale的弱引用对象,没用的,弱引用之åŽä»¥ä¸æ”¯æŒç»‘定,必须写全,åŽé¢åœ¨å…·ä½“说明。LocaleDemo.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();" xmlns:ns1="*"> <mx:Script> <![CDATA[ [Bindable] public var locale:Locale; private function initApp():void { locale = new Locale(); locale.getLanguage(); } ]]> </mx:Script> <mx:Label width="50%" height="50%" x="208" id="label1" y="25" text="{locale.phrase.title}"/> <mx:Label width="50%" height="50%" x="208" id="label2" y="55" text="{locale.phrase.content}"/> <mx:Button label="change" click="locale.getLanguage('en-us');" /> </mx:Application>
Flex调用文件需è¦ä½¿ç”¨flash.net.URLLoaderå’Œflash.net.URLRequest类,就åƒä¸Šé¢ä»£ç ä¸getLanguage(lang:String)所写的
<mx:Lable text=”{Application.application.locale.somePhrase}” />
loaderåŠ è½½å®Œæ¯•åŽï¼Œæ–‡ä»¶å†…容会储å˜åœ¨loader.dataä¸ï¼Œç‰åŠ è½½åŽå°±é€šè¿‡loadedHandler函数æ¥ç»§ç»å¤„ç†ã€‚
var xmlURL:String = "locale/" + lang + ".xml"; var xmlRequest:URLRequest = new URLRequest(xmlURL); var xmlLoader:URLLoader = new URLLoader(xmlRequest);
è¿™é‡Œï¼Œå°†é¼ æ ‡å˜æˆå¿™çš„æ ‡è¯†ï¼Œå‘Šè¯‰ç”¨æˆ·ï¼Œç¨‹åºæ£åœ¨å·¥ä½œã€‚CursorManager一般常用的就是setBusyCursor()å’ŒremoveBusyCursor()ï¼Œå½“ç„¶ä¹Ÿè¿˜æœ‰å…¶ä»–çš„åŠŸèƒ½ï¼Œæ¯”å¦‚å°†é¼ æ ‡æ¢æˆå…¶ä»–å›¾æ ‡ç‰ç‰ï¼Œè¿™ä¸ªå¾ˆç®€å•,帮助里介ç»çš„很详细了。
xmlLoader.addEventListener(Event.COMPLETE, loadedHandler); mx.managers.CursorManager.setBusyCursor();
当冿¬¡è°ƒç”¨getLanguage()时,绑定的textä¹Ÿä¼šè‡ªåŠ¨æ›´æ–°å†…å®¹ï¼Œè¿™æ ·å°±æˆè‹±è¯äº†ã€‚
<mx:Label id="label1" text="{locale.phrase.title}"/> <mx:Label id="label2" text="{locale.phrase.content}"/>
这里首先将loader的数æ®ç”±String转å˜ä¸ºXML,然åŽåˆ©ç”¨for each,把这些è¯å¥æ¡ç›®å˜åˆ°ä¸€ä¸ªå¯¹è±¡é‡Œã€‚
private function loadedHandler(event:Event):void { var xml:XML = new XML(event.target.data); var p:Object = new Object(); for each (var pxml:XML in xml.children()) { p[pxml.@id] = pxml.@value; } phrase = p; CursorManager.removeBusyCursor(); }
é™¤äº†è¿™æ ·æ·»åŠ å±žæ€§ä¹‹å¤–ï¼Œä½ è¿˜å¯ä»¥ä½¿ç”¨[]æ¥æ·»åŠ å±žæ€§ï¼Œå°±åƒè¿™æ ·ï¼š
var o:Object = new Object(); o.prop1 = "string"; o.prop2 = {label:'Label', value:'Value'}; o.prop3 = 4; o.prop4 = new Array(1, 2, 3, 4);
而我们程åºä¸æ‰€ä½¿ç”¨çš„就是这个方法,关于XMLæ“作专@”è¿ç®—符,大家å¯ä»¥åŽ»çœ‹å…¶ä»–çš„æ–‡ç« ï¼Œè®²çš„éƒ½å¾ˆè¯¦ç»†ã€‚
var o:Object = new Object(); o['prop1'] = "string"; o['prop2'] = {label:'Label', value:'Value'}; o['prop3'] = 4; o['prop4'] = new Array(1, 2, 3, 4);
æˆ‘æƒ³ï¼ŒçŽ°åœ¨ä½ å¯¹è¿™ä¸ªç¨‹åºçš„æµç¨‹å¾ˆäº†è§£äº†å§ï¼Œå¾ˆç®€å•å§ã€‚䏋颿ˆ‘们继ç»å°è¯•这个类去进行多è¯è¨€å¼€å‘。我刚刚æåˆ°ï¼Œå¦‚æžœä½ è‡ªå®šä¹‰äº†ä¸€ä¸ªç»„ä»¶ï¼Œè€Œä¸æ˜¯åœ¨ä¸»ç¨‹åºApplicationä¸ä½¿ç”¨locale怎么办?很简å•,就åƒè¿™æ ·ï¼š
p[pxml.@id] = pxml.@value;
Comp.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Label id="label" text="{Application.application.locale.phrase.title}" /> <mx:Button id="button" label="修改" click="clickHandler(event)" /> <mx:Script> <![CDATA[ import mx.core.Application; public function clickHandler(e:Event):void { Label.text = Locale.phrase.content; } ]]> </mx:Script> </mx:VBox>
ä½ åœ¨ä¸€ä¸ªScript䏿‰“算修改Label.textçš„è¯ï¼Œå°±å¯ä»¥ä½¿ç”¨Localeçš„é™æ€æ–¹æ³•ï¼Œè¿™æ ·å¯ä»¥å°‘打些å—,还需è¦å¼ºè°ƒçš„æ˜¯ï¼Œä½ 需è¦ç¡®ä¿è¿™æ—¶xml文件已ç»å¤„ç†å®Œæ¯•。ä¸è¿‡ï¼Œä¸€èˆ¬æƒ…况下,è¿è¡Œè¿™ç§äº‹ä»¶ä¸çš„ä»£ç æ—¶ï¼Œè‚¯å®šéƒ½å·²ç»æŠŠxml读进æ¥äº†ã€‚
æœ€åŽæ˜¯ä¿®æ”¹åŽçš„主程å¼
LocaleDemo.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();" xmlns:ns1="*"> <mx:Script> <![CDATA[ import mx.utils.ObjectUtil; [Bindable] public var lang:Array = new Array( {label:'䏿–‡',data:'zh-cn'}, {label:'English',data:'en-us'}); [Bindable] public var locale:Locale; private function initApp():void { locale = new Locale(); locale.getLanguage(); } ]]> </mx:Script> <mx:Label id="label1" text="{locale.phrase.title}"/> <mx:Label id="label2" text="{locale.phrase.content}"/> <ns1:Comp></ns1:Comp> <mx:ComboBox dataProvider="{lang}" id="cb" change="locale.getLanguage(cb.selectedItem.data)" /> </mx:Application>
基本上就是这些了,在大家射ç®çŸ¢ä¹‹å‰ï¼Œæˆ‘å…ˆè¯´ä¸‹çŽ°åœ¨çš„é—®é¢˜ï¼Œç¬¬ä¸€è¿™åªæ˜¯ä¸€ä¸ªDemoï¼Œæ²¡æœ‰ä¸æ¯«å®¹é”™æ€§ï¼Œæ¯”如,如果我å°è¯•使用xml䏿²¡æœ‰çš„一个æ¡ç›®ï¼Œé‚£ä¹ˆå®ƒä¼šåœ¨ç¨‹åºä¸ç•™ä¸‹ç©ºç™½ï¼Œè€Œæ£å¸¸æƒ…况下应该用那个idæ¥ä»£æ›¿å—符串,还有,如果找ä¸åˆ°xml文件呢。这些我都没有在这æ¥å†™ï¼Œå¦‚果把这些写上,我想大家会晕掉的。
更完备的代ç ç‰ç€å¤§å®¶äº†ã€‚
| « | 二月 2012 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | ||||