# Adapter für Zend_Translate

Zend_Translate 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 Übersetzungsquelldateien.

Adapter für Zend_Translate

Adapter | Beschreibung | Benutzung
--- | --- | ---
Array | Für PHP Arrays | Kleine Seiten; Einfachste Handhabung; nur für Programmierer
Csv | Für kommagetrennte (*.csv/*.txt) Dateien | Einfaches Textdatei Format; schnell; mögliche Probleme bei der Verwendung von Unicode Zeichen
Gettext | Für binäre Gettext (*.mo) Dateien | GNU Standard für Linux; Threadsicher; benötigt Tools für die Übersetzung
Ini | Für einfache INI (*.ini) Dateien | Einfaches Testdatei Format; schnell; mögliche Probleme mit Unicode Zeichen
Tbx | Für termbase exchange (*.tbx/*.xml) Dateien | Industriestandard für anwendungsübergreifende Fachbegriffe; XML Format
Tmx | Für TMX (*.tmx/*.xml) Dateien | Industriestandard für anwendungsübergreifende Übersetzungen; XML Format, menschenlesbar
Qt | Für qt Linguist (*.ts) Dateien | Plattformübergreifendes Anwendungs-Framework; XML Format, menschenlesbar
Xliff | Für XLIFF (*.xliff/*.xml) Dateien | Ein einfacheres Format als TMX aber vergleichbar; XML Format; menschenlesbar
XmlTm | Für xmltm (*.xml) Dateien | Industriestandard für XML basierende Übersetzungsspeicher; XML Format; menschenlesbar
Andere | *.sql | Verschiedene andere Adapter werden in Zukunft noch implementiert

## Wie man entscheidet welchen Adapter man benutzen soll

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

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. Zend_Translate ändert kein Encoding, welches in Quelldateien definiert ist: wenn nun eine Gettext-Quelle das Encoding ISO-8859-1 verwendet, werden die Strings auch in diesem Encoding zurückgegeben, ohne dass diese konvertiert werden. Es gibt nur eine Einschränkung:

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, dass das Encoding von XML Dateien zur Zeit auf die Encodings limitiert ist welche durch PHP unterstützt werden. Das sind UTF-8, ISO-8859-1 und US-ASCII.

### Zend_Translate_Adapter_Array

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

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.

### Zend_Translate_Adapter_Csv

Der CSV-Adapter ist der Adapter, der am einfachsten für Kunden zu benutzen ist. CSV-Dateien sind mit Standardtexteditoren lesbar, allerdings unterstützen diese Editoren oft keine UTF8 Zeichensätze.

Man sollte diesen Adapter nur benutzen, wenn der Kunde die Übersetzungen selbst durchführen will.

Es ist zu beachten, dass der CSV-Adapter Probleme hat, wenn die CSV-Dateien anders kodiert sind als die Gebietsschemaeinstellung 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 sich darüber im klaren sein, dass der CSV-Adapter wegen Einschränkungen durch PHP nicht unabhängig vom Gebietsschema ist.

### Zend_Translate_Adapter_Gettext

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 menschenlesbar, allerdings existieren einige kostenlose Freeware Tools (zum Beispiel, POEdit), welche sehr nützlich sind. Der Zend_Translate Gettext-Adapter ist nicht mit Hilfe von PHPs Gettext-Erweiterung realisiert worden. Der Gettext-Adapter kann also verwendet werden, selbst wenn PHPs Gettext-Erweiterung nicht verfügbar ist. Ausserdem ist der Adapter im Gegensatz zu PHPs Gettext-Erweiterung threadsicher.

Die meisten werden diesen Adapter benutzen. Mit den vorhandenen Tools ist eine professionelle Übersetzung sehr einfach. Aber Gettext-Dateien werden in einem machinenlesbaren Format gespeichert und sind nicht ohne Tools lesbar.

### Zend_Translate_Adapter_Ini

Der INI Adapter ist ein sehr einfacher Adapter, welcher sogar direkt von Kunden verwendet werden kann. INI Dateien sind von standardmäßigen Texteditoren lesbar, allerdings unterstützen manche Texteditoren keine UTF8 Zeichensätze.

Dieser Adapter sollte nur dann verwendet werden, wenn ein Kunde Übersetzungen selbst machen will. Verwenden Sie diesen Adapter nicht als generelle Übersetzungsquelle.

### Zend_Translate_Adapter_Tbx

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 Quell-Strings. Wenn dieser Adapter verwendet wird, muß sichergestellt werden, dass alle benötigten Quell-Strings übersetzt sind. TBX ist ein dateibasiertes und komplett neues XML Format. XML Dateien sind menschenlesbar, aber das Lesen der Dateien ist nicht so schnell wie mit Gettext-Dateien.

Dieser Adapter ist perfekt für Firmen, die bereits vorübersetzte Quelldateien verwenden. Die Dateien sind menschenlesbar und unabhängig vom Betriebsystem.

Rückschritt in PHP 5.3

Vor PHP 5.3 haben parse_ini_file() und parse_ini_string() nicht ASCII Zeichen in INI Optionsschlüsseln ohne Probleme behandelt. Aber beginnend mit PHP 5.3 werden derartige Schlüssel im zurückgegebenen Array von beiden Funktionen stillschweigend entfernt. Wenn man Schlüssel hatte die UTF-8 oder Latin-1 Zeichen verwenden, werden die eigenen Übersetzungen nicht mehr funktionieren, wenn der INI Adapter verwendet wird. Wenn das der Fall ist, wird empfohlen einen anderen Adapter zu verwenden.

### Zend_Translate_Adapter_Tmx

Der TMX-Adapter wird meistens benutzt, wenn Kunden mehrere Systeme haben, welche alle auf die gleichen Übersetzungen zugreifen oder wenn die Übersetzungen systemunabhängig sein müssen. TMX ist ein XML Dateiformat, welches als der kommende Industriestandard gehandelt wird. XML Dateien sind menschenlesbar, aber das Lesen der Dateien ist nicht so schnell wie mit Gettext-Dateien.

Die meisten mittleren Firmen und Großfirmen werden diesen Adapter benutzen. Die Dateien sind menschenlesbar und systemunabhängig.

### Zend_Translate_Adapter_Qt

Der Qt-Adapter ist der Adapter für alle Kunden, welche TS-Dateien als Übersetzungsquelle haben, die von QtLinguist erstellt wurden. QT ist ein XML basiertes Format. XML Dateien sind menschenlesbar, aber das Lesen der Dateien ist nicht so schnell wie mit Gettext-Dateien.

Einige "Big Player" haben Ihre Software auf dem QT Framework ausgebaut. Die Dateien sind menschenlesbar und betriebsystemunabhängig.

### Zend_Translate_Adapter_Xliff

Der XLIFF Adapter wird meistens von Kunden benutzt, 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 menschenlesbar, aber das Lesen der Dateien ist nicht so schnell wie mit Gettext-Dateien.

Die meisten Mittelständigen Unternehmen werden diesen Adapter benutzen. Die Dateien sind menschenlesbar und systemunabhängig.

### Zend_Translate_Adapter_XmlTm

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, so dass die Übersetzung mit dem Layout verknüpft ist. XmlTm ist ein XML Dateibasiertes Format, welches ähnlich wie XLIFF, aber nicht so einfach lesbar ist.

Dieser Adapter sollte nur verwendet werden, wenn bereits Quelldateien dieses Formats existieren. Die Dateien sind menschenlesbar und systemunabhängig.

## Selbst geschriebene Adapter integrieren

Zend_Translate erlaubt es, selbst geschriebene Adapterklassen zu integrieren und zu verwenden. Diese können wie die Standardadapterklassen verwendet werden, welche bereits in Zend_Translate enthalten sind.

Jede Adapter Klasse, die mit Zend_Translate verwendet werden soll, muß eine Subklasse von Zend_Translate_Adapter sein. Zend_Translate_Adapter ist eine abstrakte Klasse, welche bereits alles definiert, was für eine Übersetzung notwendig ist. Nun muß lediglich noch die Definition der Lesemethode für die Übersetzungsdaten geschrieben werden.

Die Verwendung des Prefixes "Zend" sollte dem Zend Framework vorbehalten sein. Wenn Zend_Translate mit einem eigenen Adapter erweitert wird, sollte er etwa "Firma_Translate_Adapter_MeinFormat" heißen. Der folgende Code zeigt ein Beispiel, wie eine selbst geschriebene Adapter Klasse implementiert werden sollte:

    try {
        $translate = new Zend_Translate(
            array(
                'adapter' => 'Firma_Translate_Adapter_MeinFormat',
                'content' => '/path/to/translate.xx',
                'locale'  => 'en',
                'meineoption' => 'myvalue'
            )
        );
    } catch (Exception $e) {
        // Datei nicht gefunden, keine Adapter Klasse...
        // Genereller Fehler
    }

## Alle Adapter beschleunigen

Zend_Translate erlaubt intern die Verwendung von Zend_Cache, um das Laden von Übersetzungsquellen zu beschleunigen. Das kann sehr nützlich sein, wenn viele Übersetzungsquellen oder aufwändige Quellformate wie XML basierte Dateien verwendet werden.

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

    $cache = Zend_Cache::factory('Core',
                                 'File',
                                 $frontendOptions,
                                 $backendOptions);
    Zend_Translate::setCache($cache);
    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/translate.mo',
            'locale'  => 'en'
        )
    );

    // um den Cache irgendwo später im Code zu löschen
    Zend_Translate::clearCache();

Der Cache muß vor Verwendung oder Initialisierung eines Adapters oder einer Instanz von Zend_Translate gesetzt werden. Andernfalls wird die Übersetzungsquelle nicht gecached, bis eine neue Quelle mit der Methode addTranslation() hinzugefügt wird.

Wenn der zugeordnete Cache Tags unterstützt, kann man einen eigenen Tag-String durch Verwendung der Option tag setzen. Das erlaubt es, nur den Cache von dieser einzelnen Instanz von Zend_Translate zu löschen. Wenn man diese Option nicht verwendet, wird das Standardtag Zend_Translate verwendet.

Bei Verwendung der Option tag muss man das verwendete Tag an clearCache() übergeben um anzugeben, welches Tag man löschen will.

    $cache = Zend_Cache::factory('Core',
                                 'File',
                                 $frontendOptions,
                                 $backendOptions);
    Zend_Translate::setCache($cache);
    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/translate.mo',
            'locale'  => 'en',
            'tag'     => 'MyTag'
        )
    );

    // irgendwo später im Code
    Zend_Translate::clearCache('MyTag');