Flex4 多语言
Flex4 多语言
2011年01月04日
Flex开发2011-01-04 08:40:50阅读0评论0 字号:大中小 订阅 Flex在3和4中都有Localization的支持,包括使用Resource Modules。不过我并不打算使用该方法。
原因有二
1??Resource Modules过大:
使用Resource Modules是一种很好的设计模式,其意图是希望在运行状态中将资源从外部加载进来,以达到
减少垃圾文件及动态更换语言的目的。不过在最新Flex4版本中,这个想法还是没有很好的体现出来。
我编写了一个1K大小的lang.properties但是导出的Resource Modules确有18K(见原帖)。
这样完全没有达到使用Resource Modules的目的,至少对于多语言这方面是没有什么意义。
2??使用ResourceManager无法替换文字中的转义符:
文字中出现转义符的在很多程序设计中都有需要,由其在游戏中经常会需要显示如下的信息
"Congratulate you have found #ITEM_NAME#" ; "Hello #USER_NAME# ,nice to meet you"
无论使用@Resource 还是运行期间使用resourceManager.getString(**,**),
ResourceManager都无法胜任该工作。
因此,我自己设计了一套多语言结构,拿出来和大家探讨一下。如果有什么想法欢迎留言
Main:
flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
minWidth="1024"
minHeight="768"
width="348"
height="314"
initialize="onInit()"[b]>
Main 函数主要目的是初始化LanguageHandle,由于仅是做个Demo演示 所以没有写的那么复杂,代码看起来比较2....
LanguageHandle: package copyengine.common.lang
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.utils.Dictionary;
public class LanguageHandle extends EventDispatcher
{
private static var _instance: LanguageHandle;
public static function get instance():LanguageHandle
{
if (_instance == null)
{
_instance= new LanguageHandle();
}
return _instance;
}
private var allLanguageRes: Dictionary;
private var currentLanguage: String;
public function LanguageHandle()
{
allLanguageRes= new Dictionary();
}
public function init(_language: String): void
{
currentLanguage=_language;
}
public function addLanguage(_langXml: XML): void
{
currentLanguage=_langXml.@val;
var currentRes: Vector.= new Vector.();
allLanguageRes[currentLanguage]=currentRes;
for each ( var node: XML in _langXml.text)
{
var languageFile: LanguageFile= new LanguageFile;
languageFile.textID=node.@id;
languageFile.textValue=node.@val;
currentRes.push(languageFile);
}
}
[Bindable(event="CopyEngine_LanguageChange")]
public function getText(_textID: String): String
{
var currentRes: Vector.=allLanguageRes[currentLanguage];
for each ( var langugeFile: LanguageFile in currentRes)
{
if (langugeFile.textID == _textID)
{
return langugeFile.textValue;
}
}
return null;
}
public function changeLanguage(_language: String): void
{
currentLanguage=_language;
dispatchEvent( new Event("CopyEngine_LanguageChange"));
}
}
}
主要注意
[Bindable(event="CopyEngine_LanguageChange")]
public function getText(_textID:String):String]{}
这个是对getText函数进行绑定,当有Event-->CopyEngine_LanguageChange产生时,该函数即Call,
在最下方,当更换语言时就会dispatch出该Event
测试类:
flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
width="275"
height="181"[b]>
由于仅仅是简单的Demo,所以就没有封装Rplace函数,不过原理都是一样。
最终演示
转自:
猜你喜欢
转载自yky28yky.iteye.com/blog/1571703
今日推荐
周排行