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: [b] [/b]
  [b]flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/halo"
  minWidth="1024"
  minHeight="768"
  width="348"
  height="314"
  initialize="onInit()"[b]> [/b]
  [b] [/b]
  
  [b] [/b]
  [b] [/b]
  Main 函数主要目的是初始化LanguageHandle,由于仅是做个Demo演示 所以没有写的那么复杂,代码看起来比较2....
  LanguageHandle: [b]package[/b] copyengine.common.lang
  {
  [b]import[/b] flash.events.Event;
  [b]import[/b] flash.events.EventDispatcher;
  [b]import[/b] flash.utils.Dictionary;
  [b]public[/b] [b]class[/b] LanguageHandle [b]extends[/b] EventDispatcher
  {
  [b]private[/b] [b]static[/b] [b]var[/b] _instance:[b]LanguageHandle[/b];
  [b]public[/b] [b]static[/b] [b]function[/b] [b]get[/b] instance():LanguageHandle
  {
  [b]if[/b] (_instance == [b]null[/b])
  {
  _instance=[b]new[/b] [b]LanguageHandle[/b]();
  }
  [b]return[/b] _instance;
  }
  [b]private[/b] [b]var[/b] allLanguageRes:[b]Dictionary[/b];
  [b]private[/b] [b]var[/b] currentLanguage:[b]String[/b];
  [b]public[/b] [b]function [/b]LanguageHandle()
  {
  allLanguageRes=[b]new[/b] [b]Dictionary[/b]();
  }
  [b]public[/b] [b]function [/b]init(_language:[b]String[/b]):[b]void [/b]
  {
  currentLanguage=_language;
  }
  [b]public[/b] [b]function [/b]addLanguage(_langXml:[b]XML[/b]):[b]void [/b]
  {
  currentLanguage=_langXml.@val;
  [b]var[/b] currentRes:[b]Vector[/b].=[b]new[/b] Vector.();
  allLanguageRes[currentLanguage]=currentRes;
  [b]for[/b] [b]each[/b] ([b]var[/b] node:[b]XML[/b] [b]in[/b] _langXml.text)
  {
  [b]var[/b] languageFile:[b]LanguageFile[/b]=[b]new[/b] LanguageFile;
  languageFile.textID=node.@id;
  languageFile.textValue=node.@val;
  currentRes.push(languageFile);
  }
  }
  [Bindable(event="CopyEngine_LanguageChange")]
  [b]public[/b] [b]function [/b]getText(_textID:[b]String[/b]):[b]String [/b]
  {
  [b]var[/b] currentRes:[b]Vector[/b].=allLanguageRes[currentLanguage];
  [b]for[/b] [b]each[/b] ([b]var[/b] langugeFile:[b]LanguageFile[/b] [b]in[/b] currentRes)
  {
  [b]if[/b] (langugeFile.textID == _textID)
  {
  [b]return[/b] langugeFile.textValue;
  }
  }
  [b]return[/b] [b]null[/b];
  }
  [b]public[/b] [b]function [/b]changeLanguage(_language:[b]String[/b]):[b]void [/b]
  {
  currentLanguage=_language;
  dispatchEvent([b]new[/b] [b]Event[/b]("CopyEngine_LanguageChange"));
  }
  }
  }
  主要注意
  [Bindable(event="CopyEngine_LanguageChange")]
  public function getText(_textID:String):String]{}
  这个是对getText函数进行绑定,当有Event-->CopyEngine_LanguageChange产生时,该函数即Call,
  在最下方,当更换语言时就会dispatch出该Event
  测试类: [b] [/b]
  [b]flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/halo"
  width="275"
  height="181"[b]> [/b]
  [b] [/b]
  
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  [b] [/b]
  由于仅仅是简单的Demo,所以就没有封装Rplace函数,不过原理都是一样。
  最终演示
  转自:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值