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.
Tabelle 164. 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 |
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.
Anmerkung
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.
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.
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.
Anmerkung
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.
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.
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.
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.
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.
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.
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.
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.
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 }
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();
Anmerkung
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');