我目前正在研究如何将我的Flash应用程序中的所有文本外部化为外部xml文件(用于翻译目的)。基本上,这些应用程序中的所有副本必须使用两种语言(英语和威尔士语)。
目前,我只是在查看一个结构,其中每个TextField实例的名称与XML中的字段相同,然后该字段有两个字段(<english>
&amp; <welsh>
)里面有相关的文字。 XML将被加载,然后通过将文本应用于当前语言的同名文本字段来循环。显然需要进行一些错误处理,以确保名称匹配,但这只能在运行时完成。
这似乎有点,我不知道......输了吗?是否有办法创造一个更好的结构或系统,以便更准确地命名各种东西,使它们匹配?
答案 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专用项目描述了一些替代方案。
- 大卫