[Python] class-based gettext

Alessandro Dentella sandro a e-den.it
Ven 9 Gen 2009 09:50:25 CET


On Fri, Jan 09, 2009 at 12:24:02AM +0100, Pietro Battiston wrote:
> Il giorno gio, 08/01/2009 alle 23.38 +0100, Alessandro Dentella ha
> scritto:
> >   eseguo (senza cartella locale e senza file .po/.mo)::
> > 
> >      sandro a bluff:/tmp$ LANG='it_IT' python test.py
> >      Hello World
> > 
> >      sandro a bluff:/tmp$ LANG='fr_FR' python test.py
> >      Traceback (most recent call last):
> >        File "test.py", line 2, in <module>
> > 	 t = gettext.translation('example', 'locale')
> >        File "/usr/lib/python2.5/gettext.py", line 484, in translation
> > 	 raise IOError(ENOENT, 'No translation file found for domain', domain)
> >      IOError: [Errno 2] No translation file found for domain: 'example'
> > 
> > 
> >   La versione con 'bindtextdomain' invece funziona anche cambiando LANG.
> > 
> >   Cosa sbaglio?
> >   La traduzione non c'è neanche per it_IT...  
> > 
> >   suggerimenti?
> > 
> 
> Se la traduzione non c'è, le stringhe vengono mostrate in inglese, ma se

in realtà viene mostrato il msgid, che non è necessariamente in inglese né
un fallback

> la locale non è proprio configurata la libreria locale di python si
> arrabbia (penso che questo succederà con qualsiasi programma python,
> mentre un programma C userebbe "the fallback 'C' locale.").

Non è così. Se uso l'esempio con bindtextdomain:

   import gettext
   gettext.bindtextdomain('myapplication', 'locale')
   gettext.textdomain('myapplication')
   _ = gettext.gettext
   # ...
   print _('This is a translatable string.')

tutto funziona (mi ritorna il msgid) anche se manca il locale. La prima
versione, quella con class-based gettext non mi funziona ad esempio in un XP
fresco di instalazione tutto in italiano: lì non è impostata la variabile
LANG.

> "locale -a" ti dà la lista delle locale configurate nel sistema, ovvero
> che puoi utilizzare (a prescindere dall'avere o meno le stringhe di un
> dato programma); per installarne altre i pacchetti debian sono della
> forma language-pack-xy-base, es. language-pack-fr-base

ma io sto scrivendo un modulo che può essere usato nei più diversi sistemi,
non posso adottare una soluzione che appena uno ha un locale sballato mi da
errore... 

doctest
-------
Possibile che la soluzione *preferita* dalla documentazione sia di fatto la
più delicata? in particolare usando i doctest ottengo sempre l'errore sopra
riportato se uso la versione class-based, anche se impongo un LANG
supportato dal mio sistema (>>> os.environ['LANG'] = 'en_US.utf8')

babel
------

L'ultimo capitolo di questa battaglia per la localizzazione è babel. Lo uso
per la localizzazione di numeri e date e va egregiamente ma nuovamente vuole
assolutamente che sia impostato un locale e non passa ad un default
'c'. Anzi usando LANG=C da errore dicendo che non è riconosciuto.

Potrei bypassare il problema testando la variabile prima ed impostandola
ad un default ragionevole (en_US) ma mi accorgo che i sistemi windows (almeno
il mio XP virtuale) non usa queste variabili... come faccio a capire che
localizzazione è in uso?


sandro
*:-)



PS: la mailing list di babel sembra una stanza anaecoica...





-- 
Sandro Dentella  *:-)
http://sqlkit.argolinux.org        SQLkit home page - PyGTK/python/sqlalchemy


Maggiori informazioni sulla lista Python