Ein Webdienst zur Übersetzung kostet Zeit und Geld. Übersetzungen speichere ich in einer MySQL-Datenbank, um Zeit und Geld zu sparen.
Die Datenbank umfasst zwei Tabellen: eine Tabelle für die Texte in einer Quellsprache (bisher nur Deutsch) und eine Tabelle für die übersetzten Texte. Das Skript MySQLLookup_setup
(Quelltext) richtet die Datenbank und die Zugangsdaten zur Datenbank ein.
Die Texte speichere ich als Binär-Daten ("BLOB") So vermeide ich Komplikationen mit Lokale-Einstellungen. (Um Texte in der Datenbank zu suchen, ist ein Index erforderlich. Textfelder implizieren eine alphabetische Sortierung. Wer nur einmal die Regeln für die Sortierung von Text in lateinischen Buchstaben mit Akzenten und einigen Sonderzeichen gelesen hat, der nimmt noch einen doppelten Esspresso, bevor chinesische Namen und japanische Zeichen einsortiert werden.)
Die Zugangsdaten zur Datenbank werden aus einer „Geheimnis-Datei” gelesen. Ein Beispiel für eine „Geheimnis-Datei” ist secrets
.
Dieses Übersetzungsmodul wird normalerweise mit anderen Modulen verknüpft. Ein vorgeschaltetes Modul sollte gewährleisten, dass die Funktionen mit sinnvollen Parameter-Werte aufgerufen werden.
Dieses Modul kann auch als „Lern-Zwischenspeicher” einem Übersetzer („Lerner”) vorgeschaltet werden. Die Methode finish
ruft dann für alle gespeicherten Übersetzungen die Methode learn
des „Lerners” auf und löscht die Inhalte der Datenbanktabellen. Das ist nützlich, wenn eine bereits übersetzte Datei neu übersetzt werden soll (zum Beispiel mit einem besseren „End”-Übersetzer). Die Verbindung dieses Moduls und eines Übersetzungs-Webdienstes mittels Herbaer::Translate::Learnchain
im Update-Modus würde für jeden Text den (langsamen und kostenpflichtigen) Webdienst aufrufen. Es ist besser, eine Instanz dieses Moduls und den Webdienst mittels Herbaer::Translate::Learnchain
im Normal-Modus zu verbinden und der Instanz dieses Moduls eine zweite Instanz als „Lerner” zuzuordnen, die die Übersetzungen persistent in einer Datenbank speichert. Die folgenden Abschnitte verdeutlichen die Möglichkeiten.
Learnchain "Meister" "Lehrling" Webdienst MySQLLookup(Haupt-Datenbank)
Learnchain leitet die Übersetzungsanfrage an den "Lehrling". Wenn der Lehrling keine Übersetzung weiß, fragt Learnchain den Meister. Der Lehrling speichert dann die Übersetzung des Meisters in der Haupt-Datenbank.
Learnchain(Update-Modus) "Meister" "Lehrling" Webdienst MySQLLookup(Haupt-Datenbank)
Learnchain leitet die Übersetzungsanfrage an den "Meister" und den "Lehrling". Wenn der Lehrling keine Übersetzung weiß oder der Meister eine andere Übersetzung liefert, speichert der Lehrling die Übersetzung des Meisters in der Haupt-Datenbank.
Learnchain "Meister" "Lehrling" Webdienst MySQLLookup(Zwischen-Datenbank) "Lerner" MySQLLookup(Haupt-Datenbank)
Der "Lehrling" ist hier mit einer zunächst leere Zwischen-Datenbank verbunden. Die Übersetzungsanfrage geht an Learnchain. Diese fragt den Lehrling. Wenn der Lehrling keine Antwort weiß, fragt Learnchain den "Meister". Der Lehrling speichert die Übersetzung des Meisters dann in der Zwischen-Datenbank. Am Ende überträgt der Lehrling die Datenbankeinträge von der Zwischen-Datenbank an den "Lerner", der die Übersetzungen in der Haupt-Datenbank speichert.
$translator = Herbaer::Translate::MySQLLookup
->new
($secrets
, $dbkennung
, $lerner
, $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 Pfad der „Geheimnis-Datei”. Diese Datei enthält den Datenbanknamen und die Login-Daten. Ein Beispiel ist secrets
. Die Daten stehen in Zeilen der Form
translate.mysql.DBKENNUNG
=DBNAME
mysql.DBNAME
.user=USER
mysql.DBNAME
.password=PASSWORD
In der Zeile
translate.mysql.DBKENNUNG
=DBNAME
in der „Geheimnis-Datei” steht der Platzhalter DBKENNUNG
für den Wert von $dbkennung
. Der Platzhalter DBNAME
steht für den Namen der Datenbank. Eine Änderung der „Geheimnis-Datei” genügt, um eine andere Übersetzungs-Datenbank zu benutzen.
Wenn der Wert des optionalen Parameters $lerner
die Kennung eines Übersetzers („Lerners”, s. Translate.pm
(Quelltext)) ist, ruft die Methode finish
für jede gelernte Übersetzung die Methode learn
des Lerners auf und löscht die Inhalte der Datenbank.
Ein logisch wahrer Wert des optionalen Parameters $debug
führt zu Meldungen nach STDERR.
Diese Funktion stellt die Verbindung zur Datenbank her und bereitet die nötigen Abfragen für die Methoden translate
und learn
vor.
$translator->translate
($text, $quellsprache, $zielsprache)
Sucht die Übersetzung des Textes $text
von der Sprache $quellsprache
in die Sprache $zielsprache
in der MySQL-Datenbank.
$translator->learn
($text, $quellsprache, $zielsprache, $uebersetzung)
Speichert die Übersetzung $uebersetzung
des Textes $text
aus der Sprache $quellsprache
in die Sprache $zielsprache
in der MySQL-Datenbank. Eine bereits gespeicherte Übersetzung wird ersetzt.
$translator->finish
()
Wenn der Parameter $lerner
der Methode new
die Kennung eines Übersetzers („Lerners”) ist, ruft diese Methode (finish
) für jede gelernte Übersetzung die Methode learn
der Lerners auf und löscht die in der Datenbank gespeicherten Übersetzungen.
translator_name
()Ergibt mysql_
. DBNAME
DBNAME
ist den Name der Datenbank, der unter dem Schlüssel translate.mysql_dbname
aus der „Geheimnis-Datei” gelesen wird. Wenn der Parameter $lerner
der Methode new
die Kennung eines Übersetzers („Lerners”) ist, wird ein Unterstrich und der Nahme des Lerners (Ergbnis der Methode translator_name
) angehängt.
DESTROY
()Der Destruktor schließt die Verbindung zur Datenbank.