Gettext initialisierung

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
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

Hallo Alle,
es funktioniert zwar momentan wie gewünscht aber ich verstehe nicht wieso und das gefällt mir nicht :D

Also ich habe in einem Tool zwei verschiedene Textarten:
- eine die in die jeweilige Sprache übersetzt werden soll
- eine die nur in deutsch oder englisch übersetzt werden soll

wenn ich jetzt meine erste Sprache initialisiere, wie schon häufiger gesehen funktioniert es nicht:

Code: Alles auswählen

text = gettext.translation(domain, path, languages= [language])
_ = text.ugettext
wenn ich es aber so initialisiere funktioniert es:

Code: Alles auswählen

text1 = gettext.translation(domain, path, languages= [language])
text1.install()
so und jetzt komm ich zu meinem Problem
wenn ich jetzt meine zweite Sprache initialisiere mach ich das so:

Code: Alles auswählen

text2 = gettext.translation(domain, path, languages= [language])
__ = text2.ugettext
und dann funktioniert auch alles wie gewollt, aber verständlichkeitshalber würde mich trotzdem intressieren warum mein oberstes Codebeispiel nicht funktioniert, jedoch mein Unterstes :K :K

Aufruf wie gewohnt:

Code: Alles auswählen

_('Text') #für Sprache 1
__('Text') #für Sprache 2
vielleicht kann mir da jemand weiterhelfen :D
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

wie es aussieht habe ich mich zu früh gefreut
ich habe nur ein paar neue Texte zu meinen .mo-Dateien hinzugefügt und diese in meinem Tool verwendet (sonst garnichts verändert)
und jetzt kommt der Fehler:
NameError: global name '__' is not defined

das versteh ich nicht :K :K


hat jemand eine Idee wie ich sonst eine zweite Textgruppe definieren kann ?? :?:
mit dem Parameter codeset habe ich es auch schon versucht aber funktioniert leider auch nicht...
ich würde mich wirklich über Hilfe freuen :)
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

ich hab das Problem schon gefunden:
ich muss __ global deklarieren, was eigentlich auch logisch ist ... :roll:

damit habe ich meine Frage oben schon selber beantwortet :D
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

TryToLearn hat geschrieben:ich hab das Problem schon gefunden:
ich muss __ global deklarieren, was eigentlich auch logisch ist ... :roll:
Vorausgesetzt du meinst du `global` Anweisung: Nein, ist es nicht.

`global` braucht man nur, wenn man dem Namen (`__` in dem Fall) einen neuen Wert zuweisen will. Die Fehlermeldung ist aber ein `NameError`, d.h. der Name ist gar nicht erst definiert. Die (einzige) Loesung dafuer ist, den Namen vor der benutzung zu definieren.
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

die Definition war aber vor dem Abschnitt wo der Fehler (bei der Benutzung) geworfen wurde

also die globale Definition hat meine Probleme gelöst
BlackJack

@TryToLearn: Das kann nicht sein. Wenn ein Name definiert wurde, dann kann es nach der Definition keinen `NameError` bei diesem Namen geben (wenn er zwischenzeitlich nicht gelöscht wurde), per Definition nicht. ;-)
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

hier mal ein kleines simples Beispiel wir haben warscheinlich aneinander vorbeigeredet ich habe natürlich nicht gesagt wo die Initialisierung stattfindet

Code: Alles auswählen

#!/usr/bin/env python

class Beispiel(object):
    def __init__ (self):
        x = 'hallo'
        print x
        
        self.methode()
        
    def methode(self):
        print x
        
if __name__ == '__main__':
    Beispiel()

Traceback (most recent call last):
  File "C:\Beispiel.py", line 14, in <module>
    Beispiel()
  File "C:\Beispiel.py", line 8, in __init__
    self.methode()
  File "C:\Beispiel.py", line 11, in methode
    print x
NameError: global name 'x' is not defined
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@TryToLearn: Wenn Namen über mehrere Methoden hinweg erreichbar sein sollen, dann müssen diese Namen auf dem Klassen-Exemplar (``self``) definiert werden. Das macht man üblicherweise in der ``__init__``-Methode der Klasse. Du machst es zwar an der richtigen Stelle, aber leider ohne das ``self``.

Im Übrigen ist das Grundlagenwissen, welches man sich mal mittels Tutorial aneignen sollte, bevor man sich an das Thema OOP in Python heranmacht. Ansonsten wird OOP für dich nur ein wildes Raten mit möglicherweise vielen Threads von dir auf diesem Niveau. Und ganz ehrlich: Kaum jemand hat Lust, Antworten auf diese Art von Fragen, wie sie ja überall im Netz in Grundlagen-Tutorials gefunden werden können, extra für dich nochmal nachzuerzählen.
Zuletzt geändert von snafu am Mittwoch 9. Juli 2014, 12:35, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist auch logisch! Der Name ``x`` wird in Zeile 5 *lokal* erstellt, also nur im Scope der ``__init__``-Methode! In der Methode ``methode`` gibt es den Namen gar nicht - ergo kann man über ihn auch nicht auf ein Objekt zugreifen.

Du suchst vermutlich Exemplar-Attribute; dazu müsstest Du jweils ein ``self.`` vor den Namen schreiben ;-)

Alternativ kann man Objekte natürlich auch als Parameter übergeben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

@snafu: das ist mir natürlich klar und ich habe auch Erfahrung in OOP-Programmierung
mein Problem war, dass ich wenn ich die install()-Methode verwende _ global definiert wird und das habe ich dann bei der Implementierung der zweiten Sprache nicht berücksichtigt
aber da ich es auch in anderen Klassen verwenden werde muss ich es global definieren
Antworten