"Internationalisierung" von Python-Programmen/Modu

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

"Internationalisierung" von Python-Programmen/Modu

Beitragvon lbuega » Montag 11. August 2003, 11:04

Hallo,
muß mein Programm sprachmäßig internationalisieren (d.h. User soll Sprache auswählen können).

In der Python Library Reference werden unter http://www.python.org/doc/current/lib/module-gettext.html entsprechende Funktionen hierfür vorgestellt. Dort ist die Rede von "binary .mo files", in denen wohl nach der entsprechenden Übersetzung des jeweiligen Wortes gesucht wird. Leider sagen mir diese "Files" überhaupt nichts. Ich vermute jedoch, dass ich mir für jede mögliche Sprachauswahl wohl eine dieser .mo-files mit den entsprechenden Übersetzungen basteln muß?!? Wie müssen diese aufgebaut sein???
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 11. August 2003, 11:39

Hmm, auf mo dateien stoest man oefter, aber wie du sesbst sagtest sind sie binaer, dh, das du keine mo dateien schreiben kannst.
Schau dir das an
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 11. August 2003, 15:03

Hi Ibuega,

die *.mo-Files kannst Du mit poEdit aus den mit pygettext erzeugten *.pot-Files erzeugen und bearbeiten.


Gruß

Dookie
Benutzeravatar
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Beitragvon lbuega » Dienstag 12. August 2003, 13:21

Genau das war die Info die ich benötigt habe; dass man mit pygettext.py *.pot -Files bekommt, diese nach dem Zufügen der Übersetzungen als *.po speichern muß und anschließend daraus mit msgfmt.py *.mo -Dateien generieren läßt...

Doch wie functioniert nun noch die die Einbindung in mein Programm: mit find(...) oder bindtextdomain(...) ?!? Wofür steht da "domain" und wie ändere ich dann noch die Sprachauswahl?!?
Fragen über Fragen... und ich schwitz schon ohne überhaupt was zu tun. Meine Unix-büchse hört sich auch an wie mein Staubsauger sonst nicht... und Sauna gibts inklusive...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 12. August 2003, 13:42

das steht sehr schön hier: http://www.python.org/doc/current/lib/node274.html und auf den folgenden Seiten.

Normalerweise Braucht die Sprache nicht eingestellt zu werden, gettext ist so schlau die im System eingestellte Sprache zu verwenden, zumindest unter Linux, habs auf Windows noch nicht getestet. ansonsten findest Du unter dem Link auch wie mann die Sprache umstellen kann.


Gruß

Dookie
Benutzeravatar
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Beitragvon lbuega » Dienstag 12. August 2003, 13:55

Danke für dei schnelle Antwort.
mmh, d.h. dass gettext immer nur die im System eingestellte Sprache nimmt? Aber ich muß in meinem Programm vom Anwender auswählen können, welche Sprache er nutzen möchte. Geht das dann so nicht?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 12. August 2003, 15:25

Gast

Beitragvon Gast » Mittwoch 13. August 2003, 14:05

ja, hab ich auch schon probiert, aber da gibts ne Fehlermeldung, dass translation() mehr braucht wie nur dieses eine Keyword (languages=...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 13. August 2003, 14:57

jo is wohl ein fehler in der Dokumentation, pydoc zeigt, daß translation noch die domain braucht, das sollte der Programmname ohne .py sein, unter dem dann auch die *.mo datei zu finden ist, also Beispiel für Test.py dann Test.mo und als Domain Test.


Gruß

Dookie
Benutzeravatar
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Beitragvon lbuega » Donnerstag 14. August 2003, 11:16

Danke Dookie, das hat wieder etwas mehr Verständnis gebracht. (was ist mit Deinem Bild passiert?)

Leider funktioniert es immer noch nicht. Es wird die Übersetzungsdatei für die Domäne (Programm/Übersetzungsdateinamen ohne Endung) nicht gefunden und das obwohl ich für "localedir" den kompletten Pfad angegeben habe unter der die .mo-Datei liegt.

am besten ich geb mal den quellcode an:

Code: Alles auswählen

import gettext
from Tkinter import *

#importieren der eigenen Module:
import wertbearb, menubefehl, design

#############################
# Für Übersetzungsfunktion
_ = gettext.gettext
gettext.find('g09_gui', '/users/gcadc30/PO/WORK/') ###brauch ich das überhaupt?
gettext.install('g09_gui', '/users/gcadc30/PO/WORK/') ###brauch ich das überhaupt?

#nachstehende Zeile bringt die Fehlermeldung:
lang2 = gettext.translation('g09_gui', '/users/gcadc30/PO/WORK/', languages=['en']) ###woher kennt er das "en" eigentlich?

lang2.install('g09_gui', '/users/gcadc30/PO/WORK/')
[...]

Außerdem verstehe ich noch nicht, wie dann unterschiedliche Sprachen in der mo.-Datei unterschieden werden wenn ich die Übersetzungsdatei genauso nennen muß wie das Programm. Dachte es gibt dann ne "english.mo" "german.mo" usw.?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 14. August 2003, 14:05

für jede Sprache gibts dann ein Verzeichnis mit den *.mo Dateien. Am Einfachsten legst Du ein Verzeichnis locale mit den Unterverzeichnissen de, en, fr, ... an. Dort hinein kommen die entsprechenden *.mo Dateien.
Hier mal ein kleines Hallo_Welt:

Code: Alles auswählen

import gettext
gettext.install('hello_world')
lang1 = gettext.translation('hello_world', 'locale', languages=['en'])
_ = lang1.gettext

print _("Hello World")


Gruß

Dookie
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 15. August 2003, 15:38

in die Verzeichnisse für die jeweilige Sprache kommt jeweils ein Verzeichnis "LC_MESSAGES" und da hinein die *.mo Dateien.
Benutzeravatar
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Beitragvon lbuega » Dienstag 19. August 2003, 08:18

Uff, endlich... mit Dookies Beispiel (zwei weiter oben) funktioniert es nun:

Der Verzeichnis-Aufbau muss dafür folgendermaßen sein:
locale/en/LC_MESSAGES/ProgrammName.mo - Wobei locale ein beliebiger Name sein darf (muß halt dann auch im Programm entsprechend angegeben weren); aber en (bzw. "fr", "de" etc.) und LC_MESSAGES muß so geschrieben sein (klein, bzw. groß)!

Die entsprechende mit msgfmt.py generierte *.mo Übersetzungsdatei muß dann den selben Namen haben wie die Datei (Programm/Modul) von dem die Übersetzung ist.
Hoffe dies hilft anderen etwas Zeit und Nerven zu sparen...

An dieser Stelle noch mal herzlichen Dank an Dookie! :D
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 19. August 2003, 13:31

noch eine kleine Anmerkung:

die *.mo kann einen Beliebigen Namen haben. Der Name vor dem .mo wird dann in den Gettext-Funktionen/Methoden als Domain bezeichnet. Für Consoleausgaben hat sich da messages.mo durchgesetzt, für Fehlermeldungen errors.mo ... Der Vorteil von einer Programmname.mo besteht darin, das nur diese eine Datei für die verschiedenen Sprachen übersetzt werden muss und mehrfach gebrauchte gleichlautende Texte nur einmal in der Datei stehen.


Gruß

Dookie
xturbo77
User
Beiträge: 39
Registriert: Montag 9. September 2002, 20:05
Kontaktdaten:

Beitragvon xturbo77 » Mittwoch 20. August 2003, 09:17

Habe alles nach dieser Anleitung gemacht, bekomme aber letzendlich einen Fehler:

Code: Alles auswählen

lang1 = gettext.translation('messages', 'lang', languages=['de'])
  File "C:\WebDev\python23\lib\gettext.py", line 416, in translation
    t = _translations.setdefault(key, class_(open(mofile, 'rb')))
  File "C:\WebDev\python23\lib\gettext.py", line 176, in __init__
    self._parse(fp)
  File "C:\WebDev\python23\lib\gettext.py", line 304, in _parse
    tmsg = unicode(tmsg, self._charset)
LookupError: unknown encoding: CHARSET


Weiß jemand Rat :?:

Wer ist online?

Mitglieder in diesem Forum: cedsoft