<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 15234 -->
<!-- Reviewed: no -->
<sect1 id="zend.translate.adapter">

    <title>Adapter für Zend_Translate</title>

    <para>
        <classname>Zend_Translate</classname> kann unterschiedliche Adapter für die Übersetzung verwenden.
        Jeder Adapter hat seine eigenen Vor- und Nachteile. Hier ist eine kurze
        Liste aller unterstützten Adapter für Übersetzungs Quell Dateien.
    </para>

    <table id="zend.translate.adapter.table">
        <title>Adapter für Zend_Translate</title>
        <tgroup cols="3">
            <thead>
                <row>
                    <entry>Adapter</entry>
                    <entry>Beschreibung</entry>
                    <entry>Benutzung</entry>
                </row>
            </thead>
            <tbody>
                <row>
                    <entry>Array</entry>
                    <entry>Für PHP Arrays</entry>
                    <entry>Kleine Seiten; Einfachste Handhabung; nur für Programmierer</entry>
                </row>
                <row>
                    <entry>Csv</entry>
                    <entry>Für kommagetrennte (*.csv/*.txt) Dateien</entry>
                    <entry>Einfaches Textdatei Format; schnell; mögliche Probleme bei der Verwendung von Unicode Zeichen</entry>
                </row>
                <row>
                    <entry>Gettext</entry>
                    <entry>Für binäre Gettext (*.mo) Dateien</entry>
                    <entry>GNU Standard für Linux; Threadsicher; benötigt Tools für die Übersetzung</entry>
                </row>
                <row>
                    <entry>Ini</entry>
                    <entry>Für einfache ini (*.ini) Dateien</entry>
                    <entry>Einfaches Testdatei Format; schnell; mögliche Probleme mit Unicode Zeichen</entry>
                </row>
                <row>
                    <entry>Tbx</entry>
                    <entry>Für termbase exchange (*.tbx/*.xml) Dateien</entry>
                    <entry>Industrie Standard für Applikations übergreifende terminologie Strings; XML Format</entry>
                </row>
                <row>
                    <entry>Tmx</entry>
                    <entry>Für TMX (*.tmx/*.xml) Dateien</entry>
                    <entry>Industrie Standard für Applikations übergreifende Übersetzungen; XML Format, menschlich lesbar</entry>
                </row>
                <row>
                    <entry>Qt</entry>
                    <entry>Für qt Linguist (*.ts) Dateien</entry>
                    <entry>Plattform übergreifender Anwendungs Framework; XML Format, menschlich lesbar</entry>
                </row>
                <row>
                    <entry>Xliff</entry>
                    <entry>Für XLIFF (*.xliff/*.xml) Dateien</entry>
                    <entry>Ein einfacheres Format als TMX aber vergleichbar; XML Format; menschlich lesbar</entry>
                </row>
                <row>
                    <entry>XmlTm</entry>
                    <entry>Für xmltm (*.xml) Dateien</entry>
                    <entry>Industrie Standard für XML basierende Übersetzungsspeicher; XML Format; menschlich lesbar</entry>
                </row>
                <row>
                    <entry>Andere</entry>
                    <entry>*.sql</entry>
                    <entry>Verschiedene andere Adapter werden in Zukunft noch implementiert</entry>
                </row>
            </tbody>
        </tgroup>
    </table>

    <sect2 id="zend.translate.adapter.decision">

        <title>Wie man entscheidet welchen Adapter man benutzen soll</title>

        <para>
            Zuerst muss man die Entscheidung treffen welchen der Adapter man für
            <classname>Zend_Translate</classname> benutzen soll. Oft sind externe Kriterien wie die Vorgaben
            durch ein Projekt oder durch eien Kunden dafür ausschlaggebend. Aber
            wenn die Entscheidungsgewalt in den eigenen Händen liegt, werden die folgenden
            Hinweise die Entscheidung vereinfachen.
        </para>

        <note>
            <para>
                Wenn man den Adapter auswählt sollte man auch auf das Verwendete Encoding achten.
                Selbst wenn Zend Framework UTF-8 als Standard Encoding definiert besteht manchmal die
                Notwendigkeit andere Encodings zu verwenden. <classname>Zend_Translate</classname> ändert kein
                Encoding welches in Quelldateien definiert ist was bedeutet das, wenn eine Gettext Quelle
                auf ISO-8859-1 aufgebaut ist, die Strings auch in diesem Encoding zurückgegeben werden
                ohne das diese Konvertiert werden. Es gibt nur eine Einschränkung:
            </para>

            <para>
                Wenn XML basierende Quellformate wie TMX oder XLIFF verwendet werden muß das Encoding in
                den XML Dateiheadern definiert werden weil XML Dateien ohne definiertes Encoding durch jeden
                Parser standardmäßig als UTF-8 angesehen werden. Man sollte auch darauf achten das aktuell
                das Encoding von XML Dateien auf die Encodings limitiert ist welche durch PHP unterstützt
                werden. Das sind aktuell UTF-8, ISO-8859-1 und US-ASCII.
            </para>
        </note>

        <sect3 id="zend.translate.adapter.array">

            <title>Zend_Translate_Adapter_Array</title>

            <para>
                Der Array Adapter ist der Adapter welcher am einfachsten für Programmierer
                zu verwenden ist.
                Aber wenn viele Strings oder viele Sprachen zu übersetzen sind sollte über
                einen anderen Adapter nachgedachte werden. Wenn z.B. über 5000 Strings zu
                übersetzen sind wird der Array Adapter nicht die beste Wahl sein.
            </para>

            <para>
                Dieser Adapter sollte nur für kleine Seiten mit einer Handvoll Sprachen
                verwendet werden. Und wenn man selbst oder das eigene Team die Übersetzungen
                erstellen kann.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.csv">

            <title>Zend_Translate_Adapter_Csv</title>

            <para>
                Der CSV Adapter ist der Adapter der am einfachsten für Kunden zu benutzen ist.
                CSV Dateien sind mit Standard Texteditoren lesbar, aber diese Editoren
                unterstützen oft nicht UTF8 Zeichen.
            </para>

            <para>
                Man sollte diesen Adapter nur benutzen wenn der Kunde die Übersetzungen
                selbst durchführen will.
            </para>

            <note>
                <para>
                    Es ist zu beachten das der Csv Adapter Probleme hat wenn die Csv Dateien anders
                    kodiert sind als die Gebietsschema-Einstellung der Umgebung. Die Ursache ist ein
                    Bug von PHP selbst der nicht vor PHP 6.0 behoben sein wird
                    (http://bugs.php.net/bug.php?id=38471). Deshalb sollte man achtgeben das der Csv
                    Adapter wegen Einschränkungen durch PHP nicht unabhängig vom Gebietsschema ist.
                </para>
            </note>
        </sect3>

        <sect3 id="zend.translate.adapter.gettext">

            <title>Zend_Translate_Adapter_Gettext</title>

            <para>
                Der Gettext Adapter ist der Adapter der am meisten verwendet wird.
                Gettext ist ein Übersetzungsformat welches durch GNU eingeführt wurde
                und jetzt weltweit Verwendung findet.
                Es ist nicht menschlich lesbar, allerdings existieren einige kostenlose
                Freeware Tools (zum Beispiel, <ulink url="http://sourceforge.net/projects/poedit/">POEdit</ulink>),
                welche sehr nützlich sind. Der <classname>Zend_Translate</classname> Gettext Adapter ist nicht
                mit Hilfe von PHP's Gettext Erweiterung realisiert worden.
                Der Gettext Adapter kann also verwendet werden selbst wenn PHP's Gettext
                Erweiterung nicht verfügbar ist.
                Ausserdem ist der Adapter im Gegensatz zu PHP's Gettext Erweiterung Threadsicher.
            </para>

            <para>
                Die meisten werden diesen Adapter benutzen.
                Mit den vorhandenen Tools ist eine Professionelle Übersetzung sehr einfach.
                Aber Gettext Dateien werden in einem machinen-lesbaren Format gespeichert
                und sind nicht ohne Tools lesbar.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.ini">

            <title>Zend_Translate_Adapter_Ini</title>

            <para>
                Der INI Adapter ist ein sehr einfacher Adapter welcher sogar direkt von Kunden verwendet
                werden kann. INI Dateien sind von standardmäßigen Texteditoren lesbar, aber Texteditoren
                unterstützen oftmals keine UTF8 Zeichensets.
            </para>

            <para>
                Dieser Adapter sollte nur dann verwendet werden wenn ein Kunde Übersetzungen selbst machen
                will. Verwenden Sie diesen Adapter nicht als generelle Übersetzungsquelle.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.tbx">

            <title>Zend_Translate_Adapter_Tbx</title>

            <para>
                Der TBX Adapter ist ein Adapter der von Kunden benutzt wird, die bereits das TBX Format
                für Ihre internen Übersetzungssysteme verwenden. TBX ist kein standardmäßiges
                Übersetzungsformat sondern eher eine Sammlung von bereits übersetzten und vor-übersetzten
                Quellstrings. Wenn dieser Adapter verwendet wird, muß sichergestellt werden das alle
                benötigten Quell Strings übersetzt sind. TBX ist ein dateibasiertes und komplett neues
                Format. XML Dateien sind menschlich lesbar, aber das Lesen der Dateien ist nicht so schnell
                wie mit Gettext Dateien.
            </para>

            <para>
                Dieser Adapter ist perfekt für Firmen die bereits vor-übersetzte Quell Dateien verwenden.
                Die Dateien sind menschlich lesbar und Betriebsystem unabhängig.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.tmx">

            <title>Zend_Translate_Adapter_Tmx</title>

            <para>
                Der TMX Adapter ist der Adapter welcher am meisten benutzt wird wenn
                Kunden mehrere Systeme haben welche alle auf die gleichen Übersetzungen
                zugreifen, oder wenn die Übersetzungen Systemunabhängig sein muß.
                TMX ist ein XML Datei Format, welches als der kommende Industriestandard
                gehandelt wird. XML Dateien sind menschlich lesbar, aber das Lesen der
                Dateien ist nicht so schnell wie mit Gettext Dateien.
            </para>

            <para>
                Die meisten Mittel- und Großfirmen werden diesen Adapter benutzen.
                Die Dateien sind menschlich lesbar und systemunabhängig.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.qt">

            <title>Zend_Translate_Adapter_Qt</title>

            <para>
                Der Qt Adapter ist der Adapter ist für alle Kunden welche TS Dateien
                als Übersetzungs-Quelle haben, die von QtLinguist erstellt wurden.
                QT ist ein XML basiertes Format.
                XML Dateien sind menschlich lesbar, aber das Lesen der Dateien ist nicht
                so schnell wie mit Gettext Dateien.
            </para>

            <para>
                Einige "Big Player" haben Ihre Software auf dem QT Framework ausgebaut.
                Die Dateien sind menschlich lesbar und Betriebsystem unabhängig.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.xliff">

            <title>Zend_Translate_Adapter_Xliff</title>

            <para>
                Der XLIFF Adapter ist der Adapter der von den meisten Kunden benutzt
                wird die zwar XML Dateien haben wollen, aber keine Tools für TMX
                zur Verfügung haben.
                XLIFF ist ein XML Dateiformat, welches ähnlich zu TMX ist aber etwas
                einfacher im Aufbau. Es unterstützt aber nicht alle Möglichkeiten von
                TMX. XML Dateien sind menschlich lesbar, aber das Lesen der
                Dateien ist nicht so schnell wie mit Gettext Dateien.
            </para>

            <para>
                Die meisten Mittelständigen Unternehmen werden diesen Adapter benutzen.
                Die Dateien sind menschlich lesbar und systemunabhängig.
            </para>
        </sect3>

        <sect3 id="zend.translate.adapter.xmltm">

            <title>Zend_Translate_Adapter_XmlTm</title>

            <para>
                Der XmlTm Adapter ist ein Adapter der von Kunden verwendet wird, die das Layout selbst
                ändern wollen. XmlTm ist ein Format das es erlaubt den kompletten HTML Code in die
                Übersetzungsquelle zu inkludieren, sodas die Übersetzung mit dem Layout verknüpft ist.
                XmlTm ist ein XML Dateibasiertes Format, welches ähnlich wie XLIFF, aber nicht so
                einfach lesbar ist.
            </para>

            <para>
                Dieser Adapter sollte nur verwendet werden wenn bereits Quelldateien dieses Formats existieren.
                Die Dateien sind menschlich lesbar und systemunabhängig.
            </para>
        </sect3>

    </sect2>

    <sect2 id="zend.translate.adapter.selfwritten">

        <title>Selbst geschriebene Adapter integrieren</title>

        <para>
            <classname>Zend_Translate</classname> erlaubt es, selbst geschriebene Adapter Klassen zu integrieren und zu verwenden. Diese
            können wie die Standard Adapter Klassen, welche bereits in <classname>Zend_Translate</classname> inkludiert sind, verwendet
            werden.
        </para>

        <para>
            Jede Adapter Klasse die mit <classname>Zend_Translate</classname> verwendet werden soll muß eine Subklasse von
            <classname>Zend_Translate_Adapter</classname> sein. <classname>Zend_Translate_Adapter</classname> ist eine abstrakte Klasse welche bereits alles
            definiert was für eine Übersetzung notwendig ist. Was noch getan werden muß, ist die Definition des
            Lesers für die Übersetzungsdaten.
        </para>

        <para>
            Die Verwendung des Prefixes "Zend" sollte dem Zend_Framework vorbehalten sein. Wenn <classname>Zend_Translate</classname>
            mit einem eigenen Adapter erweitert wird, sollte er in etwa "Firma_Translate_Adapter_MeinFormat"
            heißen. Der folgende Code zeigt ein Beispiel davon, wie eine selbst geschriebene Adapter Klasse
            implmentiert werden sollte:
        </para>

        <programlisting role="php"><![CDATA[
try {
    $translate = new Zend_Translate('Firma_Translate_Adapter_MeinFormat',
                                    '/path/to/translate.xx',
                                    'en',
                                    array('meineoption' => 'myvalue'));
} catch (Exception $e) {
    // Datei nicht gefunden, keine Adapter Klasse...
    // Genereller Fehler
}
]]></programlisting>

    </sect2>

    <sect2 id="zend.translate.adapter.caching">

        <title>Alle Adapter verschnellern</title>

        <para>
            <classname>Zend_Translate</classname> erlaubt intern die Verwendung von <classname>Zend_Cache</classname> um das
            Laden von Übersetzungs Quellen zu verschnellern. Das kann sehr nützlich sein wenn viele
            Übersetzungs Quellen oder aufwändige Quellformate, wie XML basierte Dateien, verwendet werden.
        </para>

        <para>
            Um das Caching zu verwenden muß nur ein Cache Objekt an die <classname>Zend_Translate::setCache()</classname>
            Methode übergeben werden. Diese nimmt eine Instanz von <classname>Zend_Cache</classname> als einzigen
            Parameter. Auch wenn irgendein Adapter direkt verwendet wird kann die <code>setCache()</code>
            Methode verwendet werden. Der Bequemlichkeit halber gibt es die statischen Methoden
            <code>getCache()</code>, <code>hasCache()</code>, <code>clearCache()</code> und
            <code>removeCache()</code>.
        </para>

        <programlisting role="php"><![CDATA[
$cache = Zend_Cache::factory('Core',
                             'File',
                             $frontendOptions,
                             $backendOptions);
Zend_Translate::setCache($cache);
$translate = new Zend_Translate('gettext',
                                '/path/to/translate.mo',
                                'en');
]]></programlisting>

        <note>
            <para>
                Der Cache muß <emphasis>vor</emphasis> seiner Verwendung oder Initiierung eines
                Adapter oder einer Instanz von <classname>Zend_Translate</classname> gesetzt werden. Andernfalls wird
                die Übersetzungs Quelle nicht gecached bis eine neue Quelle mit der
                <code>addTranslation()</code> Methode hinzugefügt wird.
            </para>
        </note>

    </sect2>

</sect1>
