L10N amb Python

Així com i18n (internacionalització) és el fet que una aplicació adapti coses com el format de la data, la moneda, el separador decimal, el mapa de caràcters, etc a la nostra cultura, l10n (localització) és la traducció de les cadenes de caràcters d’una aplicació a diverses llengües. Per portar a terme aquesta tasca les aplicacions fan servir un framework de GNU per a tal efecte anomenat gettext.

Gettext és un conjunt d’eines que ens permeten crear uns catàlegs de missatges que l’aplicació farà servir segons convingui.

Gettext amb Python

Python disposa d’un mòdul anomenat gettext que ens dóna accés a aquest framework. Per utilitzar-lo a les nostres aplicacions, simplement hem d’importar el mòdul i escriure les cadenes de text de la següent manera:

print _("Hello world!")

En efecte, passant les cadenes per la funció _() aconseguim que gettext les reconegui i les introdueixi dins el catàleg.

El cas més usual, és el qual el programa es comunica amb nosaltres amb el llenguatge que tenim definit per defecte, de manera que si el nostre locale és ca_ES o ca_AD el programa ens parli en català, en canvi si és en_EN o en_US ens parli en anglès, etc.

Per que funcioni així, hem d’inicialitzar gettext d’aquesta manera:

import gettext gettext.install('aplicacio')

Potser ens pot interessar canviar d’idioma en qualsevol moment. Com en el cas d’una aplicació per la web on l’usuari pot definir amb quin idioma vol veure els missatges del programa. Podem fer-ho de la manera següent:

import gettext gettext.install('aplicacio')

lang_en = gettext.translation('hostmyn', localedir, languages=['en'])
lang_ca = gettext.translation('hostmyn', localedir, languages=['ca'])
lang_es = gettext.translation('hostmyn', localedir, languages=['es'])

lang_en.install()

lang_ca.install()

Creant una nova llengua

* Ens posem al directori ./hostmyn/l10n

 $ cd l10n

* Obtenim hostmyn.pot

 $ pygettext -d hostmyn -E --no-location ../components/*.py -o hostmyn.pot

* Editem hostmyn.pot i a la capçalera emplenem com a mínim els camps Content-Type i Content-Transfer-Encoding canviant CHARSET i ENCODING per UTF-8:

"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n"

* Creem el directori de les traduccions per ex. ca per al català:

 $ mkdir ca

* Copiem l'arxiu hostmyn.pot al ca/hostmyn.pox. Aquest contindrà les traduccions.

 $ cp hostmyn.pot ca/hostmyn.pox

* Traduïm els missatges de l'arxiu ca/hostmyn.pox.

* Un cop tinguem la traducció en un estat estable, copiem l'arxiu de ca/hostmyn.pox a ca/hostmyn.po, serà l'arxiu de la traducció oficial.

 $ cp ca/hostmyn.pox ca/hostmyn.po

* Creem el directori 'ca/LC_MESSAGES' i generem el catàleg ca/LC_MESSAGES/hostmyn.mo a partir de l'arxiu ca/hostmyn.po amb la comanda msgfmt:

 $ msgfmt -o ca/LC_MESSAGES/hostmyn.mo ca/hostmyn.po

Actualitzant les traduccions ja fetes

* Creem de nou la plantilla de traducció, desant una copia de la plantilla anterior:

 $ mv hostmyn.pot hostmyn.pot.old
 $ pygettext -d hostmyn -E --no-location ../components/*.py -o hostmyn.pot
 $ mv hostmyn.pot hostmyn.pot.new

* Emplenem la capçalera de la nova plantilla, com a mínim els camps Content-Type i Content-Transfer-Encoding canviant CHARSET i ENCODING per UTF-8:

"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n"

* Utilitzem msgmerge per mesclar les dues plantilles:

 $ msgmerge -N -o hostmyn.pot hostmyn.pot.old hostmyn.pot.new

* Ara copiem la nova plantilla per cada llengua i la mesclem amb cada una de les traduccions ja fetes:

 $ mv ca/hostmyn.pox ca/hostmyn.pox.old
 $ cp hostmyn.pot ca/hostmyn.pox.new
 $ msgmerge -N -o ca/hostmyn.pox ca/hostmyn.pox.old ca/hostmyn.pox.new

* Amb tot això tindrem en el nou arxiu ca/hostmyn.pox les traduccions anteriors barrejades amb les noves cadenes encara per traduir. Les traduim i tan sols falta generar el catàleg i instal·lar-lo.

 $ cp ca/hostmyn.pox ca/hostmyn.po
 $ msgfmt -o ca/LC_MESSAGES/hostmyn.mo ca/hostmyn.po

L10N amb Python (last edited 2008-01-29 13:11:46 by AlbertManyà)