将文本字段绑定到某些XML

时间:2010-10-01 10:31:08

标签: xml flash actionscript-3

我目前正在研究如何将我的Flash应用程序中的所有文本外部化为外部xml文件(用于翻译目的)。基本上,这些应用程序中的所有副本必须使用两种语言(英语和威尔士语)。

目前,我只是在查看一个结构,其中每个TextField实例的名称与XML中的字段相同,然后该字段有两个字段(<english>&amp; <welsh> )里面有相关的文字。 XML将被加载,然后通过将文本应用于当前语言的同名文本字段来循环。显然需要进行一些错误处理,以确保名称匹配,但这只能在运行时完成。

这似乎有点,我不知道......输了吗?是否有办法创造一个更好的结构或系统,以便更准确地命名各种东西,使它们匹配?

3 个答案:

答案 0 :(得分:1)

编辑/

如果通过“绑定”表示双向通信,我不确定服务器端是否可以在没有请求的情况下通知客户端...

您可以创建一个简单的类,该类至少包含您需要填充的TextField和语言属性。在创建此类的新实例时,您只需指定此实例的语言,因此在加载文本时,您可以检查语言属性的值并相应地加载文本。


public class MyTextField extends Sprite
{
    private var _textfield:TextField;
    private var _language:String;

    private var _text:String;
    private var _xmlURL:String;

    private var loader:URLoader = new URLLoader();

    public function MyTextField(fmt:Object)
    {
       configureListeners();

       _textfield = new TextField();
       _textfield.defaultTextFormat = fmt.format;
       //etc...

       addChild( _textfield );
    }

    public function set xmlURL(value:String):void
    {
        loader.load(value);
     }

    public function set language(value:String):void
    {
        _language = value;
     }

    public function get language():String
    {
       return _language;
    }

    //add here onCompleteHandler , configureListeners and parseXML method
}

答案 1 :(得分:1)

您还可以将文本布局框架与E4X一起使用,以获得更大的灵活性。以下代码使用XML文件中的格式和容器属性以及纯文本文件中的内容设置TextLayout对象,但它显示了如何将E4X与TLF结合使用,以便您能够轻松地根据需要进行定制。

呼叫者:

[SWF(width="1000", height="600", frameRate="60", backgroundColor="#330000")]

var layout:XMLTextLayout = new XMLTextLayout("XMLTextLayout.XML");
addChild(layout);

XMLTextLayout类:

package
{
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.edit.SelectionManager;
import flashx.textLayout.edit.SelectionFormat;
import flashx.textLayout.edit.EditingMode;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.conversion.ConversionType;

public class XMLTextLayout extends Sprite
    {
    //Class Variables
    private var xmlData:XML;

    //Constructor
    public function XMLTextLayout(XMLFileURL:String)
        {
        var xmlLoader:URLLoader = new URLLoader();
        xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        xmlLoader.addEventListener(Event.COMPLETE, xmlDataHandler);
        xmlLoader.load(new URLRequest(XMLFileURL));
        }

    private function xmlDataHandler(evt:Event):void
        {
        evt.target.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        evt.target.removeEventListener(Event.COMPLETE, xmlDataHandler);
        xmlData = new XML(evt.target.data);

        var textLoader:URLLoader = new URLLoader();
        textLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        textLoader.addEventListener(Event.COMPLETE, initiateLayout);
        textLoader.load(new URLRequest(xmlData.@textFileURL));
        }

    private function errorHandler(evt:IOErrorEvent):void
        {
        throw(evt.text);
        }

    //Layout Text
    private function initiateLayout(evt:Event):void
        {
        evt.target.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        evt.target.removeEventListener(Event.COMPLETE, initiateLayout);

        var textFormat:TextLayoutFormat = new TextLayoutFormat();

        for each (var formatProperty:XML in xmlData.format.*)
                {
                if  (textFormat.hasOwnProperty(formatProperty.name()))
                    textFormat[formatProperty.name()] = formatProperty.toString();
                }

        var configuration:Configuration = new Configuration();
        configuration.textFlowInitialFormat = textFormat;
        configuration.focusedSelectionFormat = new SelectionFormat(xmlData.format.@highlightColor);

        var textFlow:TextFlow = TextConverter.importToFlow(evt.target.data, xmlData.@conversionType, configuration);

        for each    (var element:XML in xmlData..container)
                {
                var sprite:Sprite = new Sprite();
                sprite.graphics.drawRect(0, 0, element.width, element.height);
                sprite.x = element.x;
                sprite.y = element.y;
                addChild(sprite);

                textFlow.flowComposer.addController(new ContainerController(sprite, sprite.width, sprite.height));
                }

        textFlow.flowComposer.updateAllControllers();
        textFlow.interactionManager = new SelectionManager();
        textFlow.interactionManager.editingMode == EditingMode.READ_SELECT;
        }
    }
}

XML文件:

<?XML version="1.0" encoding="UTF-8"?>

<textLayout textFileURL="Lorem Ipsum.txt" conversionType="plainTextFormat">

    <format highlightColor="0xFF0000">
        <color>0xAA0000</color>
        <fontSize>10.5</fontSize>
        <fontWeight>bold</fontWeight>
        <textAlign>left</textAlign>
        <verticalAlign>middle</verticalAlign>
        <columnCount>4</columnCount>
        <paddingLeft>40</paddingLeft>
        <paddingRight>40</paddingRight>
        <paddingTop>40</paddingTop>
        <paddingBottom>40</paddingBottom>
    </format>

    <container>
        <x>0</x>
        <y>0</y>
        <width>500</width>
        <height>600</height>
    </container>

    <container>
        <x>500</x>
        <y>70</y>
        <width>500</width>
        <height>480</height>
    </container>

</textLayout>

<!--
    Notes:
    1.  Format element names must match the public property names of the TextLayoutFormat class.
    2.  ConversionType and format element values must match the string value of the property's public constant.
-->

答案 2 :(得分:1)

您使用的是FlexBuilder(或FlashBuilder)吗?如果是这样,您可能还会考虑通常用于本地化的技术,即资源包。有关详细信息,请参阅,例如:

http://dispatchevent.org/roger/introduction-to-flex-resource-bundles

在该页面的评论中,为AS3专用项目描述了一些替代方案。

- 大卫