`
iamzealotwang
  • 浏览: 121937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex4 多语言

    博客分类:
  • Flex
阅读更多

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:

MXML语言:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/halo"
               minWidth="1024"
               minHeight="768"
               width="348"
               height="314"
               initialize="onInit()">

    <fx:Script>
        <![CDATA[
            import fl.video.INCManager;
            import mx.rpc.events.XMLLoadEvent;
            import mx.rpc.soap.LoadEvent;
            import copyengine.common.lang.LanguageHandle;
            import mx.managers.PopUpManager;
            private var xmlLoader1:URLLoader;
            private var xmlLoader2:URLLoader;
            private var loaderCounter:int;

            private function onInit():void
            {
                loaderCounter=0;
                xmlLoader1=new URLLoader();
                xmlLoader1.dataFormat=URLLoaderDataFormat.BINARY;
                xmlLoader1.load(new URLRequest("../res/xml/lang_en.xml"));
                xmlLoader1.addEventListener(Event.COMPLETE, onLoadComplate);

                xmlLoader2=new URLLoader();
                xmlLoader2.dataFormat=URLLoaderDataFormat.BINARY;
                xmlLoader2.load(new URLRequest("../res/xml/lang_cn.xml"));
                xmlLoader2.addEventListener(Event.COMPLETE, onLoadComplate);
            }

            private function onLoadComplate(e:Event):void
            {
                LanguageHandle.instance.addLanguage(new XML(e.target.data));
                loaderCounter++;
                if (loaderCounter == 2)
                {
                    LanguageHandle.instance.init("EN");
                    PopUpManager.createPopUp(this, Panel1);
                }
            }
        ]]>
    </fx:Script>
</s:Application>

 

Main 函数主要目的是初始化LanguageHandle,由于仅是做个Demo演示 所以没有写的那么复杂,代码看起来比较2....

 

LanguageHandle:

ActionScript 3语言:
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.<LanguageFile>=new Vector.<LanguageFile>();
            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.<LanguageFile>=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

 

测试类:

MXML语言:
<?xml version="1.0" encoding="utf-8"?>
<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009"
         xmlns:s="library://ns.adobe.com/flex/spark"
         xmlns:mx="library://ns.adobe.com/flex/halo"
         width="275"
         height="181">
    <fx:Script>
        <![CDATA[
            import copyengine.common.lang.LanguageHandle;
        ]]>
    </fx:Script>
    <s:Button x="148"
              y="79"
              label="{LanguageHandle.instance.getText('BUTTON_CANCEL')}"
              width="60"
              height="20"/>
    <s:Button x="51"
              y="79"
              label="{LanguageHandle.instance.getText('BUTTON_OK')}"
              width="59"
              height="22"/>
    <s:TextArea x="33"
                y="0"
                height="73"
                width="198"
                text="{LanguageHandle.instance.getText('PANEL1_INFO')}"/>
    <s:Button x="6"
              y="121"
              label="CN"
              click="LanguageHandle.instance.changeLanguage('CN')"/>
    <s:Button x="195"
              y="121"
              label="EN"
              click="LanguageHandle.instance.changeLanguage('EN')"/>
    <s:layout>
        <s:BasicLayout/>
    </s:layout>
</s:Panel>

 

由于仅仅是简单的Demo,所以就没有封装Rplace函数,不过原理都是一样。

 

最终演示

3
0
分享到:
评论

相关推荐

    完美的Flex多语言支持解决方案

    在开发面向全球用户的Flex应用时,多语言支持显得尤为重要,这使得应用能够适应不同国家和地区的用户需求。本方案将详细探讨如何在Flex项目中实现完美的多语言支持,以满足i18n(国际化)的需求。 首先,我们需要...

    flex4 学习资料

    12. **国际化和本地化**:掌握Flex4中实现多语言支持的方法,包括资源bundle的使用和配置。 13. **移动设备开发**:Flex4支持移动平台开发,学习如何创建针对手机和平板的应用,利用StageWebView和StageVideo等特性...

    Flex4 一学就会 (Hello Flex4)

    Flex4引入了全新的Spark组件模型,与之前的MX组件模型相比,Spark组件更加轻量级,提供了更好的性能和更多的自定义可能性。Spark组件库包括了丰富的UI元素,如按钮、列表、面板等,它们在设计上更注重可定制性和可...

    Flex 4的十大变化

    3. **MXML 2009**:MXML作为一种基于XML的声明式语言,在Flex 4中进行了重大更新,以适应新的组件库和Catalyst的使用。MXML 2009引入了新的命名空间,使得开发者可以区分Spark和Halo组件,同时提供更好的行为解耦。...

    Flex 4 高级编程 Flex 4 高级编程

    Flex 4,全称为Adobe Flex 4,是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的开源框架,主要基于ActionScript和MXML语言。它提供了丰富的用户界面组件和强大的数据处理能力,使得开发者能够创建出具有高度...

    Flex4实战代码

    Flex4,全称为Adobe Flex 4,是Adobe公司推出的一款用于构建富互联网应用程序(RIA)的框架,基于ActionScript 3.0编程语言和Flash Player或Adobe AIR运行时环境。这个压缩包文件包含了多个章节的实战代码,涵盖了...

    Flex4学习文档

    在Flex4的开发中,MXML和ActionScript是核心开发语言。MXML用于布局和声明用户界面组件,而ActionScript则是用于编写应用程序的逻辑代码。二者结合,开发者可以创建具有动态交互性和高度可定制的用户界面。 学习...

    Effortless Flex 4 Development

    《Effortless Flex 4 Development》覆盖了Flex 4的核心概念和技术,包括MXML(标记语言)和ActionScript 3.0编程。书中详细介绍了如何使用Flex 4构建复杂的应用程序,涵盖了从基础到高级的主题,如组件开发、数据...

    Flex3与Flex4对比

    - **新状态MXML语言支持**:Flex4增加了对新状态MXML的支持,使得状态管理和动画控制变得更加容易。 - **FXG支持**:FXG是一种图形交换格式,Flex4支持FXG格式的导入和导出,这为设计人员提供了更多的灵活性。 - **...

    flex4.5.1.chm flex4API文档

    Flex是Adobe公司开发的一款用于创建富互联网应用(RIA)的框架,主要基于ActionScript和MXML语言。在Flex 4.5.1版本中,引入了一系列改进和新特性,为开发者提供了更强大的功能和更好的用户体验设计。这个"flex4.5.1...

    Flex4中文快速入门

    Flex4,全称为Adobe Flex 4,是Adobe公司推出的一款用于构建富互联网应用程序(Rich Internet Applications,RIAs)的框架,主要基于ActionScript和MXML。这个框架在2010年发布,提供了更为强大的图形渲染能力,以及...

    flex4中文API帮助文档

    总的来说,Flex4中文API帮助文档是Flex开发者不可或缺的工具,它覆盖了Flex4的所有核心功能,包括组件、MXML、ActionScript、布局、动画、服务集成等多个方面,对于学习和掌握Flex4开发技术至关重要。无论你是初学者...

    Flex4 经典帮助文档

    “What’s New in Flex 4”这份PDF文档很可能详细列举了上述所有改进,并可能包含更多关于Flex4的新功能、API变更以及最佳实践的信息。通过阅读这份文档,开发者不仅可以了解到Flex4的核心变化,还能掌握如何利用...

    Flex 4 权威指南 代码

    描述中的"Flex4权威指南 清晰中文版",暗示这是一个全面且深入的教程资源,可能包含了Flex 4的基本概念、组件使用、数据绑定、事件处理、动画制作、服务调用等多个方面的内容。这样的指南对于初学者理解Flex 4的框架...

    flex3语言参考手册

    4. **MXML**:MXML是Flex的标记语言,用于声明式地构建用户界面。掌握MXML的元素、属性和样式,以及如何在MXML中嵌入ActionScript代码。 5. **组件库**:Flex提供了一整套预定义的UI组件,如容器、按钮、文本框等。...

    FLEX4_flex4教程

    ### FLEX4_flex4教程知识点详解 #### 富互联网应用(RIA)概念与背景 - **RIA定义**: RIA代表“富互联网应用”(Rich Internet Applications),是一种提供类似于桌面应用体验的网络应用形式。 - **RIA背景**: - **C/...

    [Flash Builder 4 and Flex 4 Bible] Flex 4 宝典 配套代码

    在Flex 4中,ActionScript的性能得到了提升,类库也得到了扩展,支持更多的数据类型和编程模式,如元编程和强类型。这使得ActionScript成为了一种更强大的面向对象的编程语言,能够处理更复杂的业务逻辑。 Flex 4还...

    Flex4权威指南源代码

    《Flex4权威指南》是一本深入探讨Adobe Flex 4开发技术的专业书籍,其源代码提供了丰富..."flex4tfs.zip"压缩包中的"Volumes"可能是包含多个章节或部分的源码,每个部分对应书中一个主题或案例,供读者实际操作和学习。

    Flex4中文帮助文档

    - **Spark组件**:Flex4引入的新一代组件集,提供了更高的性能和更多的自定义选项,与以前的 Halo组件相比,Spark组件更注重设计和分离的UI组件模型。 2. **Flash Builder 4**: - **集成开发环境**:提供代码...

    flex4之语法入门

    - **本地化**:增强了多语言支持,方便创建国际化应用。 #### 二、Flash Builder 的下载与安装 **2.1 Flash Builder 简介** 随着 Flex 4 的发布,开发环境由之前的 Flex Builder 更名为 **Flash Builder**。这一...

Global site tag (gtag.js) - Google Analytics