getdefaultlocale() OS X

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.
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Ich komme meinem Übersetzungsproblem laaaangsam näher, doch nun stellt sich mir eine unlösbare Frage.
Warum ist defaultlocal beim Mac immer None?
So kann doch gettext nie die richtige Sprache finden.

Code: Alles auswählen

>>> import locale
>>> print locale.getdefaultlocale()
(None, 'mac-roman')
Kann mir das mal bitte einer erklären und / oder sagen, wie ich eine Übersetzung mit gettext unter OS X realisiere?

LG SB
lunar

Verwende ".setlocale()" und ".getlocale()":

Code: Alles auswählen

import locale
locale.setlocale(locale.LC_ALL, '')
language_code, encoding = locale.getlocale()
So verwendet das gesamte Programm die richtigen Spracheinstellungen.
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Hey lunar,
entweder ich habe da etwas noch nicht und/oder falsch verstanden, oder beim Mac läuft das so nicht.
Zumindest sieht es bei mir so aus:

Code: Alles auswählen

claudy:~ claudia$ python
Python 2.6.2 (r262:71600, Apr 16 2009, 09:17:39) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> print locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, '')
'C'
>>> language_code, encoding = locale.getlocale()
>>> print  language_code
None
>>> print encoding
None
>>> 
(ich wurde von unserem Mac vertrieben und 'schleiche' mich nun über ssh rein - psst, nicht weitersagen ;-) )

Ist doch merchwürzig, oder?

LG SB

P.S.:

Code: Alles auswählen

claudy:~ claudia$ echo $LANG

claudy:~ claudia$ echo $USER
claudia
Oops, macht OS X das immer so und wo bekommte es dann seine Spracheinstellung her?
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Das ist ja sonderbar - erst wenn man in den Systemeinstellungen die Liste der Sprachen bearbeitet, wird die Enviromentvariable gesetzt und die Funktionen liefern auch Werte.

Code: Alles auswählen

>>> import locale
>>> print locale.getlocale() 
(None, None)
>>> locale.setlocale(locale.LC_ALL, '') 
'de_DE.UTF-8'
>>> print locale.getlocale() 
('de_DE', 'UTF8')
>>> 
Mal sehen wie es gleich in der App funktioniert

LG SB
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Super, jetzt funktioniert es wie ich es haben wollte und ich brauche die _ auch nur noch im Hauptscript.
Vielen Dank, das war ein riesen Schritt :!:

LG SB
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde sagen, die Funktion ist in Python 2.6 kaputt:

Python 2.5.1 (das von Apple):

Code: Alles auswählen

>>> locale.getdefaultlocale()
('de_DE', 'UTF8')
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'
Python 2.6.2 (von python.org):

Code: Alles auswählen

>>> locale.getdefaultlocale()
(None, 'mac-roman')
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'
>>> locale.getdefaultlocale()
(None, 'mac-roman')
Python 3.1 (von python.org):

Code: Alles auswählen

>>> locale.getdefaultlocale()
('de_DE', 'UTF8')
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'
Stefan
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Nichtsdestotrotz ist locale unter OSX verbuggt, was aber nicht an Python sondern den entsprechenden C-Funktionen des Unix-Subsystems von OSX liegt.

Code: Alles auswählen

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'
>>> locale.localeconv()['thousands_sep']
''
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Oh nein, bitte nicht auch noch einen Unterschied zwischen 2-5 und 2-6 :-(
Ich arbeite auf dem Mac mit 2.6 und zumindest als 'normales' Pythonprogramm funktioniert es sowohl per Terminalaufruf als auch aus Eclipse und über den Launcher.
Ich habe es gerade ausprobiert und die vorgeschlagene Lösung läuft unter beiden Versionen.
Nur ein Problem bleibt leider immer noch:
Wenn ich das Programm durch py2app jage, wird die Sprache wieder nicht erkannt.
Ich habe einmal mit

Code: Alles auswählen

		locale.setlocale( locale.LC_ALL, '' )
		self.MainFrame_statusbar.SetStatusText( str( locale.getlocale() ) )
die Werte an die Statuszeile geschickt und siehe da: None None :(

Das kann doch alles nicht Wahrstein - ich verzweifle langsam an dieser blöden Lokalisierung.
Ich hoffe auch hierfür hat noch jemand eine zündende Idee.

LG SB
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Ich verstehe dein Problem nicht, was hast du getan, damit es jetzt auch einmal funktioniert? Vermutlich verwendet py2app dann evtl eine andere Python-Version

Alternativ, wenn du das sowieso nur für den Mac machst (py2app) kommst du auch per

Code: Alles auswählen

from AppKit import NSLocale
print NSLocale.currentLocale().localeIdentifier()

(siehe NSLocale) an die aktuelle Sprache (aber nur, wenn du die Python-Version von Apple benutzt, alternativ musst du pyobjc noch nachinstallieren – wenn das geht, das weiß ich nicht).
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Darii hat geschrieben:Ich verstehe dein Problem nicht, was hast du getan, damit es jetzt auch einmal funktioniert? Vermutlich verwendet py2app dann evtl eine andere Python-Version
Nun, um das Problem zu lösen reichte es den Tip von lunar zu implementieren und was die Pythonversion betrifft, so bindet py2app das 2.6er Framework ein - das sollte also nicht das Problem sein.
Darii hat geschrieben: Alternativ, wenn du das sowieso nur für den Mac machst (py2app) kommst du auch per

Code: Alles auswählen

from AppKit import NSLocale
print NSLocale.currentLocale().localeIdentifier()

(siehe NSLocale) an die aktuelle Sprache (aber nur, wenn du die Python-Version von Apple benutzt, alternativ musst du pyobjc noch nachinstallieren – wenn das geht, das weiß ich nicht).
Das werde ich mir einmal näher ansehen, auch wenn das Programm eigentlich auf allen gängigen Plattformen laufen soll.

Danke für den Tip und LG SB
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Hallo Darii,

das mit dem AppKit will nun so überhaupt nicht funktionieren, sondern wirft nach dem 'Kompilieren' den Fehler
ImportError: No module named pkg_resources
Pyobjc habe ich für das Python 2.6 nachinstalliert, was ohne Probleme möglich war, nur das die PyDev-Umgebung in Eclipse natürlich alle Erweiterungen neu einlesen musste.

Wie ich gerade feststellen musste, funktioniert die Lösung über das Modul 'local' unter Windows (XP) überhaupt nicht, obgleich sowohl der Pfad zum Verzeichnis 'local' als auch Sprache und Kodierung erkannt werden.
Vieleicht könnte ja mal jemand den Code unter
cvs -d:pserver:anonymous@scaleit4bb.cvs.sourceforge.net:/cvsroot/scaleit4bb login
cvs -z3 -d:pserver:anonymous@scaleit4bb.cvs.sourceforge.net:/cvsroot/scaleit4bb co -P modulename
auschecken und nachschauen, was ich denn da falsch mache.
Ich kann mir nicht vorstellen, daß es so kompliziert sein soll Multilingual für mehrere Plattformen zu schreiben.

Vielen Dank & LG SB
lunar

Eine genauere Fehlerbeschreibung als "funktioniert nicht" wäre schon wünschenswert ;) Nett wäre es auch gewesen, wirklich das relevante CVS-Kommando zu posten und nicht nur einfach das von der Hilfe-Seite auf Sourceforge zu kopieren ;)

Ich werde mir Deinen Code heute Abend dennoch mal ansehen ...
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Sorry lunar, ich wollte nicht so flusig ruberkommen :-(

Mit "funktioniert nicht meinte ich schlicht die deutsche Übersetzung wird nicht angezeigt, obgleich der Languagecode richtig erkannt wird und auch das Verzeichnis 'local' an der richtigen Stelle gesucht wird.
Warum es nun unter Windows nicht so funktioniert wie unter Linux und Mac kann ich leider nicht genauer sagen.
Was das CVS betrifft bitte ich zu entschuldigen, daß die Angaben unvollständig sind.
Ich dachte die Angaben reichen um das Repositry zu checken, aber ich bin auch diesbezüglich absoluter Neuling.
Welche Angaben werden denn noch zusätzlich benötigt?

Bitte nicht schimpfen, bin halt blond, blauäugig und noch arg am lernen, dennmeine letzten Programmiererfahrungen stammen noch aus Zeiten wo OOP man gerade erfunden wurde und Dinge wie Internet und CVS noch unbekannt waren. :oops:

LG SB

P.S.: habe es gerade noch einmal probiert - mit
cvs -z3 -d:pserver:anonymous@scaleit4bb.cvs.sourceforge.net:/cvsroot/scaleit4bb co -P scaleit4bb
kann man das Repo problemlos checken.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Shining-Blue hat geschrieben:Bitte nicht schimpfen, bin halt blond, blauäugig und noch arg am lernen, dennmeine letzten Programmiererfahrungen stammen noch aus Zeiten wo OOP man gerade erfunden wurde und Dinge wie Internet und CVS noch unbekannt waren. :oops:
Wobei letzteres doch nun endlich mal sterben sollte. Wenn man denn unbedingt so etwas haben will, dann doch Subversion. Git und Mercurial lassen aber auch das schon meilenweit hinter sich.

Wie waere es denn wenn du den Code ueber paste.pocoo.org zugaenglich machst? Natuerlich nur fuer denn Fall, dass das nich allzu umfangreich ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cofi hat geschrieben:Wie waere es denn wenn du den Code ueber paste.pocoo.org zugaenglich machst? Natuerlich nur fuer denn Fall, dass das nich allzu umfangreich ist.
Nunja, Sourceforge bietet durchaus ViewVC.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Das wäre doch doppelt gemoppelt.
Auf der Projektseite kann man ja den Code über'browse CVS einsehen'.

Der gesamte für die Lokalisierung relevante Code befindet sich sowieso nur im Hauptskript und sieht folgendermassen aus:

Code: Alles auswählen

from MainFrame import MainFrame
import locale
import gettext
import os
import sys
import wx

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

class MainApp( wx.App ):
	def OnInit( self ):
		wx.InitAllImageHandlers()
		MainWindow = MainFrame( None, -1, "" )
		self.SetTopWindow( MainWindow )
		MainWindow.Show()
		return 1

# end of class MainApp

if __name__ == "__main__":

	# Localelize

	APPDIR = os.path.split( os.path.realpath( sys.argv[0] ) )[0]
	LOCALEDIR = os.path.join( APPDIR, "locale" )
	locale.setlocale( locale.LC_ALL, '' )
	language_code, encoding = locale.getlocale()
	gettext.bindtextdomain( 'ScaleIt4BB' )
	gettext.install( 'ScaleIt4BB', LOCALEDIR, encoding )

	ScaleIt4BB = MainApp( 0 )
	ScaleIt4BB.MainLoop()
Habe gerade eben festgestellt, dass durch mein unsachgemäßes Gewurschtel mit CVS der Code mit eingefügten Änderungen versehen war - ist nun aber wieder so wie es sein soll.

LG SB
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Leonidas hat geschrieben:Nunja, Sourceforge bietet durchaus ViewVC.
Ah danke. In dem Zeichensalat hab ich uebersehen, dass es bei Sourceforge lagert :oops:
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

ick wull du wat mit Zeichensalat :lol:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Shining-Blue hat geschrieben:ick wull du wat mit Zeichensalat :lol:
cvs -d:pserver:anonymous@scaleit4bb.cvs.sourceforge.net:/cvsroot/scaleit4bb82 login
cvs -z3 -d:pserver:anonymous@scaleit4bb.cvs.sourceforge.net:/cvsroot/scaleit4bb83 co -P modulename
Das ist fuer mich Zeichensalat ;)
Shining-Blue
User
Beiträge: 37
Registriert: Samstag 15. August 2009, 04:36

Na dann ist ja man gut, daß ich nicht noch Dressing drüber getippt habe :D
Antworten