Bei einem aktuellen Kundenprojekt ging es um die Entwicklung einer zweisprachigen Micro-Site auf Basis von Flash. Um hierbei auf aktuelle Komponenten zugreifen zu können wurde AS3 als Sprachversion gewählt. Auch wenn AS3 der Nachfolger von AS2 ist, so haben die beiden Sprachen nur recht wenig gemein – aus Sicht von Flash ist dabei einiges zu beachten und zwei Problemfälle auf welche wir gestoßen sind möchten wir kurz darstellen:
FlashVars
Während es in AS2 noch einfach möglich war über die _root Variable auf via HTML übergebene Parameter zuzugreifen, so ist diese zentrale Variable in AS3 entschwunden und es bedarf anderer Techniken um auf die Variablen zuzugreifen:
...
import flash.display.LoaderInfo;
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
if (paramObj['countryID']){
if (paramObj['countryID']=='en') locale = 'en';
}
Hier sieht man die neue LoaderInfo Klasse welche den Zugriff auf die notwendigen Informationen bereitstellt und in einem Assoziativen-Array bereitstellt. Wer z.B. eine Hauptklasse mit Singleton-Pattern in seiner Anwendung bereithält kann damit die flashVars an einer zentralen Stelle hinterlegen und von überall darauf zugreifen.
i18n
Mehrsprachige Flash-Anwendungen sind immer ein spezielles Thema – insbesondere wenn viele Animationen und Ebenen einen schnellen Textaustausch verhindern. Hierzu stellt Flash eine Lokalisierungsfunktion bereit welche allerdings etwas unhandlich ist. Sie befindet sich unter Windows > Other Panels > Strings (STRG + F11). Um die Funktion zu nutzen Bedarf es dynamischer Textfelder (hier darauf achten dass die Schriftzeichen mit eingebunden werden!): Ein solches markieren und dann lässt sich aus dem Strings Panel heraus eine ID zuweisen womit man anschließend die Möglichkeit hat, verschiedene Sprachversionen für diesen Text anzulegen. Zudem hat man die Möglichkeit entweder per AS dynamisch, statisch oder von Flash die Sprache umschalten zu lassen.
Mit AS3 lässt sich die Sprache über das Locale Objekt umschalten wobei wichtig ist das der Pfad zu der Sprach XML hinterlegt ist sofern man nicht die Standardpfade von Flash verwendet:
import fl.lang.Locale;
if (switchToLanguage=='en'){
Locale.autoReplace = true;
Locale.addXMLPath('en','path_to_en.xml');
Locale.loadLanguageXML('en');
Locale.setDefaultLang('en');
}
Möchte man Zeilenumbrüche in den Übersetzungen verwenden stößt man (zumindest mit der EN-Version von Flash auf einem DE-Windows-System – andere Systeme konnte ich leider nicht testen) auf ein neues Problem denn man erhält immer doppelte Zeilenumbrüche – vermutlich wegen einer Inkonsistenz beim Abspeichern der XML Datei wodurch ein Umbruch mit \r\n codiert wird (DOS/Windows) – die Flash Runtime jedoch daraus zwei Leerzeilen macht. Mit folgendem Trick lässt sich dieser Fehler schnell zentral beheben:
Locale.setLoadCallback(langLoadedCB);
function langLoadedCBsuccess:Boolean){
// Workaround for Flash NewLine Issue when using XML Line Breaks causing double line breaks
var nlPattern:RegExp = /\n/;
for (var StringNo:String in Locale.stringIDArray){
var StringID = Locale.stringIDArray[StringNo];
Locale.setString(StringID,Locale.getDefaultLang(), Locale.loadString(StringID).replace(nlPattern,""));
}
}
Dabei wird eine Callback-Funktion registriert welche nach dem Laden der XML-Datei die einzelnen Übersetzungen durchgeht und die jeweilige doppelte Leerzeile auf eine Leerzeile reduziert indem das \n-Steuerzeichen entfernt wird – übrig bleibt dann nur noch \r.