[PYTHON] Erstellen Sie ein Übersetzungswerkzeug mit dem Translate Toolkit

Translate Toolkit Das Übersetzungs-Toolkit (http://toolkit.translatehouse.org/) besteht aus einer Reihe von Bibliotheken und Befehlszeilentools, die Sie bei Ihrer Übersetzungsarbeit unterstützen. Es wird unter der GPLv2-Lizenz vertrieben und kann von jedem frei verwendet werden. Der Entwickler ist Translate House, das in Python implementiert ist. Es unterstützt zwei Python-Systeme und wird ab Python 2.5 ab dem nächsten 1.11.0 nicht mehr unterstützt. Translate House entwickelt auch die Übersetzungsplattform Pootle, die auch dieses Übersetzungs-Toolkit verwendet (Doc-ja Adventskalender 2013 Tag 1). / naruoga / 20131201/1385838237), Tag 3 Die in eingeführte Übersetzung von LibreOffice erfolgt ebenfalls auf Pocket).

In diesem Artikel verwende ich die Translate Toolkit-Bibliothek, um ein einfaches Übersetzungstool zu erstellen. Insbesondere beschäftigen wir uns mit Tools, die die Bearbeitung von PO-Dateien automatisieren. Dies ist nützlich, wenn der Bearbeitungsprozess einfach ist, der Zielbereich jedoch sehr groß ist. In Bezug auf die mechanische Bearbeitung sind vorhandene Unix-basierte Tools wie sed ursprünglich gut darin, aber PO ist nicht zeilenorientiert, sodass es nicht mit Unix-basierten Tools kompatibel ist und nicht einfach sein kann. Verwenden wir nun das Translate Toolkit.

In diesem Artikel wird PO von GNU gettext als Nachrichtenkatalogformat angenommen, das Translate Toolkit ist jedoch nicht auf PO beschränkt. Es unterstützt verschiedene Formate wie XLIFF. Die Bestellung selbst wird im Artikel Tag 2 erläutert und hier nicht erwähnt.

Wie installiert man

$ pip install translate-toolkit

Wenn Ihr Betriebssystem ein Übersetzungs-Toolkit-Paket bereitstellt, können Sie es auch verwenden. Der Quellcode wird unter github verwaltet.

Fallstudie

Betrachten Sie beispielsweise das folgende Arbeitsbeispiel. "Drei Punkte, die als Suffixe zur ursprünglichen Nachricht hinzugefügt wurden (häufig in GUI-Teilen usw.), wurden durch einen Dreipunktleser ersetzt, der eine große Menge an Fuzzy verursachte. Die Korrektur selbst auf der Übersetzungsseite ist einfach, aber der Zielbereich ist riesig. Ich möchte es mechanisch verarbeiten. "

PO Beispiel

Das Folgende ist ein Auszug aus der zu bearbeitenden Bestellung. Stellen Sie sich vor, es gibt so viele Beispiele wie dieses, dass Sie sie nicht von Hand bearbeiten möchten. Einige künstliche Beschreibungen sind ebenfalls enthalten, um das Verständnis des Effekts zu erleichtern.

#Ziel aktualisieren
#, fuzzy
#| msgid "Open..."
msgid "Open…"
msgstr "öffnen..."

#Ziel aktualisieren
#In der Mitte der übersetzungsseitigen Periode gibt es einen Zeilenumbruch...
#, fuzzy
#| msgid "Save As..."
msgid "Save As…"
msgstr "speichern als."
".."

#Aus irgendeinem Grund ist er seit einiger Zeit führend. Kein Update erforderlich
msgid "Print…"
msgstr "Drucken…"

#Aus irgendeinem Grund möchte ich die Übersetzung ohne Suffix belassen. Lass nur Fuzzy fallen
#, fuzzy
#| msgid "Print Preview..."
msgid "Print Preview…"
msgstr "Druckvorschau"

#Aus irgendeinem Grund bleibt der Originaltext ein Punkt(Die Übersetzung folgt vorerst darauf)
msgid "Preference..."
msgstr "Aufbau..."

Was du machen willst

Der Übersetzer ersetzt auch die drei Punkte durch einen Dreipunktleser gemäß dem aktualisierten Originaltext. Die Bedingungen der Zielnachricht sind wie folgt.

Beispielskript

Dieses Skript liest PO von der Standardeingabe und schreibt das bearbeitete Ergebnis in die Standardausgabe.

# -*- coding: utf-8 -*-
import sys
from translate.storage.po import pofile

PREV_SUFFIX = '...'
NEW_SUFFIX = u'…'

for unit in pofile.parsefile(sys.stdin).units:
    prev_source = unit.prev_source
    new_source = unit.source
    if unit.isfuzzy() and \
       prev_source.endswith(PREV_SUFFIX) and \
       new_source.endswith(NEW_SUFFIX) and \
       prev_source.rstrip(PREV_SUFFIX) == new_source.rstrip(NEW_SUFFIX):
        if unit.target.endswith(PREV_SUFFIX):
            updated_target = unit.target.replace(PREV_SUFFIX, NEW_SUFFIX)
            unit.settarget(updated_target)
        unit.markfuzzy(False)
        unit.prev_source = None
    print unit

Verarbeitungsergebnis

Das Verarbeitungsergebnis der obigen Bestellung ist wie folgt. Können Sie sehen, dass die Fuzzy-Verarbeitung ohne Übermaß oder Mangel erfolgt und der Zeilenumbruch in der Mitte des Textes angemessen gehandhabt werden kann?

#Ziel aktualisieren
msgid "Open…"
msgstr "öffnen…"

#Ziel aktualisieren
#In der Mitte der übersetzungsseitigen Periode gibt es einen Zeilenumbruch...
msgid "Save As…"
msgstr "speichern als…"

#Aus irgendeinem Grund ist er seit einiger Zeit führend. Kein Update erforderlich
msgid "Print…"
msgstr "Drucken…"

#Aus irgendeinem Grund möchte ich die Übersetzung ohne Suffix belassen. Lass nur Fuzzy fallen
msgid "Print Preview…"
msgstr "Druckvorschau"

#Aus irgendeinem Grund bleibt der Originaltext ein Punkt(Die Übersetzung folgt vorerst darauf)
msgid "Preference..."
msgstr "Aufbau..."

Skriptbeschreibung

Insgesamt erscheinen die Wörter Quelle und Ziel häufig, aber dies sind Begriffe, die in der Übersetzungsgemeinschaft häufig verwendet werden. Quelltext und Zieltext bedeuten den Originaltext bzw. den übersetzten Text. Entspricht msgid und msgstr in PO.

PO-bezogene APIs werden durch Importieren des Moduls translate.storage.po verfügbar. Weitere Informationen zur API finden Sie in der API-Referenz (http://docs.translatehouse.org/projects/translate-toolkit/en/1.11.0-rc1/api/index.html).

Wenn Sie die Bestellung mit der Parsefile-Methode der Pofile-Klasse analysieren, befindet sich eine Reihe von Nachrichten in der Liste "Einheiten". Jede Nachricht, die ein Element der Liste ist, kann als Objekt der Pounit-Klasse betrieben werden. pounit bietet eine API für die Nachrichtenmanipulation, einschließlich msgid und msgid sowie früherer msgids, verschiedener Kommentare und Pluralformen durch gettext definierte Attribute. Sie können auf /manual/gettext.html#PO-Files zugreifen. Über die API von pounit können Sie Nachrichten bearbeiten, ohne an eine lästige physische Beschreibung von PO-Dateien gebunden zu sein.

Die 4 Zeilen von der ersten entsprechen den obigen 4 Bedingungen. Ich bearbeite eine Nachricht, die den Bedingungen entspricht.

Am Ende der for-Schleife druckt print jeden Pounit auf die Standardausgabe. pounit definiert die str- Methode, und Sie können sie als PO-Nachricht in einem angemessenen Format ausgeben, indem Sie sie einfach so drucken, wie sie ist.

Andere

Als ähnliche Arbeit kann sie auf verschiedene Zwecke angewendet werden, z. B. auf die mechanische Überprüfung von Tippfehlern und die Stapelkorrektur aufgrund einer Änderung des Übersetzungsstils. In anderen häufigen Fällen können Sie problemlos Tools erstellen, z. B. die Aktualisierungsdifferenz zwischen zwei Bestellungen und die Zusammenführung der Unterschiede zu einer.

Tatsächlich habe ich mit der japanischen Übersetzung des GNOME-Projekts geholfen, den Stil langer Notizen zu ändern (z. B. "Benutzer" in "Benutzer" zu ändern). Selbst als ich das tat, habe ich mit dem Translate Toolkit ein Bearbeitungswerkzeug erstellt und alles auf einmal verarbeitet. Die Anzahl der Bestellnachrichten im GNOME-Projekt wird in Bezug auf msgid auf ungefähr 100.000 geschätzt. Es konnte nicht manuell bearbeitet werden, und das Translate Toolkit hat wirklich geholfen.

Zusammenfassung

Dieses Mal habe ich nur einen kleinen Teil der Translate Toolkit-Bibliothek vorgestellt. Es gibt viele andere nützliche Funktionen. Neben der Bibliothek gibt es auch einsatzbereite Befehlszeilentools. Weitere Informationen finden Sie unter Verschiedene Dokumente, z. B. API-Referenz. Versuchen Sie, das Übersetzungs-Toolkit für Ihr tägliches Übersetzungsleben zu verwenden. Viel Spaß beim Übersetzen!

Morgen ist knok.

Recommended Posts

Erstellen Sie ein Übersetzungswerkzeug mit dem Translate Toolkit
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Erstellen Sie eine Homepage mit Django
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie eine neue CSV mit Pandas basierend auf der lokalen CSV
Messen Sie die Wichtigkeit von Features mit einem zufälligen Gesamtstrukturwerkzeug
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie eine Nachricht, die der Lokalisierung entspricht, mit einer Python-Übersetzungszeichenfolge
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie einen Poisson-Stepper mit numpy.random
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie mit Python + Qt (PySide) einen Farbwähler für das Farbrad.
Bereiten Sie eine verteilte Lasttestumgebung mit dem Python-Lasttest-Tool Locust vor
Übersetzen Sie die Untertitel im WebVTT-Format von Coursera mit der GCP Cloud Translation API
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Tweet die Wettervorhersage mit Bot
Erstellen Sie mit Python + PIL ein Dummy-Image.
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
Erstellen Sie mit dem Sympy-Modul ein Diagramm
Erstellen Sie eine GUI-App mit Tkinter of Python
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Erstellen Sie eine große Textdatei mit Shellscript
Erstellen Sie ein Sternensystem mit Blender 2.80-Skript
Erste Schritte mit dem Dokumentationstool Sphinx
VM mit YAML-Datei (KVM) erstellen
Erstellen Sie eine einfache Web-App mit Flasche
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Erstellen Sie mit NetworkX einen verbindenden nächsten Nachbarn
Erstellen Sie mit dem Python-Anforderungsmodul einen Datensatz mit Anhängen in KINTONE
Erstellen Sie einen Webdienst mit Docker + Flask
Erstellen Sie ein privates Repository mit AWS CodeArtifact
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Erstellen Sie ein teuflisches Bild mit Blenders Skript
Erstellen Sie eine Matrix mit PythonGUI (Textfeld)
Erstellen Sie ein Diagramm mit Rändern, die mit matplotlib entfernt wurden
Erstellen wir ein einfaches Empfangssystem mit dem serverlosen Python-Framework Chalice und Twilio
Verwenden Sie den Befehl [shell], um eine beliebige Datei zu komprimieren, um eine Datei zu erstellen und die Originaldatei zu löschen.
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Erstellen Sie eine saubere Datenbank zum Testen mit FastAPI und führen Sie Unittest of API mit pytest aus
Ein Modell, das die Gitarre mit fast.ai identifiziert
Erstellen Sie mit tkinter [Python] einen Rahmen mit transparentem Hintergrund.
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Tweet die Wettervorhersage mit Bot Teil 2
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
Finden Sie mit NumPy die Position über dem Schwellenwert
Erstellen Sie mit Minette für Python einen LINE BOT
Erstelle mit pygame2 eine neue Benutzeroberfläche!
Erstellen Sie eine PDF-Datei mit einer zufälligen Seitengröße
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Sie können auch mit Python problemlos eine GUI erstellen
Folgen Sie der AR-Markierung mit einem 2-Achsen-Servo
Erstellen Sie ein Bulletin Board mit Heroku, Flask, SQL Alchemy
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!