Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-01-2006, 10:18   #1 (permalink)
C++ Fan
 
Registriert seit: Jan 2006
Ort: Saarbrücken
Beiträge: 16
Sprachenunterstützung mal einfach (XML)

Hallo zusammen,

[blabla]
ich bin noch neu hier und wenns um Flash geht auch noch sehr neu.
Mir haben ein paar Tips und Tuts von Usern hier sehr weitergeholfen und noch viel mehr Zeit und Nerven gespart. Somit will ich mal was zurückgeben
Ich hab ne Weile damit verbracht, hier nach der Möglichkeit zu suchen, mehrere Sprachen für mein FlashGUI verfügbar zu machen, aber nichts wirklich gutes, bzw direkt Umsetzbares gefunden.
Da ich auch in der Flashhilfe nichts über ResourceIDs, wie man das zB aus C++ kennt, gefunden habe, hab ich mich selbst dran gesetzt und was nettes kleines gebastelt, was in meinen Augen die Sache sehr einfach macht.
Da ich (leider) in Flash 6 arbeiten muss, ist es mit einfachsten Funktionen implementiert.
[/blabla]

Funktionsweise:
Ein zentrales Container Object, das alle SprachStrings speichert.
Eine XML Datei, in der die Strings abgelegt sind.
Bevor das FlashGUI loslegt kommen dann Buttons mit Länderflaggen, die den Container füllen. (Das geht natürlich auch zur Laufzeit, wo man dann einfach einfach den aktuellen Frame neuladen muss [der Rest geht automatisch], aber für meine Zwecke reicht das so)
Im GUI werden dann alle vorkommenden Texte aus diesem Container gefüllt.

Aufbau:
Im _root (oder sonstwo) lege man ein Objekt an:
PHP-Code:
langHolder = new Object();//all language strings are in here later 
Da ich absolut nicht auf den Actionscript Stil stehe, in dem Code immer auf irgendwelchen Objekten abgelegt wird, hab ich ne externe AS Datei angelegt, die includiert werden muss (in meinem Fall im _root):
PHP-Code:
#include "languages.as" 
Man lege beliebig viele Buttons an, über die per Klick nachher die gewünschte Sprache übergeben wird.
PHP-Code:
on(release){
    
loadLanguages("de");

Dabei ist zu beachten, dass das "de" und alle anderen Sprachen bzw eben der Key (wie das "de") dazu später im XML File exakt so geschrieben sind.

Diese Funktion findet sich in der bereits erwähnten externen AS Datei.

languages.as :
PHP-Code:
function loadLanguages(lang){
    
xmlfile = new XML();
    
xmlfile.ignoreWhite true;
    
xmlfile.onLoad = function(status) {
        if(!
status){
            
trace("loadLanguages loading failed");//Pfad falsch etc.
        
}
        else{
            
xmlpfad this.firstChild.childNodes;
            
//_root.Debug(("Loaded -"+xmlpfad.length+"- strings into _root"));//Ausgabe der gefunden Strings....nur so zur Selbstkontrolle
            
for(var 0;i<xmlpfad.length;i++){
                
_root.langHolder[xmlpfad[i].nodeName]=xmlpfad[i].attributes[lang];
//Hier ist mein kleiner feiner Trick, der mir so gut gefällt ;-)
//Die Namen der Nodes in der XML Datei stimmen mit den später verwendeten dynamischen Strings im GUI überein
//mit den eckigen Klammern hinter meinem Objekt im _root werden diese jetzt gerade dynamisch erzeugt.
//da in der XML Datei die eigtl Strings als Attribute hinterlegt sind (und nicht als Childnodes des Keywords), kann man wiederum mit den eckigen Klammern sehr elegant den gewünschten Sprachstring laden, wenn man dran denkt beim Aufruf gerade den Namen des Attributs zu übergeben, so wie weiter oben schon erwähnt.
            
}
            
//load completed....tell root to go and start since all strings are available
            
_root.nextFrame();//bewirkt, dass NACH erfolgreichem und VOLLSTÄNDIGEM Laden in den nächsten Frame gesprungen wird, weil ab JETZT die Strings verfügbar sind. (auch ausserhalb machbar, ganz klar, aber dafür muss umgestrickt werden, wozu ich keine Lust hab :)
        
}
    }
    
xmlfile.load("languageStrings.xml");

Der Inhalt der XML Datei sollte dann wie folgt aussehen :
PHP-Code:
<?xml version="1.0"?>
<LanguageResources>
    <PICS_NOTAVAILABLE en="No pictures available, first load some!" de="Zuerst ein paar Bilder laden!"/>
    <GEN_BACK en="Back" de="Zurueck"/>
    <NAVI_MAIN en="Main" de="Hauptseite"/>
    <NAVI_PICS en="Pics" de="Bilder"/>    
</LanguageResources>
Im GUI selbst legt man dann geschickter Weise einfach dynamische Texte an (schicker wirds, wenn man die als NICHT MARKIERBAR deklariert), die genau den Instanznamen haben, den man auch als Node Namen in der XML definiert hat (das is nicht nötig, machts aber viel einfacher!)
Hat man dann zB irgendwo nen Link, der bewirkt, dass man irgendwohin zurück kommt, nutzt man das so (alle Strings wurden ja bereits geladen):

PHP-Code:
this.GEN_BACK.text=_root.langHolder.GEN_BACK
Das wars schon.
Probleme hat man evtl falls man sehr sehr viele Strings hat und die XML Datei was größer wird.
Ich nutz das mit etwa 40 Strings und die Ladezeit der XML Datei ist vernachlässigbar. Auch wenn man zurück geht und neu läd stört die Ladezeit nicht.

Fürs Tips und Tricks wie das noch einfacher geht oder Korrekturen am Code bin ich gern zu haben.

Gruß
$motty
$motty ist offline   Mit Zitat antworten
Alt 30-01-2006, 11:40   #2 (permalink)
agedoubleju
Gast
 
Beiträge: n/a
Zitat:
Probleme hat man evtl falls man sehr sehr viele Strings hat und die XML Datei was größer wird.
Genau deshalb würde ich es so nicht machen. Du lädst ja auch immer die (überflüssigen) Daten der nicht benötigten Sprache mit.

Ich würde das über eine Arrayfunktion lösen, bspw.:
PHP-Code:
sprache = new Array("deutsch","englisch");
gewaehlteSprache 0;//könnte auch über Schaltflächen erzeugt werden
file = new Array("deutsch.xml","englisch.xml");

//zum Nachladen von Texten ginge dann bspw.
xmlfile.load(file[gewaehlteSprache]);

//Texte könnten dann dynamisch bspw. so gesetzt werden:
meineTextfeldinstanz.text meinTextstring[gewaehlteSprache]; 
Damit bleibt dann gewährleistet, dass dein Script für andere Sprachen nicht umgeschrieben werden muss, trotzdem aber nur die Texte geladen werden, die benötigt werden.

Allerdings wird sich in der Praxis zeigen, dass die Textfelder etc evtl. sprachabhängig angepasst werden müssen, im englischen bspw. wird vieles "kürzer" als im deutschen ausgedrückt...
  Mit Zitat antworten
Alt 30-01-2006, 17:06   #3 (permalink)
C++ Fan
 
Registriert seit: Jan 2006
Ort: Saarbrücken
Beiträge: 16
Zitat:
Zitat von agedoubleju
Du lädst ja auch immer die (überflüssigen) Daten der nicht benötigten Sprache mit.
jup, richtig, nur war ich zu faul die XML Datei 3 mal zu kopieren, was bei genauerer Betrachtung im Nachhinein gut geht, nur beim Einfügen neuer Strings super nervig is.
Zitat:
Zitat von agedoubleju
Damit bleibt dann gewährleistet, dass dein Script für andere Sprachen nicht umgeschrieben werden muss, trotzdem aber nur die Texte geladen werden, die benötigt werden.
grad das braucht meins nit, darum find ichs ja so schick. ich kann immernoch nit fassen, dass die spielprogrammiersprache as in flash mich das ganze in nur einer zeile machen lässt. diese technik mit den eckigen klammern um variablen anzulegen/auszulesen/den namen zu nutzen is zum schreien, einfach nur geil

thx für die anmerkungen
__________________
Gruß
$motty
$motty ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele