Das Modul Herbaer::Translate::GoogleTranslate
(Datei GoogleTranslate.pm
) nutzt den Web-Dienst Google Translate zur Übersetzung.
Um das Netz und den Übersetzungsdienst nicht zu überlasten, kann eine Wartezeit zwischen zwei Requests zur Übersetzung eingestellt werden. Damit die Wartezeit nicht die gesamte lokale Verarbeitung blockiert, wird ein neuer Prozess (Kindprozess) gestartet, der über das Web kommuniziert.
Die Kommunikation des Hauptprozesses mit dem Kindprozess erfolgt über Pipes. Der Hauptprozess sendet zeilenweise „Übersetzungsbefehle” an den Kindprozess. Ein Übersetzungsbefehl hat den Aufbau tr:
. SRCTEXT
:SRCLANG
:TGTLANG
SRCTEXT
steht für den zu übersetzdenden Text in der Quellsprache, SRCLANG
für die Kennung der Quellsprache, TGTLANG
für die Kennung der Zielsprache. Der Kindprozess sendet als Antwort eine Zeile mit dem übersetzten Text. Das Zeilenende-Zeichen und der Doppelpunkt im Text werden in der Kommunikation zwischen den Prozessen „geschützt”, also durch andere Zeichenfolgen ersetzt. Dazu dienen die beiden Hilfsfunktionen _encode
und _decode
.
Im Hauptprozess schließt der Destructor (DESTROY
) die Pipes zum Kindprozess und wartet auf dessen Beendigung.
Ein kurzer zu übersetzender Text wird in der URL eines GET-Requests kodiert, ein längerer Text wird als Rumpf eines POST-Requests.
Die Antwort ist JSON-kodiert.
Der HTTP-Request erfolgt in der Funktion _translate
, die im Falle einer Verzögerung im Kindprozess, sonst im Hauptprozess aufgerufen wird.
Um Google Translate zu nutzen, ist ein Schlüssel (apikey) erforderlich. Er wird aus einer Textdatei (Beispiel secrets
) gelesen. Die Textdatei enthält eine Zeile
google.translate.apikey=mein_geheimer_google_api_schluessel
mein_geheimer_google_api_schluessel
ist ein Platzhalter für den wirklichen Schlüssel. In der Textdatei kann auch die Wartezeit zwischen zwei Übersetzungs-Requests in Mikrosekunden angegeben werden. Die folgende Zeile erzwingt eine halbe Sekunde Wartezeit zwischen zwei Requests:
google.translate.wait=500000
$translator = Herbaer::Translate::GoogleTranslate::new
($secrets, $debug)
Ergibt ein neues Übersetzer-Objekt. Diese Funktion wird normalerweise nicht direkt aufgerufen, sondern von Herbaer::Translate::new
(s. Translate.pm
(Quelltext)).
$secrets
ist der Dateipfad der Datei, die den Google-Anwendungsschlüssel enthält.
Wenn der Wert von $debug
logisch wahr ist, werden Meldungen nach STDERR ausgegeben.
$translator->translate
($text, $quellsprache, $zielsprache)
Ergibt die Übersetzung des Textes $text
aus der Sprache $quellsprache
in die Sprache $zielsprache
. ([BCP47] http://www.ietf.org/rfc/bcp/bcp47.txt
, [IETF RFC 3066] http://www.ietf.org/rfc/rfc3066.txt
)
In den Kennungen der Sprachen werden die Zeichen vom ersten „-”-Zeichen an entfernt. An die Kennung zh
wird -CN
angehängt.
Im übersetzten Text sind in asiatischen Sprachen die „Null-Leerzeichen” ein Problem. Sie zeigen dem Browser Stellen an, an denen ein Zeilenwechsel möglich ist. Aber ein „Null-Leerzeichen” unmittelbar bei einem anderen Leerzeichen ist nicht nötig und wird entfernt. An einigen Stellen zwischen lateinischen Buchstaben und asiatischen Satzzeichen werden „Null-Leerzeichen” eingefügt.
$translator->languages
($quellsprache)
Ergibt eine Liste (ARRAY-Ref) der Kennungen der Sprachen, in die Text aus der Sprache mit der Kennung $quellsprache
übersetzt werden kann. Der dazu nötige HTTP-Request erfolgt im Hauptprozess unabhängig von der Wartezeit zwischen zwei Übersetzungs-Requests.
translator_name
()google
.