Erstellen einer Dateitypdefinition für PHP-Dateien

Vor einigen Tagen benötigte ein Kunde die Übersetzung von mehreren Hundert PHP-Dateien. Dieses Dateiformat wird vor allem für Websites, Online-Hilfen und ähnliche Texte verwendet. Für gewöhnlich besteht eine PHP-Datei aus sehr viel Code, wovon nur bestimmte Bereiche zu übersetzen sind. Aufgrund der großen Zahl an Dateien und der Gefahr, Code zu „zerstören“, sollte eine solche Arbeit nur in einer geschützten Umgebung, wie etwa einem modernen CAT-Tool erfolgen. Ich verwende SDL Trados Studio 2017.

Das Problem

In vielen CAT-Tools lassen sich PHP-Dateien nicht immer ohne weiteres einlesen, da der Aufbau sehr unterschiedlich sein kann. Kurz: Man muss dem Programm zunächst sagen, welche Bereiche zu übersetzen sind und welche nicht.

Die Lösung

Es musste eine eigene Dateitypdefinition geschrieben werden. In diesem Fall genügte zum Glück eine sehr einfache. Hier ein kleiner Auszug aus einer der Dateien:

$string['informationtext'] = 'Info text';
$string['pluginname'] = 'Explanation';
$string['pluginname_help'] = 'An explanation is not really a question type. It simply enables text to be displayed without requiring any answers, similar to a label on the course page.
The question text is displayed both during the attempt and on the review page. Any general feedback is displayed on the review page only.';

Zu übersetzen waren die mit $string eingeleiteten Texte zwischen den einfachen Anführungszeichen nach dem Gleichzeichen, also in unserem Auszug „Info text“, „Explanation“ sowie der komplette Text von „An explanation is…“ bis „review page only.“.

Um die neue Dateitypdefinition zu erstellen, muss in SDL Trados Studio 2017 über Datei > Optionen > Dateitypen das Dateitypenfenster aufgerufen werden. Hier auf „Neu…“ klicken. Es erscheint folgendes Fenster:

Erstellen einer Dateitypdefinition Abbildung 1

Hier kann je nach zu übersetzender Datei die passende Grundlage gewählt werden. Da es sich hier um eine PHP-Datei handelt, ist die Auswahl „Delimitierte Textdatei mit auf regulären Ausdrücken basierenden Begrenzern“ die richtige für uns. Zumindest habe ich diese gewählt, was sehr gut geklappt hat. Dann auf OK klicken.

Im nun erscheinenden Fenster, siehe unten, müssen im Feld „Dateityp-Name“ (so wird der Dateityp in der Dateitypliste angezeigt) und „Dateityp-Kennung“ (so wird der Name vom Programm bei der Erkennung von Dateien angezeigt) entsprechende Angaben gemacht werden.

Erstellen einer Dateitypdefinition Abbildung 2

WICHTIG: Auf keinen Fall darf vergessen werden, bei „Dateinamenerweiterungen (Wildcards)“ unsere Dateierweiterung, hier *.php, anzugeben, da SDL Trados Studio 2017 ansonsten unsere Dateien später nicht erkennt bzw. versucht, diese mit einem anderen Dateityp zu öffnen. Dann auf „Fertig stellen“ klicken.

Nun erscheint der eben erstellte Dateityp in der Dateitypliste und kann in der linken Baumstruktur ausgewählt werden. So weit so gut. Allerdings haben wir bis zu diesem Zeitpunkt noch nichts definiert. Der Dateityp ist im Prinzip noch leer. Wir gehen in dem Fenster zu unserem Dateityp und klicken diesen an. Es öffnet sich ein kleiner Verzeichnisbaum. Hier wählen wir „Dokumentstruktur“. In dem rechts erscheinenden Fenster müssen die „öffnenden“ und die „schließenden“ Muster angegeben werden. Das Programm möchte also wissen, wo der zu übersetzende Text anfängt und wo dieser aufhört. Unser öffnendes Muster besteht immer aus $string, einem variablen Text in einer eckigen Klammer, einem Leerzeichen, einem Gleichzeichen, wieder einem Leerzeichen und einem einfachen Anführungszeichen:

$string['informationtext'] = ‘
$string['pluginname'] = ‘
$string['pluginname_help'] = ‘
usw.

Wir müssen dem Programm somit beibringen, alles zwischen $ und dem dritten ‘ als öffnendes Muster zu erkennen. Beim schließenden Muster haben wir mehr Glück. Dieses besteht immer aus „’;“. Um das öffnende Muster entsprechend zu definieren, sind zwingend reguläre Ausdrücke (engl. regular expressions, kurz Regex) erforderlich. Ich habe mich in diesem Fall für folgende Lösung entschieden:

\$.*?\].*?’

Erklärung

Der Anfang unseres „öffnenden Musters“ ist durch $ markiert. Dieses Zeichen ist jedoch selbst bereits mit einer Funktion belegt. So bezeichnet es ein Zeilen- oder String-Ende. Damit es als genau das Zeichen, also ohne Funktion, erkannt wird, ist der Backslash nötig, daher „\$“.

Danach folgt bei uns stets „string“ und eine eckige klammer. Ein „.“ Ist ein beliebiges Zeichen, ein „*“ zeigt an, dass dieses beliebige Zeichen null oder öfter vorkommen kann. Da „öfter“ hier auch im Prinzip unendlich oft bedeuten kann, würden wir, wenn wir es dabei belassen würden, bis ans Ende der Datei gelangen. Da wir das nicht wollen, sagen wir dem Programm, dass es nur so lange beliebige Zeichen einbeziehen soll, bis ein bestimmtes Zeichen kommt. Hierzu verwenden wir ein „?“. Das gewünschte Zeichen, bis zu dem gesucht werden soll, ist die schließende eckige Klammer. Da auch diese eine Funktion hat, benötigen wir auch hier den Backslash. Somit sind wir jetzt bei „\$.*?\]“. Gleich haben wir es geschafft.

Es fehlen jetzt nur noch ein Leerzeichen, ein Gleichzeichen, noch ein Leerzeichen und ein einzelnes Anführungszeichen. Hierzu wenden wir die bereits bekannte Methode mit den beliebigen Zeichen an, die einbezogen werden sollen, bis ein bestimmtes Zeichen, hier das einfache Anführungszeichen, zum ersten Mal auftritt. Das ergibt: „.*?’“. Falls sich jemand fragt, warum wir nicht von Anfang an \$.*?\’ geschrieben haben: Das einfache Anführungszeichen kommt bis zum Text, der übersetzt werden soll, ganze dreimal vor. Mit \$.*?\’ würden wir genau zum ersten Anführungszeichen kommen. Es geht also leider nicht so einfach.

Zu beachten ist noch eine Besonderheit. Die Dateien enthalten mehrzeilige Bereiche. So auch in unseren obigen Textausschnitt, der mit $string['pluginname_help'] eingeleitet wird. Wer sich diese Datei zum Beispiel in Notepad++ ansieht, wird feststellen, dass die Zeilen durch CR LF, also einen Wagenrücklauf und Zeilenvorschub getrennt sind. Dies erkennt unser Programm noch nicht. Damit das klappt, muss nur noch ein kleines Häkchen bei dem Kontrollkästchen „Mehrzeilig“ gesetzt werden, siehe folgende Abbildung.

Erstellen einer Dateitypdefinition Abbildung 3

In unserem Fall fehlen jetzt nur noch einige Feinarbeiten, wie die Bestimmung von Inline-Tags, damit auch Variablen oder andere eingebettete Tags in der Übersetzungsumgebung geschützt dargestellt werden.

Noch ein Hinweis: Damit SDL Trados Studio 2017 beim Einlesen der Dateien auch wirklich den neuen Dateityp nimmt, muss dieser in der Dateitypenliste VOR (d. h. oberhalb) allen anderen Dateitypen stehen, die *.php-Dateien verarbeiten können.

Viel Spaß beim Ausprobieren.