4.1 Mehrsprachige Python Skripte erstellen

Unser Wissens Forum zum Thema GIMP, Funktionen kurz und bündig erklärt
moderierter Bereich

4.1 Mehrsprachige Python Skripte erstellen

Beitragvon Hans » Sa 5. Mär 2011, 22:20

Beta Version

Wenn in dieser Dokumentation noch etwas unklar oder falsch ist, sagt mir bitte per PN Bescheid. Ich werde dann nacharbeiten.


Es ist immer wieder frustrierend, wenn Python Scripte ausschließlich in einer Sprache erstellt werden. Dabei ist es relativ einfach, dieses Erweiterung einzubauen. Hier wirst du erfahren, wie du deine Scripte internationalisieren kannst.

Grundsätzlich kann ein Script von jeder beliebigen Ausgangssprache in eine andere Sprache Übersetzt werden. Es ist aber üblich, dass in der Programmierung englische Texte gesetzt werden. Das eröffnet die Möglichkeit, das eine dritte Person dein Script in seine Landessprache übersetzen kann.

Fangen wir an. In Python ist die Bibliothek gettext vorhanden, welche im Bedarfsfall den programmierten Text in die Sprache des Anwenders übersetzt. Dieses wird durch die Umgebungsvariablen LANG, LANGUAGE und LC_MESSAGES gesteuert. Zusätzlich benötigen wir noch die Bibliotheken sys und os. Sys liefert Systembefehle (z. B. sys.exit(0)) und os allgemeine Befehle zum Betriebssystem. Mit os kann man auch zwischen Linux, Windows und MAC unterscheiden. Da wir es auch mit Windows zu tun haben, haben wir das Problem, dass uns Umgebungsvariablen nicht zur Verfügung stehen. Die Information steht irgendwo in der Registry. Die Bibliothek löst dieses Problem aber, so dass nicht für jedes System extra unterschieden werden muss.

Wir eröffnen ein Skript immer mit folgendem Code:

Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *
import gettext
import os
import sys
import locale

GAT_DIR = os.path.dirname(os.path.abspath(__file__))
GAT_LOC = ''
GAT_LANG = 'en'

s = locale.getdefaultlocale()
s = s[0]
if s.lower <> 'none':
  s = s.split('_')
  GAT_LANG = s[0]

if sys.platform.startswith('linux'):
  GAT_LOC = GAT_DIR + '/locale'
elif sys.platform.startswith('win'):
  GAT_LOC = GAT_DIR + r'\locale'
else: 
  sys.exit('Platform not supported')

# internationalziation i18n
trans = gettext.translation("gat_lines", GAT_LOC, [GAT_LANG], fallback=True)
trans.install()

  • #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    Diese beiden Zeilen geben den Interpreter unter Linux und den Zeichensatz des Skriptes an. In Linux wird mittlerweile fast durchgehend UTF8 verwendet
  • from gimpfu import *
    Diese Zeile stellt die Anbindung an GIMP her. Ohne diese Zeile kann kein GIMP Skript unter Python laufen
  • import gettext
    Hier wir die Bibliothek des Übersetzungstools eingebunden. Es stellt die Übersetzungsfunktion _() zur Verfügung
  • import os
    import sys
    import locale

    Hiermit werden Funktionen bereitgestellt um z. B. das Betriebssystem zu identifizieren. Dieses ist nötig, weil Windows nicht immer die Befehle von Linux versteht und umgekehrt. Die Bibliothek locale stellt Funktionen bereit, welche es ermöglichen die eingestellte Sprache des Anwenders zu ermitteln.
  • GAT_DIR = os.path.dirname(os.path.abspath(__file__))
    gat_locale = ''

    Die globale Variable __file__ enthält den Skriptnamen einschließlich des Pfades. os.abspath() sorgt dafür, dass der Pfadname komplett gefüllt angegeben ist. Würden wir diesen Befehl auslassen, könnte es sein, das wir nur den Dateinamen des Skriptes ohne Pfadangabe erhalten würden. os.dirname() wiederum entfernt den Namen der Scriptdatei so dass Speicherort des Skriptes extrahiert wird.

    Windows7 Anwender sollten nicht verwundert sein, dass bei genauerer Betrachtung hier unter Umständen andere Werte drin stehen, als man laut Explorer vermutet hätte. Das kommt daher, das Microsoft die Wichtigsten Verzeichnisse nur noch in englisch führt, dem User aber etwas vorgaukelt, damit es noch aussieht wie unter Windows XP. Wenn man will, ist das Etikettenschwindel. Diskussionen bitte an anderer Stelle.
  • GAT_DIR = os.path.dirname(os.path.abspath(__file__))
    GAT_LOC = ''
    GAT_LANG = 'en'

    GAT_DIR wird an dieser Stelle mit dem Verzeichnis vorbelegt, in welchem das Python Skript gespeichert ist.
  • s = locale.getdefaultlocale()
    s = s[0]
    if s.lower <> 'none':
    s = s.split('_')
    GAT_LANG = s[0]

    Dieser Codeblock liefert die Spracheinstellung des Users zurück. Mögliche werte sind de, en, fr, nl, .....
  • if sys.platform.startswith('linux'):
    GAT_LOC = GAT_DIR + '/locale'
    elif sys.platform.startswith('win'):
    GAT_LOC = GAT_DIR + r'\locale'
    else:
    sys.exit('Platform not supported')

    Dieser Codeblock unterscheidet die Systeme. In der Variablen GAT_LOC sollte nach Durchführung der Verzeichnispfad zu deinem Script plus '/locale' bzw. '\locale' bei Windows stehen.

Code: Alles auswählen
# internationalziation i18n
trans = gettext.translation("gat_lines", GAT_LOC, [GAT_LANG], fallback=True)
trans.install()

Hiermit wird der Übersetzungsmechanismus des Scriptes gestartet. Ab jetzt steht die Funktion _() zur Verfügung. In der Folge sind nun alle Strings welche übersetzt werden müssen an die Funktion _() übergeben. Beispiel aus """GIMP Atelier Tools: Scan Lines""" wird _("""GIMP Atelier Tools: Scan Lines"""). Die Option fallback=True sorgt dafür, dass wenn keine Übersetzungsdatei vorhanden ist, die Anzeige entsprechend der Programmierung genommen wird.

Nachdem das Skript abgeschlossen und gespeichert worden ist, öffnest du eine Konsole (LINUX xterm, konsole, WINDOWS startest du cmd). Wechsele in das Verzeichnis, wo dein Skript steht.

LINUX
rufe das Python Skript pygettext.py auf. Es liegt normalerweise im Pfad. pygettext,py --help gibt eine kleine Hilfe auf dem Bildschirm aus.


WINDOWS
das Skript pygettext.py findest du in deiner Pythoninstallation (z. B. C:\Program Files\Python) im Unterverzeichnis Tools\i18n. Um pygettext.py aufzurufen musst du den ganzen Pfad angeben.


Mit der Kommandozeile pygettext -o deinScript.pot deinScript.py werden alle Zeichenketten, welche an die Funktion _() übergeben werden extrahiert und in die neue Datei deinScript.pot geschrieben. Die Datei deinScript.pot hat einen bestimmten Aufbau. Eröffnet wird das Ganze durch einen Header. Es ist üblich, dass dieser mit allen Daten gefüllt wird. Für die Bearbeitung reicht ein normaler Editor wie vi, emacs oder notepad++. Verwendest du poedit, kannst du dir Mühe aber sparen. Lese folgende Zeilen bis zum Kapitel poedit
Code: Alles auswählen
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2011-03-05 22:19+CET\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"

Gefolgt wird der Header durch eine Übersetzungstabelle. Ich habe hier einmal zwei Einträge kopiert
Code: Alles auswählen
#: gat_lines.py:27 gat_lines.py:51
msgid "GIMP Atelier Tools: Scan Lines"
msgstr ""

#: gat_lines.py:52
msgid "creates scan lines"
msgstr ""

Die Zeile mit dem führenden Doppelkreuz ist nicht unbedingt notwendig. Sie verweist auf die Zeilennummern, in der die aufgefundene Zeichenkette im Quellcode gefunden wurde. Es folgt dann eine Zeile mit der Kennung msgid:gefolgt von der im Quellcode enthaltenen Zeichenkette, welche zu übersetzen ist. In die folgende Zeile mit msgstr: ist die Übersetzung einzutragen. Nachdem man mit dieser Arbeit fertig ist, bitte das Ganze mit der Endung .po speichern. Es geht nun wieder auf die Kommandozeile.

Mit dem Kommando msgfmt.py -o deinScript.mo deinScript.po wird alles in eine .mo Datei überführt. WINDOWS Anwender müssen hier wieder den vollen Pfad angeben (ist der gleiche Pfad wie beim Kommando pygettext.py).

poedit
Öffne das Programm poedit (Bei LINUX geht es am schnellsten über die Konsole, WINDOWS Anwender öffnen es über das Menü). Nun Wähle Datei / neuer Katalog aus .pot Datei markiere die .pot Datei und öffne sie. Es erfolgt folgender Bildschirm

Bild

Fülle den Bildschirm mit den Projektdaten. Pfade und Schlüsselwörter habe ich nicht gefüllt. das Ganze sieht dann etwa so aus

Bild

Wenn du dieses Fenster schließt, dann kommt ein Speicherdialog für eine .po Datei. Speichere die Datei mit dem gleichen Namen wir dein Pythonskript, jedoch mit der Endung .po Jetzt öffnet sich folgendes Fenster

Bild

Das Fenster bist drei geteilt. Unter 1 findest du die von pygettext.py gefundenen Textstellen, welche zu übersetzen sind. Aktiviere die Zeile, welche du übersetzen möchtest. Dann wird der programmierte Text in Fenster 2 angezeigt. In Fenster 3 trägst du nun deine Übersetzung ein.

nachdem du fertig bist, speicherst du die Datei ab. Bei richtiger Konfiguration von poedit (siehe Optionen, automatisches Erzuegen von .mo Datei) musst du nichts weiter machen

Jetzt muss deine Datei lediglich an die richtige Stelle schieben. Ich habe das Script hier so geschrieben, dass das Verzeichnis in dem die Pythondatei steht, folgender Dateibaum eingebaut ist: locale/de/LC_MESSAGES Dort ist der richtige Platz für die .mo Datei. Der Einfachheit halber speichere ich aber auch die .pot und .po Datei.

Zusammenfassung der Arbeitsschritte
  • Erstellen des Python Skriptes mit Anpassung für die Übersetzung
  • alle zu übersetzenden Zeichenketten an die _() übergeben
  • erstelle mit pygettext.py eine .pot Datei
  • eröffne mit poedit einen neuen Katalog und lese die Werte aus der .pot Datei
  • fülle die Projektseite aus
  • übersetze alle gefundenen Zeichenketten
  • speichere die Datei ab wobei die .mo erzeugt wird
  • kopiere die .mo Datei an die richtige Stelle

Hilfsprogramm nur für LINUX

Ich habe hier ein Script mit dem Namen buildgimppackage angehängt, welches dir beim Erstellen eines Packages behilflich sein wird. Entpacke anhängende Zip Datei nach /usr/bin und mache sie für jeden ausführbar chmod 755 /usr/bin/buildgimppackage. Ich muss wohl nicht erklären, dass man für diese Aktionen root - Rechte benötigt.

Hast du nun ein Python Skript und die Übersetzung(en) nach dieser Anleitung erstellt hast, wechselst du in das Verzeichnis deines Python Skripts. Als Beispiel nehme ich hier meine gat_lines.py Gebe folgenden Befehl ein:
Code: Alles auswählen
buildgimppackage /tmp/gat_lines.zip gat_lines


Das Ergebnis sollte dann in etwa so aussehen:
Code: Alles auswählen
[hans@chris plug-ins]$ buildgimppackage /tmp/gat_lines.zip gat_lines
updating: locale/de/LC_MESSAGES/gat_lines.mo (deflated 40%)
updating: locale/de/LC_MESSAGES/gat_lines.pot (deflated 50%)
updating: locale/de/LC_MESSAGES/gat_lines.po (deflated 52%)
updating: gat_lines.py (deflated 50%)


done




Wäre die Datei gat_lines.py nicht im aktuellen Verzeichnis gewesen, dann sieht das so aus:
Code: Alles auswählen
[hans@chris ~]$ buildgimppackage /tmp/gat_lines.zip gat_lines


***** wrong directory /home/hans *****





Quellennachweis:

poedit: http://www.poedit.net/download.php
Python von Peter Kaiser, Johannes Ernesti, Kpitel 15.3, Galileo Computing, ISBN 978-3-8362-1110-9
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Bild
Benutzeravatar
Hans
 
Beiträge: 2883
Registriert: So 27. Jun 2010, 12:56
Wohnort: Angeles City, PH

Zurück zu Wilber's Lexikon

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste