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