Herbaer::Translate::MySQLLookup


Zweck

Ein Webdienst zur Übersetzung kostet Zeit und Geld. Übersetzungen speichere ich in einer MySQL-Datenbank, um Zeit und Geld zu sparen.

Die Datenbank

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.

Normale Übersetzung

                   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.

Neuübersetzung ohne Zwischendatenbank

                   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.

Neuübersetzung mit Zwischendatenbank

                   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.

Funktionen

$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->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.

$translator->DESTROY ()

Der Destruktor schließt die Verbindung zur Datenbank.