SWFObject 2.0: Einbetten von Adobe Flash Player Inhalten

Übersetzung der Google Code Page der Macher von SWFObject 2 (SWFObject 2.0 Doku)
Einige der SWFObject 2.0 links sind noch auf Englisch, werden aber mit und mit übersetzt
Viel Erfolg damit wünschen Euch die Powerflasher

Besucht doch auch unseren Blog!

Carlo Blatz

SWFObject 2.0 bietet zwei Methoden, um Flashinhalte in Webseiten einzubinden: markup-basiert oder mit Hilfe von JavaScript (8,7 kB, bzw. gezippte 3,4 kB). Eine angebotene JavaScript API bietet ein vollständiges tool set, um Flashinhalte einzubinden und Flash Player Informationen auszulesen. (englischsprachige Doku) SWFObject 2.0 löst SWFObject 1.5 ( http://blog.deconcept.com/swfobject/) und UFO (http://www.bobbyvandersluis.com/ufo/) ab.
SWFObject 2.0 möchte alle existierenden embed Methoden ablösen und einen einheitlichen Standard schaffen, Adobe Flash Player Inhalte in Webseiten zu integrieren. Es ist wahrscheinlich, dass es früher oder später das Adobe Flash Player Detection Kit (http://www.adobe.com/products/flashplayer/download/detection_kit/) ablöst.

SWFObject 2.0 ist ein open source Projekt von Geoff Stearns, Michael Williams und Bobby van der Sluis und war bisher unter dem Namen SWFFix bekannt (http://code.google.com/p/swffix/)

Inhaltsverzeichnis:

Was sind die Vorteile von SWFObject 2.0?

SWFObject 2.0

  • ist besser und flexibler, als jede andere Methode zum Einbinden von Flashinhalten
  • bietet für jeden eine passende Lösung: ob HTML-, Flash-, oder JavaScript-Entwickler, die Methode sollte jedem helfen
  • bietet eine Alternative gegenüber kommerziellen Ansätzen und unterstützt den Einsatz von Webstandards und alternativen Inhalten
  • nutzt die Vorteile von JavaScript und bietet einfachen Code
  • ist einfach anzuwenden

Der englischsprachige Artikel "Flash embedding cage match" auf A List Apart (http://www.alistapart.com/articles/flashembedcagematch/) beschreibt detailliert den Hintergrund von SWFObject 2.0.

Warum nutzt SWFObject JavaScript?

Hauptsächlich nutzt SWFObject 2.0 JavaScript, um Probleme zu lösen, die sich mit HTML alleine nicht lösen lassen.

  • Erkennt die FlashPlayer Version und bestimmt, welcher Flash- oder alternativer Inhalt gezeigt werden soll. Dies verhindert, dass veraltete Flash Plug-Ins Flashinhalte fehlerhaft darstellen
  • Bietet Funktionen im Falle veralteter Plug-Ins alternative Inhalte wieder anzuzeigen und nutzt dabei DOM (Anmerkung: wenn kein Flash Plug-In installiert ist, sorgt das HTML-Element object dafür, dass verschachtelte alternative Inhalte dargestellt werden.)
  • Bietet die Möglichkeit Adobe Express Install zu verwenden, um den neuesten Flashplayer zu installieren. Dies löst folgendes Problem: Ältere Webkit engines ignorieren das param Element von object und verwenden stattdessen das proprietäre embed element. (Anmerkung: Dies ist die einzige Stelle, an der proprietäres HTML verwendet wird. Dies wird in zukünftigen Versionen anders gelöst werden)
  • Bietet die Möglichkeit, Flashinhalte mittels JavaScript zu veröffentlichen und vermeidet damit mögliche "Steuerelement durch Klicken aktivieren" Mechanismen
  • Bietet eine ausgeklügelte JavaScript API, um übliche Flash Player - oder vom Flashinhalt ausführbare Aktivitäten zu steuern

Verwende ich besser die statische oder die dynamische Methode ?

SWFObject 2.0 bietet zwei grundsätzlich verschiedene Möglichkeiten Flashinhalte in Webseiten einzubinden:

  1. Die Methode static publishing bindet sowohl Flash- als auch den alternativen Inhalt durch die Verwendung von Standard HTML ein und nutzt JavaScript an den Stellen, an denen HTML alleine nicht weiterkommt.
  2. Die Methode dynamic publishing nutzt JavaScript, um den markup Inhalt mit Flashinhalt zu ersetzen, wenn die Mindestanforderungen an die Flashplayer Version erfüllt und JavaScript in ausreichendem Masse zugelassen ist. (ähnlich, wie frühere Versionen von SWFObject und UFO.

Die Vorteile der Methode static publishing:

  1. Der aktuelle HTML Standard wird unterstützt
  2. Die Einbindung von Flashinhalten hängt nicht von einer Skriptsprache ab, daher erreichen die Flashinhalte ein breiteres Publikum. Wenn das erforderliche Flash Plug-In installiert ist, aber JavaScript disabled, oder ein Browser verwendet wird, der JavaScript nicht unterstützt sind trotzdem die folgenden Dinge möglich:

    • Flashinhalte zu sehen
    • Flashinhalte auch auf Geräten darzustellen, die nur sehr mäßig JavaScript unterstützen (bspw. Sony PSP )
    • Tools, wie RSS reader sind in der Lage Flashinhalte zu erkennen

Die Vorteile der Methode dynamic publishing:

  1. Man muss nicht erst Klicken, um Flashinhalte im Internet Explorer 6/7 und Opera 9+ zu aktivieren. Dazu ist anzumerken, dass Microsoft derzeit grundsätzlich alle aktiven Inhalte in Internet Explorer Browsern nicht zulässt (englischsprachiger Blogartikel dazu)
  2. Sie integriert sich problemlos in Applikationen

Wie binde ich Flashinhalte mit Hilfe der Methode static publishing ein?

Schritt 1: Flash- und alternative Inhalte mit standardkonformem markup einbinden

SWFObjects markup verwendet eine verschachtelte object Methode (mit proprietären Kommentaren für den Internet Explorer (http://www.alistapart.com/articles/flashembedcagematch/)) um sicherzustellen, dass die meisten HTML-only Browser unterstützt werden. Gleichzeitig ist aber sichergestellt, dass Standards eingehalten und alternative Inhalte dargestellt werden können. (http://www.swffix.org/testsuite/)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>SWFObject v2.0 - step 1</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  </head>
  <body>
    <div>
      <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
        <param name="movie" value="myContent.swf" />
        <!--[if !IE]>-->
        <object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
        <!--<![endif]-->
          <p>Alternative content</p>
        <!--[if !IE]>-->
        </object>
        <!--<![endif]-->
      </object>
    </div>
  </body>
 </html>

Anmerkung: Die verschachtelte object Methode benötigt zwei object Elemente (das äußere object für den Internet Explorer, das innere object für alle anderen Browser) damit die object Attribute und verschachtelten param Elemente nicht zweimal definiert werden müssen.

Benötigte Attribute:

  • classid (nur für das äußere object Element, der Wer ist immer clsid:D27CDB6E-AE6D-11cf-96B8-444553540000)
  • type (nur für das innere object Element, der Wert ist immer application/x-shockwave-flash)
  • data (nur für das innere object Element, definiert die URL einer SWF)
  • width (bei beiden object Elementen, definiert die Breite der SWF)
  • height (bei beiden object Elementen, definiert die Höhe der SWF)

Benötigte param Elemente:

  • movie (nur für das äußere object Element, definiert die URL einer SWF)

Anmerkung: Wir raten von der Verwendung des codebase Attributes zum Verweisen auf den Installer des Flash Plug-Ins auf den Adobe Servern ab, da dies illegal ist. Laut Vereinbarungen ist der Zugriff auf die Domain ausschließlich auf das aktuelle Dokument beschränkt. Stattdessen empfehlen wir, alternativen Inhalt anzubieten, der dem User mitteilt, dass er, um in den vollen Genuss der Webseite zu kommen, das Flash Plug-In downloaden muss.

Wie kann man mit HTML Flashinhalte konfigurieren?

Man gibt dem object Element folgende häufig verwendeten, optionalen Attribute mit: (http://www.w3schools.com/tags/tag_object.asp)

  • id
  • name
  • class
  • align

Man verwendet die folgenden optionalen Flash spezifischen param Elemente: (http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701)

Wieso ist die Verwendung alternativer Inhalte so wichtig?

In dem object Element kann man alternative Inhalte ablegen, die angezeigt werden, wenn kein Flash Plug-In installiert oder unterstützt wird. Dieser Inhalt kann aber auch von Suchmaschinen erfasst werden. Das ist ein großes Plus für alternativen Inhalt. Zusammenfassend kann man sagen, dass man alternativen Inhalt anlegen sollte, wenn man Webcontent erstellen möchte, der auch für Menschen, die ohne Plug-Ins surfen, erreichbar sein soll (http://www.adobe.com/devnet/flash/articles/progressive_enhancement_03.html), man Suchmaschinenfreundlichen Inhalt erzeugen möchte (http://www.adobe.com/devnet/flash/articles/progressive_enhancement_04.html) oder man dem Besucher mitteilen möchte, dass er ohne Flash Plug-In etwas verpasst.

Schritt 2: Die SWFObject JavaScript library im head der HTML Seite einbinden

Die SWFObject library besteht aus einer externen JavaScript Datei. SWFObject wird ausgeführt, sobald es gelesen wird und führt sobald DOM geladen ist, sofort sämtliche DOM Manipulationen aus. (Bei allen Browsern, die das unterstützen, wie IE, Firefox, Safari, Opera 9+, ansonsten, sobald das onload event ausgeführt wird)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>SWFObject v2.0 - step 2</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <script type="text/javascript" src="swfobject.js"></script>
</head>
  <body>
    <div>
      <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
        <param name="movie" value="myContent.swf" />
        <!--[if !IE]>-->
        <object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
        <!--<![endif]-->
          <p>Alternative content</p>
        <!--[if !IE]>-->
        </object>
        <!--<![endif]-->
      </object>
    </div>
  </body>
</html>

Schritt 3: Registrierung des Flash contents in der SWFObject library und SWFObject mitteilen, was damit zu tun ist.

Zunächst muss man dem äußeren object tag, das den Flashinhalt beschreibt, eine eindeutige id zuordnen. Anschließend muss man der swfobject.registerObject Methode folgendes mitteilen:

  1. Das erste Argument (String, zwingend erforderlich) ist die id, die im HTML definiert wurde.
  2. Das zweite Argument (String, zwingend erforderlich) legt die Mindestflashplayerversion fest, die benötigt wird, um die Inhalte darzustellen. Dies aktiviert die Flashversions detection für eine SWF und bestimmt über eine DOM Anpassung, ob Flash oder ein alternativer Inhalt angezeigt werden soll. Üblicherweise setzen sich Versionsnummern von Flashplayer aus major.minor. release.built zusammen. SWFObject schaut nur auf die ersten drei Ziffern, so dass bspw. "WIN 9.0.18.0" (IE) oder "Shockwave Flash 9 r18" (alle anderen Browser) in "9.0.18" übersetzt werden.
  3. Das dritte Argument (String, optional) kann verwendet werden, um den Adobe Express Installer aufzurufen (http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75) und spezifiziert die URL der express install SWF Datei. Die Expressinstallation zeigt einen standardisierten Flash Plug-In Download Dialog anstatt des eigentlichen Flashinhaltes an, wenn die benötigte Playerversion nicht verfügbar ist. Eine default expressinstall.swf ist Teil des Projektordners. Dazu gehören ebenfalls die korrespondierende expressInstall.fla und AS Dateien (im SRC Verzeichnis), um die Oberfläche der Expressinstallation individuell anpassen zu können. Anmerkung: express install wird nur ein einziges Mal - nämlich beim ersten Aufruf - angezeigt. Außerdem wird es nur von Flashplayern 6.0.65 oder höher auf WIN- und Mac-Systemen angezeigt und benötigt eine SWF Mindestgröße von 310x137 Pixeln.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>SWFObject v2.0 - step 3</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <script type="text/javascript" src="swfobject.js"></script>
    <script type="text/javascript">
    swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");
    </script>
</head>
  <body>
    <div>
      <object id="myId"  classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780"  height="420">
        <param name="movie" value="myContent.swf" />
        <!--[if !IE]>-->
        <object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
        <!--<![endif]-->
          <p>Alternative content</p>
        <!--[if !IE]>-->
        </object>
        <!--<![endif]-->
      </object>
    </div>
  </body>
</html>

Tipps:

Wie binde ich Flashinhalte mit Hilfe der Methode dynamic publishing ein?

Schritt 1: Alternativen Inhalt mit standardkonformem markup erstellen

Die in SWFObject 2.0 integrierte Methode folgt dem Prinzip des progressive enhancement (http://www.adobe.com/devnet/flash/articles/progressive_enhancement.html) und ersetzt alternativen HTML-Inhalten mit Flashinhalt, wenn ausreichend JavaScript und Flash Plug-In Unterstützung gewährleistet ist. Zuerst muss der alternative Inhalt angelegt und mit einer eindeutigen id versehen werden:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"  xml:lang="en">
  <head>
    <title>SWFObject v2.0 dynamic embed - step 1</title>
    <meta http-equiv="Content-Type" content="text/html;  charset=iso-8859-1" />
  </head>
  <body>
<div id="myContent">
      <p>Alternative content</p>
    </div>
</body>
</html>

 

Schritt 2: JavaScript library von SWFObject im head der HTML-Seite einbinden

Die SWFObject library besteht aus einer externen JavaScript Datei. SWFObject wird ausgeführt, sobald es gelesen wird und führt sobald DOM geladen ist, sofort sämtliche DOM Manipulationen aus. (Bei allen Browsern, die das unterstützen, wie IE, Firefox, Safari, Opera 9+, ansonsten, sobald das onload event ausgeführt wird)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>SWFObject v2.0 dynamic embed - step 2</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
</head>
  <body>
    <div id="myContent">
      <p>Alternative content</p>
    </div>
  </body>
</html>


Schritt 3: SWF mit JavaScript einbinden

swfobject.embedSWF (swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes) hat fünf optionale Argumente:

  1. swfUrl (String, zwingend notwendig) legt die URL zur SWF fest
  2. id (String, zwingend notwendig) ist die id im HTML code in der der alternative Inhalt steht, der durch den Flashinhalt ersetzt werden soll
  3. width (String, zwngend notwendig) legt die Breite der SWF fest
  4. height (String, zwingend erforderlich) legt die Höhe der SWF fest
  5. version (String, zwingend erforderlich) legt die Flashplayer-Version fest, die mindestens erforderlich ist, um den Flashinhalt abspielen zu können. (Format: major.minor.release)
  6. expressInstallSwfurl (String, optional), legt die URL zur express install SWF fest und aktiviert Adobes Expressinstallation (http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75) Anmerkung: express install wird nur ein einziges Mal - nämlich beim ersten Aufruf - angezeigt. Außerdem wird es nur von Flashplayern 6.0.65 oder höher auf WIN- und Mac-Systemen angezeigt und benötigt eine SWF Mindestgröße von 310x137 Pixeln
  7. flashvars (Object, optional) übergibt flashvars, Format: name:wert
  8. params (Object, optional) übergibt die params der verschachtelten object Elemente, Format: name:wert
  9. attributes (Object, optional) übergibt attribute von object, Format: name:wert

Anmerkung: Man kann die Angabe der optionalen Parameter weglassen, solange man sich an die Reihenfolge der Parameterangaben hält. Möchte man einen optionalen Parameter nicht verwenden, den danach aber schon, trägt man für den "dazwischen" einfach false als Wert ein. Für die JavaScript Objekte Parameter flashvars, params und attributes kann man auch leere Objekte übergeben: ().

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>SWFObject v2.0 dynamic embed - step 3</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <script type="text/javascript" src="swfobject.js"></script>
    <script type="text/javascript">
    swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0");
    </script>
  </head>
  <body>
    <div id="myContent">
      <p>Alternative content</p>
    </div>
  </body>
</html>

Wie kann man seinen Flashinhalt konfigurieren?

Man gibt dem object Element folgende häufig verwendeten, optionalen Attribute mit: (http://www.w3schools.com/tags/tag_object.asp)

  • id (Anmerkung: wenn undefiniert wird dem object Element automatisch die id des containers für den alternativen Inhalt zugewiesen)
  • name
  • styleclass (statt class, weil dies auch ein ECMA4 reserviertes Schlüsslwort ist)
  • align

Man verwendet die folgenden optionalen Flash spezifischen param Elemente: (http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701)

Wie verwendet man JavaScript Objekte, um die Attribute von flashvars, params und object zu definieren?

Am besten definiert man JavaScript Objekte über literal notation, das sieht so aus:

<script type="text/javascript">
var flashvars = {};
var params = {};
var attributes = {};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>

In der Definition kann man auch die Kombination name:wert verwenden. (Anmerkung: bitte kein Komma hinter die letzte Kombination name:wert im Objekt setzen)

<script type="text/javascript">
var flashvars = {
  name1: "hello",
  name2: "world",
  name3: "foobar"
};
var params = {
  menu: "false"
};
var attributes = {
  id: "myDynamicContent",
  name: "myDynamicContent"
};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>

Oder man fügt Eigenschaften und Werte mit Punktschreibweise zu, nachdem man das Objekt erstellt hat:

<script type="text/javascript">
var flashvars = {};
flashvars.name1 = "hello";
flashvars.name2 = "world";
flashvars.name3 = "foobar";
var params = {};
params.menu = "false";
var attributes = {};
attributes.id = "myDynamicContent";
attributes.name = "myDynamicContent";
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>

Was auch folgendermaßen geschrieben werden kann (die unleserlichere Variante für die ganz Harten, die am liebsten alles in eine Zeile schreiben)

<script type="text/javascript">
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"}, {menu:"false"}, {id:"myDynamicContent",name:"myDynamicContent"});
</script>

Will man kein Argument übergeben, kann man es als false definieren oder ein leeres Objekt übergeben:

<script type="text/javascript">
var flashvars = false;
var params = {};
var attributes = {
  id: "myDynamicContent",
  name: "myDynamicContent"
};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>
Das flashvars Objekt ist nur dazu da, das Leben zu vereinfachen. Man kann es ebensogut ignorieren und die flashvars über das params Objekt mitgeben.
<script type="text/javascript">
var flashvars = false;
var params = {
  menu: "false",
  flashvars: "name1=hello&name2=world&name3=foobar"
};
var attributes = {
  id: "myDynamicContent",
  name: "myDynamicContent"
};
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
</script>

Tipps:

Tipps zur Migration von SWFObject 1.5 auf SWFObject 2.0

  1. SWFObject 2.0 ist NICHT abwärtskompatibel zu SWFObject 1.5
  2. Alle Skriptblöcke sollten in den head der HTML Seite eingefügt werden
  3. Die library ist vollständig in Kleinbuchstaben angelegt swfobject statt wie bisher SWFObject
  4. Auf Methoden kann nur über die library zugegriffen werden (statt wie bisher über ein Instanz SWFObject)
  5. Die API ist vollkommen neu und durchorganisiert (http://code.google.com/p/swfobject/wiki/SWFObject_2_0_api_javascript_dev)
  6. SWFObject 2.0 ersetzt vollständig den alternativen HTML Block, inklusive dem referenzierten HTML container Element, wenn ausreichender JavaScript- und Flashsupport gewährleistet ist. SWFObject 1.5 hat hingegen nur den Inhalt im referenzierten Container ersetzt.
  7. Wird keine id übergeben, erhält das object Element automatisch die id des Container Elementes vom HTML, in dem der alternative Inhalt steht.

Tipps zur Migration von UFO auf SWFObject 2.0

  1. SWFObject 2.0 ersetzt vollständig den alternativen HTML Block, inklusive dem referenzierten HTML container Element, wenn ausreichender JavaScript- und Flashsupport gewährleistet ist. UFO hat hingegen nur den Inhalt im referenzierten Container ersetzt.
  2. Wird keine id übergeben, erhält das object Element automatisch die id des Container Elementes vom HTML, in dem der alternative Inhalt steht.
  3. API, s. swfobject.createCSS (selStr, declStr) unter (http://code.google.com/p/swfobject/wiki/SWFObject_2_0_api_javascript_dev)

Unterstützt SWFObject 2.0 MIME type aplication/xhtml+xml?

SWFObject 2.0 unterstützt NICHT XML MIME Typen, das ist eine Designentscheidung. Es gibt eine ganze Reihe von Gründen:

  • nur ein sehr kleiner (insignifikanter) Teil der Webentwickler nutzt es
  • Wir sind unsicher, ob der Weg der richtige wäre. Internet Explorer unterstützt es nicht und auch andere Browseranbieter tendieren zunehmend dazu, den neuen Standardweg des HTML parsing, der nicht der WC3 Vision zum parsen von HTML als XML entspricht, nicht zu untersützen.
  • Wir sparen eine Menge Dateigröße und Aufwand (Testen, Problemlösung), wenn wir es nicht unterstützen.

 

Anmerkungen zur Übersetzung an Ariane Lucke-Vossel.