Zum Erstellen des GNU gettext-message catalogs verwenden wir i18ndude.
i18ndude
-Installation¶i18ndude
lässt sich am einfachsten als eigenständiges Buildout-Projekt installieren um Versionskonflikte in den Abhängigkeiten zu vermeiden. Hierzu erhält die buildout.cfg
-Datei ausschließlich den Abschnitt scripts
:
[buildout]
parts =
scripts
eggs =
i18ndude
[scripts]
recipe = zc.recipe.egg
eggs = i18ndude
.pot
-Datei¶Die .pot
-Datei ist ein Template, aus dem die sprachspezifischen Übersetzungsdateien abgeleitet werden. Im Template tragen üblicherweise die msgid
-Zeilen Strings aus Page Templates (*.pt
) und Python-Dateien (*.py
), die msgstr
sind leer. Strings aus .xml
-Dateien werden über die passende Angabe i18n:domain
im Header erfasst.
Um Fehlermeldungen zu vermeiden erstellen wir zuerst die benötigten Verzeichnisse.
$ mkdir -p src/vs.registration/vs/registration/locales/de/LC_MESSAGES
$ cd /home/veit/i18ndude_buildout
$ ./bin/i18ndude rebuild-pot --pot /home/veit/myproject/src/vs.registration/vs/registration/locales/vs.registration.pot --create vs.registration /home/veit/myproject/src/vs.registration/vs/registration
Mit der Option rebuild-pot --pot
gibt man die Datei an, in die das neue Template geschrieben wird. Mit dem zweiten Parameter --create
gibt man zuerst die Domäne und danach das Verzeichnis an, das rekursiv nach relevanten Dateien durchsucht wird.
Weitere Optionen liefert der Aufruf von ./bin/i18ndude --help
.
.po
-Datei¶Die .po
-Dateien enthalten die Übersetzungen in den msgstr
-Zeilen. Diese werden für die Anzeige der Übersetzung verwendet. Mit dem folgenden Befehl werden sie erstellt und in src/vs.registration/vs/registration/locales/de/LC_MESSAGES/
abgelegt. Um Fehlermeldungen zu vermeiden erstellen wir zuerst eine leere .po
-Datei.
$ touch src/vs.registration/vs/registration/locales/de/LC_MESSAGES/vs.registration.po
$ ./bin/i18ndude sync --pot src/vs.registration/vs/registration/locales/vs.registration.pot src/vs.registration/vs/registration/locales/de/LC_MESSAGES/vs.registration.po
Der Befehl liefert beim ersten Durchlauf eine Rückmeldung wie z.B. diese:
src/vs.registration/vs/registration/locales/de/LC_MESSAGES/vs.registration.po: 31 added, 0 removed
Sollte eine Fehlermeldung besagen, dass die Zieldatei nicht existiert, dann wurde womöglich der XML-Namespace i18n
nicht verwendet oder die Eigenschaft i18n:translate
nicht korrekt verwendet.
Anmerkung 1: Werden die Dateien erneut synchronisiert, werden auch die Kommentare verglichen. Dabei wird ein fuzzy
-Kommentar hinzugefügt sofern sich die msgid
geändert hat. Diese Angaben sollten dann überprüft werden.
Anmerkung 2: Kommen in einer msgid
URLs vor, die in Anführungszeichen ("
) gesetzt sind, so müssen diese escaped werden mit \
, also z.B. <a href=\"http://www.veit-schiele.de\">www.veit-schiele.de</a>
.
Um die Übersetzungen zu aktualisieren, etwa wenn sich die Zahl der Strings verändert hat, wird zunächst die .pot
-Datei wie oben beschrieben aktualisiert. Anschließend wird die deutsche Übersetzungsdatei mit diesem Befehl aktualisiert:
$ ./bin/i18ndude sync --pot src/vs.registration/vs/registration/locales/vs.registration.pot src/vs.registration/vs/registration/locales/de/LC_MESSAGES/vs.registration.po
Um nicht bei jeder Aktualisierung erneut die obigen Shell-Kommandos eingegeben werden müssen, kann auch ein Shell-Skript angelegt werden, z.B. rebuild.sh
mit folgendem Inhalt:
#!/usr/bin/env bash
./bin/i18ndude rebuild-pot --pot src/vs.policy/vs/policy/locales/vs.policy.pot --create "vs.policy" --merge src/vs.policy/vs/policy/locales/vs.policy-manual.pot src/vs.policy*
./bin/i18ndude rebuild-pot --pot src/vs.policy/vs/policy/locales/plone.pot --create "plone" --merge src/vs.policy/vs/policy/locales/plone-manual.pot src/vs.policy/vs/policy/profiles/
./bin/i18ndude sync --pot src/vs.policy/vs/policy/locales/vs.policy.pot src/vs.policy/vs/policy/locales/de/LC_MESSAGES/vs.policy.po
msgfmt --no-hash -o src/vs.policy/vs/policy/locales/de/LC_MESSAGES/vs.policy.mo src/vs.policy/vs/policy/locales/de/LC_MESSAGES/vs.policy.po
./bin/i18ndude sync --pot src/vs.policy/vs/policy/locales/plone.pot src/vs.policy/vs/policy/locales/de/LC_MESSAGES/plone.po
msgfmt --no-hash -o src/vs.policy/vs/policy/locales/de/LC_MESSAGES/plone.mo src/vs.policy/vs/policy/locales/de/LC_MESSAGES/plone.po
.po
-Dateien¶i18ndude
sortiert die Übersetzungen alphabetisch nach der msgid
. Bei umfangreichen Übersetzungen, die sich bezüglich der Anzahl der Strings nicht mehr ändern, kann es sinnvoll sein diese nach der Herkunftsdatei zu sortieren, wie von gettext empfohlen. Fertige .po
-Dateien lassen sich mit gettext
entsprechend bearbeiten, das Paket stellt hierfür den Befehl msgcat
und den Parameter --sort-by-file
zur Verfügung. Siehe die Dokumentation von GNU gettext.