2009-04-11 14 views
21

Ich schreibe gerade eine App in Python und muss dafür Lokalisierung bereitstellen.Einfachste Möglichkeit, Lokalisierungsdateien zu generieren

Ich kann Gettext und die damit mitgelieferten Utilities verwenden, um .po und .mo Dateien zu generieren. Aber das Bearbeiten der .po-Dateien für jede Sprache, eins nach dem anderen, scheint etwas mühsam. Dann erscheint das Erstellen von Verzeichnissen für jede Sprache und das Erzeugen der .mo-Dateien nacheinander wie Overkill. Das Endergebnis ist so etwas wie:

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

könnte ich falsch sein, aber es scheint, als gäbe es doch einen besseren Weg, dies zu tun. Hat jemand irgendwelche Werkzeuge, Tricks oder Allgemeinwissen, die ich noch nicht gefunden habe?

Vielen Dank im Voraus!

EDIT: Um ein wenig klarer zu sein, suche ich nach etwas, das den Prozess beschleunigt. da ist es schon ziemlich einfach. In .NET beispielsweise kann ich alle Zeichenfolgen generieren, die in eine Excel-Datei übersetzt werden müssen. Dann können Übersetzer die Excel-Datei ausfüllen und Spalten für jede Sprache hinzufügen. Dann kann ich xls2resx verwenden, um die Sprachressourcendateien zu generieren. Gibt es so etwas für gettext? Ich weiß, dass ich ein Skript schreiben konnte, um aus einem CSV zu erstellen und zu lesen und die Dateien zu generieren - ich hatte nur gehofft, dass da etwas schon gemacht ist.

Antwort

26

Ich habe gerade dies für ein Projekt getan arbeite ich an, für uns ist das Verfahren wie folgt aus:

Zuerst habe ich eine POTFILES.in-Datei, die eine Liste von Quelldateien enthält, um Übersetzung. Wir haben tatsächlich zwei Dateien (z. B. admin.in und user.in), da die Admin-Benutzeroberfläche nicht immer übersetzt werden muss. So können wir den Übersetzern nur die Datei senden, die die Zeichenfolgen enthält, die die Benutzer sehen.

Ausführen des folgenden Befehls eine POT Vorlage aus dem POTFILES.in erstellen:

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

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

Um die bereits übersetzte .po-Dateien zu aktualisieren und neue Saiten, um sie hinzuzufügen, führen:

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

Im obigen Beispiel I Fuzzy Matching deaktivieren, da unsere Strings ein Chaos sind und es hat mehr schaden als nützen . Ich habe auch Backup-Dateien deaktiviert, da hier alles in Subversion ist. Führen Sie den obigen Befehl für jede Sprache aus. In diesem Fall habe ich die dänische Übersetzung aktualisiert.

laufen msgfmt schließlich die .mo-Dateien aus den .po-Dateien zu erstellen:

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

Ofcourse, würden Sie nicht diese manuell jedes Mal ausgeführt werden soll, so einige Skripte erstellen (oder vorzugsweise eine oder mehrere Makefiles), dies für dich zu tun.

Beachten Sie, dass sich Ihr Verzeichnislayout etwas von meiner Situation unterscheidet, daher müssen Sie die Ausgabedateinamen/Pfade ein wenig anpassen, aber die Schritte sollten gleich sein.

4

Es entgeht mir, wie Sie eine echte Übersetzung erreichen möchten, ohne die .po-Dateien für jede Sprache zu bearbeiten? Zauber?

Edit (nach Kommentaren) - wie die Erzeugung der .po Dateien automatisieren:

Ich benutze Gettext nicht, sondern aus der wiki page es sieht aus wie Sie nur

verlangen

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

für jede Sprache wollen Sie unterstützen. Ich würde ein Skript generieren, das alle Sprachdateien generiert, sie den Übersetzern geben, und wenn Sie sie zurückbekommen, führen Sie msgfmt auf ihnen.

+0

Offensichtlich möchte ich, dass die .po-Dateien bearbeitet werden, aber sie einzeln zu öffnen, ist eine unglaubliche Zeitverschwendung. Gibt es keine Möglichkeit, ALLE Sprachen und Übersetzungen in einer Tabelle oder etwas anderem zu definieren, und dann die .po-Dateien erzeugen zu lassen? – landyman

3

Skripte verwenden. Angenommen, Ihr Quellcode befindet sich im Verzeichnis $ SRC, erstellen Sie also das Verzeichnis $ SRC/po für i18n-Dateien (pot, po, mo usw.). Dann erstellen Sie die Datei $ SRC/po/POTFILES.in, wo Sie den Pfad zu den Quellcode-Dateien mit gettext-Funktionsaufrufen angeben. Es kann wie folgt aussehen:

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

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

Für Master-Datei messages.pot Aktualisierung:

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

Für Änderungen aus der Verschmelzung messages.pot bis fr.po-Datei, zum Beispiel:

msgmerge -U fr.po messages.pot 

Um mo-Datei verwenden Sie den Befehl zu erzeugen:

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

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

Um den Prozess zu beschleunigen, legen Sie alle Befehle in die entsprechenden .sh-Dateien.

3

Sie können versuchen, Translate Toolkit für verschiedene Po-Datei-Konvertierungen (Po2csv zum Beispiel). Child projects Pootle ermöglicht die Verwaltung von Übersetzungen über das Internet.

2

Mein Vorschlag ist django-rosetta, die Ihnen eine webbasierte Schnittstelle zum Bearbeiten Ihrer Übersetzungen gibt. Django muss überhaupt nicht in Ihre App eingebunden werden, Sie verwenden es nur für eine Online-Bearbeitungsfunktion .PO.

Eine weitere interessante neue Übersetzungsseite, von der ich glaube, dass sie mit Django/Pinax erstellt wurde, ist Transifex, obwohl ich nicht sicher bin, ob sie die direkte Bearbeitung der .PO-Dateien erlaubt.

6

Sie können Transifex verwenden, die von einigen Python-Projekten (Django, Mercurial) verwendet wird. Es verfügt über einen webbasierten Editor und einen Befehlszeilenclient für die Automatisierung und unterstützt auch .NET, wenn dies hilfreich sein kann.

Haftungsausschluss: Ich bin der Transifex-Projektleiter.

+0

Transifex ist der richtige Weg! Wir verwenden es unter http://www.bugsense.com und wir können uns keine andere Möglichkeit vorstellen, die Lokalisierung zu verwalten – PanosJee

Verwandte Themen