Привязка текстового поля к некоторому XML - PullRequest
0 голосов
/ 01 октября 2010

В настоящее время я ищу способы перенести весь текст в моих приложениях Flash во внешние XML-файлы (для целей перевода).В основном, все копии в этих приложениях должны быть на двух языках (английском и валлийском).

В данный момент я просто смотрю на структуру, в которой имя каждого экземпляра TextField совпадает с полем в XML, которое затем имеет два поля (<english> & <welsh>) внутрис соответствующим текстом.XML будет загружен и затем зациклен путем применения текста к текстовому полю с тем же именем на текущем языке.Очевидно, что потребуется некоторая обработка ошибок, чтобы убедиться, что имена совпадают, но это можно сделать только во время выполнения.

Это кажется немного, я не знаю .. проиграл?Есть ли способ создать лучшую структуру или систему, которая будет менее зависима от точного присвоения имен различным вещам, чтобы они соответствовали?

Ответы [ 3 ]

1 голос
/ 01 октября 2010

вы также можете использовать Text Layout Framework с E4X для большей гибкости.В следующем коде настраивается объект TextLayout с использованием атрибутов формата и контейнера из файла XML и содержимого из простого текстового файла, но в нем показано, как интегрировать 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.
-->
1 голос
/ 02 октября 2010

Используете ли вы FlexBuilder (или FlashBuilder)?Если это так, вы можете также рассмотреть методику, которая обычно используется для локализации, а именно пакеты ресурсов.Для получения дополнительной информации см., Например, здесь:

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

Ниже в комментариях на этой странице описаны некоторые альтернативы для проекта только для AS3.

- Дэвид

1 голос
/ 01 октября 2010

Редактировать /

Если под «связыванием» подразумевается двусторонняя связь, я не уверен, что серверная сторона может уведомить клиентскую сторону без запроса ...

Вы можете создать простой класс, который как минимум содержит 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...