pygettext - wo locale ???

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.
Antworten
DAlschbach
User
Beiträge: 8
Registriert: Freitag 6. Februar 2009, 12:08
Wohnort: Heidelberg

Hallo,

ich erstelle gerade mit pygettexz eine multilinguale SW-Version. Das hat auch alles funktioniert. Nur ein Problem gibt es noch. Ich habe den Text in einem Modul ersetzt und weiss jetzt nicht wo Python nach dem übersetzten .mo File sucht ? In dem Pfad des aufrufenden Files in locale jedenfalls nicht. Hat jemand dami Erfahrung ?

Das ist die Struktur:

Hier steht das ausführende File
D:\Software-CD\software-CD

Hier liegen die anderen .mo Files:
D:\Software-CD\software-CD\locale\en\LC_MESSAGES

Hier liegt das Modul:
D:\Software-CD\software-CD\plugins\ToolsCD



ciao
Dominik
B-Q-L
Dominik
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Es scheint keine gute Idee zu sein, noch pygettext zu verwenden: Zitat Pygettext manpage
pygettext is deprecated. The current version of xgettext supports many languages, including Python.
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Ich versuche mich ja auch gerade an der Lokalisierung meines Programmes und verfolge gerade diesen Ansatz

Code: Alles auswählen

# some imports

APPDIR = os.path.split( os.path.realpath( sys.argv[0] ) )[0]
LOCALEDIR = os.path.join( APPDIR, "locale" )

# some other code

if __name__ == "__main__":
	#    Plattform erkennen

	if platform.system() == 'Windows':
		system = 'win'
		locale.setlocale( locale.LC_ALL, '' )
		language_code, encoding = locale.getlocale()

	elif platform.system() == 'Darwin':
		system = 'mac'
		language_code = NSLocale.currentLocale().localeIdentifier()


	else:
		system = 'other'
		locale.setlocale( locale.LC_ALL, '' )
		language_code, encoding = locale.getlocale()

	# Localelize
	gettext.bindtextdomain( 'ScaleIt4BB', LOCALEDIR )
	gettext.install( 'ScaleIt4BB', LOCALEDIR, language_code, unicode )
Dies funktioniert unter Linux einwandfrei, unter OS X solange man es nicht versucht mit py2App (distutils) zu bundeln und unter Windows bisher leider überhaupt nicht, woran ich gerade rumtüftle.
Solltest Du vor mir Erfolg haben, zögere bitte nicht es hier mitzuteilen.
Mir scheint der ganze Komplex locale, gettext & Co ist alles andere als trivial :-(

LG SB
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mkallas hat geschrieben:Es scheint keine gute Idee zu sein, noch pygettext zu verwenden: Zitat Pygettext manpage
pygettext is deprecated. The current version of xgettext supports many languages, including Python.
Hallo!

Trotzdem -- pygettext funktioniert einwandfrei unter Linux und Windows und wird von mir täglich genutzt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Dominik!

In meiner aktuellen Webanwendung kann die Übersetzung dynamisch verwendet werden. Du hast zwar keine Webanwendung, aber ich denke mal, dass du vielleicht daran interessiert bist, wie ich die Übersetzungen in das Programm einschleuse.

Kleiner Auszug aus dem Modul, welches für die Übersetzung zuständig ist:

Code: Alles auswählen

import gettext
...

def get_translation_obj():
    """
    Gibt das für die aktuelle Sprache zuständige *gettext.translation*-Objekt
    zurück
    """
    
    current_language = get_current_language()
    if len(current_language) <= 2:
        languages = [current_language]
    else:
        languages = [current_language, current_language[:2]]
    
    return gettext.translation(
        LOCALEDOMAIN_TEMPLATES, localedir = LOCALEDIR, 
        languages = languages, fallback = True
        
    )
``get_current_language`` ist eine Funktion, die die eingestellte Sprache des Benutzers zurück gibt. Dies kann z.B. "de", oder "de_AT" sein. Oder natürlich auch "en_US" oder "en". Sie ist jetzt nicht wichtig. Wichtig ist nur, dass sie einen Text mit dem ISO-Kürzel für die gewünschte Sprache zurück gibt.

LOCALEDOMAIN_TEMPLATES ist einfach nur ein String, der die Anwendung eindeutig kennzeichnet.

LOCALEDIR ist wie bei dir der "locale"-Ordner.

Im Programm und in den HTML-Vorlagen verwende ich dann ``ugettext``.

Code: Alles auswählen

_ = get_translation_obj().ugettext
message = _(u"Achtung, fliegende Kokosnüsse...")
...
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten