wx Übersetzung klappt in py2exe-verpacktem Projekt nicht!

Plattformunabhängige GUIs mit wxWidgets.
Antworten
snodo
User
Beiträge: 2
Registriert: Dienstag 16. November 2010, 14:34

Folgendes Problem:
Wenn ich per wx.Locale die wx-Sprache ändere und dann einen Button z.B. mit ID_CLOSE verwende, wird er je nach der in wx gesetzten Sprache richtig übersetzt.
Sobald ich das Projekt nun mit py2exe verpacke ist der Button immer englisch!

Hier sind 2 Dateien, um mein Problem nachvollziehen zu können. Ich habe einfach mal den relevanten Code aus meinem Projekt extrahiert.

wx_sprache.pyw

Code: Alles auswählen

# coding: CP1252
import wx


class MainFrame(wx.Frame):
    def __init__(self):
        # Sprache setzen und auslesen
        wxLang = wx.Locale(wx.LANGUAGE_DEFAULT) # auf deutschem System wird korrekt auf deutsch geschaltet
        lang_string = wxLang.GetCanonicalName()
        
        # Frame und Panel anlegen
        wx.Frame.__init__(self, None, -1, u"Programmtitel (%s)" % lang_string)
        panel = wx.Panel(self, -1)
        
        # Ein von wx übersetzten Close-Button auf dem Panel erzeugen
        closeButton = wx.Button(panel, wx.ID_CLOSE)
        self.Bind(wx.EVT_BUTTON, self.closeWindow, closeButton)
    
    def closeWindow(self, event):
        self.Destroy()


class MyApp(wx.App):
    def OnInit(self):
        f = MainFrame()
        f.Show(True)
        return True


def main():
    app = MyApp(False)
    app.MainLoop()


if __name__ == "__main__":
    main()
py2exe_sprache.py

Code: Alles auswählen

# coding: CP1252

from distutils.core import setup
import py2exe   # py2exe
import sys      # wird zum Ergänzen der Parameter benötigt

# Übergabeparameter künstlich ergänzen
sys.argv.append("py2exe") # dass py2exe ueberhaupt gestartet wird
sys.argv.append("--dll-excludes=w9xpopen.exe,MSVCR71.dll") # w9xpopen.exe und MSVCR71.dll ausschliessen

## alle nötigen Parameter in einem Dict speichern
params = {}
params["zipfile"] = None
params["options"] = {
    "py2exe": {
        "compressed": 1,
        "optimize": 2,
        "bundle_files": 1
    }
}
params['windows'] = [{
        "script": "wx_sprache.pyw",
        "dest_base": "wx_sprache" # Dateiname
    }
]

# distutils-setup mit dem passenden Parameter-Dictionary ausführen
setup(**params)
Führt man nun die wx_sprache.pyw aus, ist der Button in Betriebssystemsprache dargestellt (bei Bedarf das wx.LANGUAGE_DEFAULT auf wx.LANGUAGE_GERMAN ändern).
Führt man die py2exe_sprache.py aus, so wird eine exe-Datei erstellt. Startet man diese exe, sieht man im Titel des Programms, dass nach wie vor auf deutsch umgestellt wurde, der Button ist aber trotzdem englisch!

Ich muss wohl "einfach" die entsprechenden *.mo Dateien aus "pythonpfad\Lib\site-packages\wx-2.6-msw-unicode\wx\locale\de\LC_MESSAGES" mitliefern. Nur WO kommen diese hin, dass es wieder funktioniert?
snodo
User
Beiträge: 2
Registriert: Dienstag 16. November 2010, 14:34

Hat sich soeben bereits erledigt ;)
Da habe ich stundenlang nach einer Lösung gesucht und jetzt bin ich während dem Tippen des Beitrags auf die Idee gekommen einfach mal nach "py2exe wxstd.mo" zu googlen - mit Erfolg.

Ich musste einfach nur VOR dem Setzen der Sprache mittels wx.Locale noch dem wx mitteilen, dass es auch unter einem weiteren Pfad nach *.mo Dateien suchen soll.
Das geht dann mit dieser Funktion:
wx.Locale_AddCatalogLookupPathPrefix("locale")
zum Suchen in dem Verzeichnis locale an aktueller Position.
Wenn nun die Übersetzungsdatei in locale\de\LC_MESSAGES\wxstd.mo liegt, klappts!
Antworten