LingPO Desk

Technische Details

Wie LingPO Desk mit PO-Katalogen arbeitet

LingPO Desk ist aus der Arbeit mit mehrsprachigen Lingui-Projekten entstanden. Im PO-basierten Workflow, für den die App entwickelt wurde, liegen die Übersetzungen jeder Locale in einem eigenen Katalog.

Die getrennten Kataloge passen zur Struktur solcher Projekte. Mit jeder zusätzlichen Sprache wird es jedoch aufwendiger, zusammengehörige Einträge Datei für Datei zu vergleichen. LingPO Desk führt sie deshalb in einer gemeinsamen Ansicht zusammen.

Kontext, Pluralformen und PO-Flags bleiben dabei erhalten. Auch Projekte, deren PO-Dateien nicht mit Lingui erzeugt wurden, lassen sich so bearbeiten, wenn sie die unterstützte Katalogstruktur verwenden.

Projektstruktur

Lingui-Kataloge als Ausgangspunkt

LingPO Desk ist auf einen Lingui-PO-Workflow mit locales/<locale>/messages.po ausgerichtet. In dieser Konfiguration erhält jede Locale einen eigenen Ordner mit ihrem Sprachkatalog:

Die Locale erkennt LingPO Desk am Ordnernamen. locales/de/messages.po wird dem deutschen Katalog zugeordnet, locales/fr/messages.po dem französischen und so weiter.

LingPO Desk sucht diese Struktur innerhalb des gewählten Projektordners und stellt die gefundenen Kataloge anschließend gemeinsam dar.

Projektordner
locales/
├── en/
│   └── messages.po
├── de/
│   └── messages.po
└── fr/
    └── messages.po

Ein Locale-Ordner, ein Sprachkatalog.

Lingui erlaubt unterschiedliche Katalogformate und Verzeichnisstrukturen. Der hier gezeigte PO-Aufbau ist der Workflow, für den LingPO Desk entwickelt wurde. Auch PO-basierte Projekte außerhalb von Lingui lassen sich mit LingPO Desk bearbeiten, sofern ihre Kataloge derselben unterstützten Struktur folgen.

LingPO Desk konzentriert sich bewusst auf locales/<locale>/messages.po und versucht nicht, beliebige PO-Dateien aus unterschiedlichsten Verzeichnissen automatisch zuzuordnen. So bleibt eindeutig, welcher Katalog zu welcher Locale gehört.

Werden für dieselbe Locale mehrere passende Kataloge gefunden, weist LingPO Desk darauf hin.

So ist von Anfang an klar, welche Sprachdateien tatsächlich Teil der aktuellen Ansicht sind.

Kataloge zusammenführen

Mehrere Kataloge, eine gemeinsame Ansicht

In diesem Workflow gibt es pro Locale einen eigenen PO-Katalog. Für die Dateiverwaltung ist diese Trennung sinnvoll. Beim Übersetzen und Prüfen ist dagegen oft entscheidend, dieselbe Nachricht über mehrere Locales hinweg zu sehen.

LingPO Desk dreht diese Perspektive für die Bearbeitung um. Die App gleicht zusammengehörige Einträge aus den einzelnen Dateien ab und verbindet sie zu gemeinsamen Tabellenzeilen. So stehen die Übersetzungen einer Nachricht direkt nebeneinander.

Für diese Zuordnung verwendet LingPO Desk msgid und – falls vorhanden – msgctxt.

Das ist wichtig, weil dieselbe msgid in einem Projekt mehrfach vorkommen kann, ohne dass es sich um denselben Eintrag handelt.

Zum Beispiel:

msgctxt "menu"
msgid "Open"
msgstr "Öffnen"

und:

msgctxt "dialog"
msgid "Open"
msgstr "Öffnen"

Beide Einträge verwenden Open als msgid. Durch den unterschiedlichen Kontext gehören sie jedoch zu verschiedenen Stellen im Projekt und müssen unabhängig voneinander behandelt werden.

LingPO Desk berücksichtigt diesen Unterschied beim Zusammenführen der Kataloge.

In der gemeinsamen Ansicht kann daraus beispielsweise Folgendes entstehen:

Von den Katalogen zur gemeinsamen Tabelle
Quelldateienlocales/
en/messages.po
msgctxt "menu"
msgid "Open"
msgstr "Open"
msgctxt "dialog"
msgid "Open"
msgstr "Open"
msgctxt "toolbar"
msgid "Save"
msgstr "Save"
de/messages.po
msgctxt "menu"
msgid "Open"
msgstr "Öffnen"
msgctxt "dialog"
msgid "Open"
msgstr "Öffnen"
msgctxt "toolbar"
msgid "Save"
msgstr "Speichern"
fr/messages.po
msgctxt "menu"
msgid "Open"
msgstr "Ouvrir"
msgctxt "dialog"
msgid "Open"
msgstr "Ouvrir"
msgctxt "toolbar"
msgid "Save"
msgstr "Enregistrer"
msgid + msgctxtbestimmen die Zeile

Gemeinsame Ansicht

IDKontextENDEFR
OpenmenuOpenÖffnenOuvrir
OpendialogOpenÖffnenOuvrir
SavetoolbarSaveSpeichernEnregistrer

Gleiche ID, anderer Kontext: „menu“ und „dialog“ bleiben getrennte Zeilen.

Jede Locale liefert eine eigene Übersetzung. Die Kombination aus msgid und msgctxt ordnet sie derselben Tabellenzeile zu.

Die gemeinsame Ansicht führt die entsprechenden Übersetzungseinträge aus mehreren Sprachkatalogen zusammen.

Fehlt ein Eintrag in einem Katalog, bleibt die entsprechende Zelle leer. Genau dadurch werden Unterschiede sichtbar, die beim Öffnen einzelner Dateien leicht übersehen werden.

Ein fehlender deutscher Wert steht direkt neben der vorhandenen englischen und französischen Übersetzung. Ein Eintrag, der nur in einer Sprache vorkommt, verschwindet nicht aus der Ansicht. Und gleiche Texte mit unterschiedlichem Kontext bleiben sauber voneinander getrennt.

Die Tabelle bildet damit nicht einfach den Inhalt einer einzelnen PO-Datei ab, sondern die Beziehung zwischen mehreren Sprachkatalogen.

Übersetzungszustände

Drei Zustände mit unterschiedlicher Bedeutung

Untranslated, Fuzzy und Changed wirken zunächst wie drei Statusangaben, beschreiben jedoch unterschiedliche Dinge.

Untranslated

Eine Übersetzung fehlt oder ist leer. Bei Pluraleinträgen gilt ein Eintrag auch dann als unvollständig, wenn keine Pluralform vorhanden ist oder mindestens eine vorhandene Form leer ist.

EnglishGerman
Save

Deutsche Übersetzung fehlt

Fuzzy

Der PO-Eintrag trägt das standardmäßige fuzzy-Flag. Dieses Flag stammt aus dem Katalog selbst und bleibt Teil des Eintrags.

#, fuzzy
msgid "Save"
msgstr "Speichern"

Changed

Der Inhalt oder die Flags wurden während der aktuellen Bearbeitung in LingPO Desk verändert.

Deutsch · aktuelle Bearbeitung
SichernSpeichern

Seit dem Laden geändert

Untranslated beschreibt den aktuellen Übersetzungsstand. Ein Eintrag ist vorhanden, aber für mindestens eine Sprache noch nicht vollständig übersetzt.

Fuzzy ist dagegen ein Zustand aus dem PO-Format selbst. Das Flag kann beispielsweise darauf hinweisen, dass eine Übersetzung überprüft werden sollte.

Changed gehört zur aktuellen Arbeit in LingPO Desk. Dieser Zustand zeigt, welche Inhalte seit dem Laden oder seit dem letzten Speichern verändert wurden.

Dadurch lassen sich unterschiedliche Aufgaben voneinander trennen. Wer nur fehlende Übersetzungen prüfen möchte, muss nicht gleichzeitig alle fuzzy-Einträge durchsuchen. Und wer gerade bearbeitete Inhalte kontrollieren möchte, kann sich gezielt auf die Änderungen der aktuellen Sitzung konzentrieren.

So bleiben Übersetzungsstand, PO-Status und aktuelle Änderungen klar voneinander getrennt.

Kontext und Pluralformen

PO-Einträge bestehen aus mehr als nur Text

Ein PO-Eintrag kann neben Ausgangstext und Übersetzung auch Kontext, Pluralformen und Flags enthalten.

LingPO Desk berücksichtigt diese Struktur bei der Darstellung und Bearbeitung.

Kontext

Ein einfacher Eintrag kann zum Beispiel so aussehen:

msgctxt "toolbar"
msgid "Save"
msgstr "Speichern"

msgid beschreibt den Ausgangseintrag, msgstr die Übersetzung und msgctxt den Kontext, in dem der Text verwendet wird.

Der Kontext kann entscheidend dafür sein, ob zwei Einträge mit demselben Ausgangstext tatsächlich zusammengehören.

Pluralformen

Pluralformen sind noch etwas strukturierter:

msgid "One file"
msgid_plural "%d files"
msgstr[0] "Eine Datei"
msgstr[1] "%d Dateien"

Hier besteht die Übersetzung nicht aus einem einzigen Wert. msgid_plural und die einzelnen msgstr[n]-Formen gehören gemeinsam zu einem Pluraleintrag.

LingPO Desk behandelt diese Formen deshalb als zusammengehörige Einheit und nicht wie voneinander unabhängige Texte.

Dasselbe gilt für Flags wie fuzzy. Sie bleiben dem jeweiligen Eintrag und der jeweiligen Locale zugeordnet.

So kann die App die Inhalte in einer Tabellenansicht vereinheitlichen, ohne die Eigenschaften des ursprünglichen PO-Formats zu verlieren.

Ein gemeinsamer Blick auf mehrere Sprachen

Der technische Kern von LingPO Desk ist das Zusammenspiel mehrerer Kataloge, nicht die isolierte Bearbeitung einer einzelnen PO-Datei.

Die App ordnet passende Einträge einander zu und zeigt Unterschiede zwischen den Katalogen in derselben Ansicht.

Dabei bleibt sichtbar,

  • welcher Text zu welchem Kontext gehört,
  • welche Übersetzungen fehlen,
  • welche Einträge als fuzzy markiert sind,
  • welche Einträge Pluralformen verwenden,
  • und welche Inhalte während der aktuellen Bearbeitung verändert wurden.

Wenn die Kataloge mehrerer Locales denselben Nachrichtenbestand enthalten sollen, sich im Laufe der Zeit aber auseinanderentwickeln, zeigt die gemeinsame Ansicht diese Unterschiede ohne einen Vergleich Datei für Datei.

Bewusst auf diesen Workflow konzentriert

LingPO Desk ist kein allgemeines Translation-Management-System und kein Editor für beliebige Lokalisierungsformate. Die App dient dazu, mehrere messages.po-Kataloge gemeinsam zu prüfen, Unterschiede zwischen Locales zu erkennen und Übersetzungen im Zusammenhang der anderen Sprachen zu bearbeiten.

Dieser Workflow ist aus der Arbeit mit Lingui entstanden, bleibt aber nicht auf Lingui beschränkt. Entscheidend ist die unterstützte Struktur der PO-Kataloge.

Statt möglichst viele Formate und Projektmodelle abzudecken, konzentriert sich LingPO Desk auf diesen konkreten Anwendungsfall.