22 Stimmen

Die einfachste Art, Lokalisierungsdateien zu erstellen

Ich schreibe gerade eine Anwendung in Python und muss sie lokalisieren.

Ich kann gettext und die dazugehörigen Dienstprogramme verwenden, um .po- und .mo-Dateien zu erzeugen. Aber die Bearbeitung der .po-Dateien für jede Sprache, eine nach der anderen, scheint etwas mühsam zu sein. Das Anlegen von Verzeichnissen für jede Sprache und das Erzeugen der .mo-Dateien, eine nach der anderen, scheint dann zu viel Aufwand zu sein. Das Endergebnis wäre etwa so:

/en_US/LC_MESSAGES/en_US.mo
/en_CA/LC_MESSAGES/en_CA.mo
etc.

Ich könnte mich irren, aber es muss doch eine bessere Lösung geben. Hat jemand irgendwelche Werkzeuge, Tricks oder allgemeines Wissen, das ich noch nicht gefunden habe?

Vielen Dank im Voraus!

EDIT: Um ein wenig klarer zu sein, ich bin auf der Suche nach etwas, das den Prozess beschleunigt. da es bereits ziemlich einfach ist. In .NET kann ich zum Beispiel alle zu übersetzenden Zeichenfolgen in eine Excel-Datei generieren. Die Übersetzer können dann die Excel-Datei ausfüllen und Spalten für jede Sprache hinzufügen. Dann kann ich xls2resx verwenden, um die Sprachressourcendateien zu erzeugen. Gibt es so etwas auch für gettext? Ich weiß, dass ich ein Skript schreiben könnte, um eine csv-Datei zu erstellen und einzulesen und die Dateien zu generieren - ich hatte nur gehofft, dass es bereits etwas gibt.

31voto

warp Punkte 1380

Ich habe dies gerade für ein Projekt getan, an dem ich arbeite. Für uns sieht der Prozess folgendermaßen aus:

Zunächst habe ich eine Datei POTFILES.in, die eine Liste der Quelldateien enthält, die übersetzt werden müssen. Wir haben eigentlich zwei Dateien (z. B. admin.in und user.in), da die Verwaltungsoberfläche nicht immer übersetzt werden muss. So können wir den Übersetzern nur die Datei mit den Zeichenfolgen schicken, die die Benutzer sehen.

Mit dem folgenden Befehl wird eine .pot-Vorlage aus der Datei POTFILES.in erstellt:

xgettext --files-from=POTFILES.in --directory=.. --output=messages.pot

Führen Sie den obigen Befehl im Verzeichnis po/ aus, das ein Unterverzeichnis Ihres Projekts sein und die Datei POTFILES.in enthalten sollte. Die .pot-Datei hat genau das gleiche Format wie eine .po-Datei, aber sie ist eine Vorlage, die keine Übersetzungen enthält. Sie erstellen eine neue Vorlage, wenn neue übersetzbare Zeichenfolgen zu Ihren Quelldateien hinzugefügt wurden.

Um die bereits übersetzten .po-Dateien zu aktualisieren und ihnen neue Zeichenfolgen hinzuzufügen, führen Sie aus:

msgmerge --update --no-fuzzy-matching --backup=off da.po messages.pot

Im obigen Beispiel habe ich den unscharfen Abgleich deaktiviert, da unsere Zeichenketten ein Durcheinander sind und es mehr schadet als nützt. Ich habe auch die Backup-Dateien deaktiviert, da hier alles in Subversion liegt. Führen Sie den obigen Befehl für jede Sprache aus, in diesem Fall habe ich die dänische Übersetzung aktualisiert.

Führen Sie schließlich msgfmt aus, um die .mo-Dateien aus den .po-Dateien zu erstellen:

msgfmt nl.po --output-file nl.mo

Natürlich möchten Sie dies nicht jedes Mal manuell ausführen, also erstellen Sie einige Skripte (oder vorzugsweise ein oder mehrere Makefiles), die dies für Sie erledigen.

Beachten Sie, dass sich Ihr Verzeichnislayout leicht von meiner Situation unterscheidet, so dass Sie die Ausgabedateinamen/-pfade etwas anpassen müssen, aber die Schritte sollten die gleichen sein.

7voto

glezos Punkte 119

Sie können verwenden Transifex die von zahlreichen Python-Projekten (Django, Mercurial) verwendet wird. Es hat einen webbasierten Editor und einen Kommandozeilen-Client für die Automatisierung und unterstützt auch .NET, falls das hilfreich sein sollte.

Haftungsausschluss: Ich bin der Leiter des Transifex-Projekts.

0 Stimmen

Transifex ist der richtige Weg! Wir verwenden es bei bugsense.com und wir können uns keine andere Möglichkeit vorstellen, die Lokalisierung zu verwalten.

5voto

lothar Punkte 19157

Es ist mir schleierhaft, wie Sie eine echte Übersetzung erreichen wollen, ohne die .po-Dateien für jede Sprache zu bearbeiten? Magie?

Bearbeiten (nach Kommentar) - wie kann man die Erstellung der .po Dateien:

Ich verwende Gettext nicht, aber aus dem Wiki-Seite Es sieht so aus, als müssten Sie nur

msginit --locale=xx --input=name.pot

für jede Sprache, die Sie unterstützen wollen. Ich würde ein Skript erstellen, das alle Sprachdateien generiert, sie an die Übersetzer weitergeben, und wenn Sie sie zurückbekommen, führen Sie msgfmt über sie.

0 Stimmen

Natürlich möchte ich, dass die .po-Dateien bearbeitet werden können, aber sie einzeln zu öffnen ist eine unglaubliche Zeitverschwendung. Gibt es nicht eine Möglichkeit, ALLE Sprachen und Übersetzungen in einer Tabelle oder ähnlichem zu definieren und dann die .po-Dateien zu generieren?

3voto

Sergey Stolyarov Punkte 2507

Skripte verwenden. Gehen Sie davon aus, dass sich Ihr Quellcode im Verzeichnis $SRC befindet, also erstellen Sie das Verzeichnis $SRC/po für i18n-Dateien (pot, po, mo usw.). Erstellen Sie dann die Datei $SRC/po/POTFILES.in, in der Sie den Pfad zu den Quellcodedateien mit gettext-Funktionsaufrufen angeben. Das kann wie folgt aussehen:

[encoding: UTF-8]
./main.cpp
./plugins/list.cpp

Nun können Sie die folgenden Befehle verwenden (im Verzeichnis $SRC):

Für die Aktualisierung von Meldungen aus der Stammdatei.pot:

intltool-update --pot --gettext-package=messages --verbose

Für das Zusammenführen von Änderungen aus der Datei messages.pot in die Datei fr.po, zum Beispiel:

msgmerge -U fr.po messages.pot

Zum Erzeugen der Datei mo verwenden Sie den Befehl:

msgmerge -o - fr.po messages.pot | msgfmt -c -o fr/LC_MESSAGES/programname.mo -

Natürlich muss das Verzeichnis fr/LC_MESSAGES/ vor diesem Aufruf erstellt werden, Sie können auch die bestehende Datei fr/LC_MESSAGES/programname.mo vor der Ausführung löschen

Um den Prozess zu beschleunigen, sollten Sie all diese Befehle in die entsprechenden .sh-Dateien einfügen, zum Beispiel.

3voto

maciejka Punkte 296

Sie können versuchen Toolkit übersetzen für verschiedene Konvertierungen von po-Dateien (z. B. po2csv). Untergeordnete Projekte Pootle ermöglicht die Verwaltung von Übersetzungen über das Internet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X