viernes, abril 01, 2011

Python y locale.setlocale

Quiero desplegar las fechas de mis páginas hechas con Turbogears2.0 en español.  Ahora tengo esta salida.

In [5]: datetime.datetime.now().strftime("%a %d de %B del %Y")
Out[5]: 'Fri 01 de April del 2011'

Reviso los locale que tengo instalados en mi servidor, en este caso un Ubuntu Lucid (10.04)

root@kirk:~# locale -a
C
POSIX
en_AG
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
root@kirk:~#

Si no está el locale que requiero, lo genero, en este caso es: es_MX.UTF-8

root@kirk:~# /usr/sbin/locale-gen es_MX.UTF-8
Generating locales...
es_MX.UTF-8... done
Generation complete.
root@kirk:~#
La generación de locales en Lucid difiere un poco de como lo hacía en Intrepid
Confirmo la generación del locale

root@kirk:~# locale -a
C
POSIX
en_AG
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
es_MX.utf8
root@kirk:~#

Bien, ya tengo un locale en español que puedo utilizar. Lo activo dentro de mi ambiente python y compruebo.

In [6]: import locale

In [7]: locale.setlocale(locale.LC_ALL, 'es_MX.utf8')
Out[7]: 'es_MX.utf8'

In [8]: datetime.datetime.now().strftime("%a %d de %B del %Y")
Out[8]: 'vie 01 de abril del 2011'


Algo realmente simple me entretuvo mucho tiempo, ya que obtenía errores como:

In [9]: locale.setlocale(locale.LC_ALL, 'es_MX')
---------------------------------------------------------------------------
Error Traceback (most recent call last)

/usr/lib/python2.6/locale.pyc in setlocale(category, locale)
511 # convert to string

512 locale = normalize(_build_localename(locale))
--> 513 return _setlocale(category, locale)
514
515 def resetlocale(category=LC_ALL):

Error: unsupported locale setting

... y encontré poca documentación al respecto, lo pongo aquí para futuras referencias.

No hay comentarios.: