Тут уже пару страниц обсуждений, выложу для разнообразия код, может кому пригодится... Как видите, кода меньше чем обсуждений, был написан хз когда, под мультиязычный проект с рантаймом, с тех пор мало что меняю.

Код AS3:
{
import flash.display.Stage;
/**
* ...
* @author Mikhail Klabukov
*/
[Event(name="language_change", type="LanguageEvent")]
public class Language
{
private static var _stage:Stage;
private static var _self:Language;
public static const RU:String = 'ru';
public static const EN:String = 'en';
public static const KZ:String = 'kz';
static public const TR:String = "tr";
public static var CUR:String = 'ru';
public function Language()
{
}
public static function setStage(stage:Stage):void {
_stage = stage;
}
public static function setLanguage(lang:String):void {
CUR = lang;
_stage.dispatchEvent(new LanguageEvent(LanguageEvent.LANGUAGE_CHANGE, CUR));
}
}
}

Код AS3:
package
{
import flash.events.Event;
/**
* ...
* @author Mikhail Klabukov
*/
public class LanguageEvent extends Event
{
public static const LANGUAGE_CHANGE:String = 'language_change';
private var _language:String;
public function LanguageEvent(type:String, language:String, bubbles:Boolean = false, cancelable:Boolean = false)
{
super(type, bubbles, cancelable);
_language = language;
}
public function get language():String
{
return _language;
}
}
}

Код AS3:
package
{
import avmplus.getQualifiedClassName;
import flash.display.Stage;
import flash.utils.Dictionary;
import starling.events.Event;
/**
* ...
* @author Mikhail Klabukov (xpochta@gmail.com)
*/
public class Translator
{
[Embed(source = "../lib/translations.xml", mimeType = "application/octet-stream")]
private static const LANGXML:Class;
public static var _self:Translator;
private var _xml:XML;
private var _stage:Stage;
private var _clients:Dictionary = new Dictionary(true);
public function Translator(stage:Stage)
{
_stage = stage;
_self = this;
_xml = XML(new LANGXML());
stage.addEventListener(LanguageEvent.LANGUAGE_CHANGE, translate)
}
private function translate(e:LanguageEvent):void
{
for (var i:Object in _clients)
{
var obj:Object = _clients[i];
for (var j:* in obj)
{
i[j] = _self.getTranslationFromXML(obj[j]);
}
}
}
static public function getTranslation(stringId:String, obj:* = null, propertyName:String = 'text'):void
{
var str:String = _self.getTranslationFromXML(stringId);
if (str == '')
{
trace('StringId:', stringId, 'is empty!');
}
if (obj != null)
{
var o:Object;
if ( _self._clients[obj] != null || _self._clients[obj] != undefined){
o = _self._clients[obj];
}else{
o = {};
}
o[propertyName] = stringId;
_self._clients[obj] = o;
obj[propertyName] = str;
obj.addEventListener(Event.REMOVED_FROM_STAGE,onRemove)
}
}
static private function onRemove(e:Event):void
{
e.currentTarget.removeEventListener(Event.REMOVED_FROM_STAGE, onRemove);
delete _self._clients[e.currentTarget];
}
public function getTranslationFromXML(id:String, lang:String = null):String
{
return _xml.string.(@id == id).attribute(checkLang(lang));
}
private function checkLang(lang:String):String
{
if (lang == null)
lang = Language.CUR;
return lang;
}
}
}