Seite 1 von 2

getdefaultlocale() OS X

Verfasst: Sonntag 20. September 2009, 12:48
von Shining-Blue
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

Verfasst: Sonntag 20. September 2009, 12:54
von 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.

Verfasst: Sonntag 20. September 2009, 13:29
von Shining-Blue
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?

Verfasst: Sonntag 20. September 2009, 14:08
von Shining-Blue
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

Verfasst: Sonntag 20. September 2009, 14:23
von Shining-Blue
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

Verfasst: Sonntag 20. September 2009, 14:56
von sma
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

Verfasst: Sonntag 20. September 2009, 16:40
von Darii
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']
''

Verfasst: Sonntag 20. September 2009, 19:13
von Shining-Blue
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

Verfasst: Sonntag 20. September 2009, 22:37
von Darii
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).

Verfasst: Sonntag 20. September 2009, 23:57
von Shining-Blue
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

Verfasst: Montag 21. September 2009, 08:50
von Shining-Blue
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

Verfasst: Montag 21. September 2009, 10:17
von 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 ...

Verfasst: Montag 21. September 2009, 11:53
von Shining-Blue
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.

Verfasst: Montag 21. September 2009, 12:05
von cofi
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.

Verfasst: Montag 21. September 2009, 12:27
von Leonidas
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.

Verfasst: Montag 21. September 2009, 12:34
von Shining-Blue
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

Verfasst: Montag 21. September 2009, 12:34
von cofi
Leonidas hat geschrieben:Nunja, Sourceforge bietet durchaus ViewVC.
Ah danke. In dem Zeichensalat hab ich uebersehen, dass es bei Sourceforge lagert :oops:

Verfasst: Montag 21. September 2009, 12:56
von Shining-Blue
ick wull du wat mit Zeichensalat :lol:

Verfasst: Montag 21. September 2009, 13:00
von cofi
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 ;)

Verfasst: Montag 21. September 2009, 13:39
von Shining-Blue
Na dann ist ja man gut, daß ich nicht noch Dressing drüber getippt habe :D