Domanda

Devo fare in modo che le impostazioni locali del sistema facciano diverse cose, in definitiva voglio tradurre la mia app usando gettext. Lo distribuirò su Linux e OSX, ma ho riscontrato problemi su OSX Snow Leopard:

$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'sv_SE.UTF-8'
>>> locale.getlocale()
('sv_SE', 'UTF8')

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'C'
>>> locale.getlocale()
(None, None)

Entrambi i sistemi utilizzano le lingue svedesi. Su Linux, la variabile di ambiente LANG è già impostata su " sv_SE.UTF-8 " ;. Se passo quella variabile a python su OSX ( LANG = " sv_SE.UTF-8 " python ), la localizzazione viene rilevata correttamente. Ma locale.getlocale () non dovrebbe essere in grado di recuperare la lingua del sistema operativo? Non voglio forzare gli utenti a impostare LANG , LC_ALL o qualsiasi variabile d'ambiente.

Output del comando locale :

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
È stato utile?

Soluzione

Dispari su OSX (Smow Leopard 10.6.1) che ottengo

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.  
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, '')
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

Modifica:

L'ho appena trovato nella mailing list apple python

Fondamentalmente dipende da cosa è impostato nel tuo ambiente in fase di esecuzione (uno di LANG, LANGUAGE, LC_ALL) Ho avuto LANG = en_GB.UTF-8 nel mio ambiente shell

Altri suggerimenti

Certamente un hack orribile, ma ho inserito questo:

import platform

# ...

# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
    import locale
    if locale.getlocale()[0] is None:
        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

in un primo momento in un programma di mine . Successivamente ho potuto eseguire il mio programma usando un ambiente di shell non modificato su tutti i sistemi operativi per me rilevanti (il mio programma ha individuato la lingua da utilizzare in seguito nella sua elaborazione comunque).

Sembra che tu possa cambiare le impostazioni locali cambiando la variabile di ambiente LC_ALL .

$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)    

$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

Da qui : prova ad aggiungere o modificare il ~ / .profile o ~ / .bash_profile per poter esportare correttamente le impostazioni locali quando si avvia una nuova sessione.

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8

Vecchia domanda, ma questo può aiutare gli altri: questo è un bug di Python che a partire da marzo 2016 è ancora irrisolto in Python 2 o 3: https://bugs.python.org/issue18378 .

Il riassunto è che Python assume localizzazioni simili a GNU e si oppone a divergenze (POSIXly correct) come quelle negli ambienti BSD (come OS X). E la locale UTF8 esiste in BSD, non in Linux, quindi il problema.

Per quanto riguarda le soluzioni o il debug: le variabili di ambiente locale possono essere impostate da Terminal.app (vedi Preferenze - Profili - Avanzate - Internazionale; allo stesso modo per iTerm o altro). Quindi si possono trovare le variabili di ambiente della locale impostate quando ci si trova in una finestra terminale, ma si possono trovare le variabili NON impostate quando si esegue un'applicazione in pacchetto.

Per alcuni casi (come Sphinx in Python 2.7 e 3.5 che muoiono in OS X a causa di " ValueError: impostazioni internazionali sconosciute: UTF-8 "), disabilitare la casella di controllo delle preferenze per impostare le variabili di ambiente della locale è la soluzione.

Ma ciò può causare problemi in altri programmi: se le impostazioni locali non sono impostate, bash 4.3 (da MacPorts) si lamenterà ad ogni richiesta con " warning: setlocale: LC_CTYPE: impossibile cambiare le impostazioni locali (): nessun file o Elenco " ...

Quindi, dato che il bug si trova in Python, la soluzione alternativa dovrebbe essere probabilmente eseguita nel programma Python (come nella risposta di @Jacob Oscarson) o nell'invocazione di Python (impostando le impostazioni locali su un valore adeguato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top