Diccionarios y gettext

Hernan M Foffani hfoffani en gmail.com
Dom Nov 19 15:15:12 CET 2006


On 11/18/06, Francisco Javier F. Serrador <serrador en tecknolabs.com> wrote:
>
> El sáb, 18-11-2006 a las 15:48 +0100, Hernan M Foffani escribió:
> > La solución dependerá mucho de tus necesidades.
> > La forma mas sencilla es aplicar el _(..) en el último momento,
> > justo antes de enviar el mensaje al usuario.  De esa forma te
> > evitas la doble traducción (que es lo que te está pasando).  El
> > problema que tiene es que no tendrás un archivo autogenerado
> > en forma completa.
> >
> > Una alternativa mejor es usar el ejemplo de la doc en
> > "6.28.3.4 Deferred translations" (porque ¿has leído la
> > documentación del gettext, no? ;-) y aplicarla a tu diccionario.
>
> Clrao que he leído la página que dices, lo que me pasa es que para este
> ejemplo concreto produce unos efectos laterales bastante perniciosos, de
> ahí mis dudas. Según el ejemplo:
>
> def N_(message): return message
>
> animals = [N_('mollusk'),
>            N_('albatross'),
>            N_('rat'),
>            N_('penguin'),
>            N_('python'),
>            ]
>
> # ...
> for a in animals:
>     print _(a)
>
> Ahora, si lo que tengo en vez de ser una lista es un diccionario, la llamada es
>  print _(a["clave"])
>
> y en el po me va a salir un
> msgid"clave"
> msgstr""
> Todo funciona bien hasta que el traductor lo traduce por algo distinto
> al msgid, produciendo un error.

eh?  la clave del po es lo tengas marcado como N_("..") en tu codigo.
en el for-loop la llamada a _(..) es directa, te saldrá
lo que tengas en a["clave"] pero traducido.


> Ahora bien, pygettext es una herramienta similar a la que usamos en gnome
> (intltool-update) para actualizar los po's? Quizás el problema está en intltool
> que debería ignorar los accesos a diccionario en python.

Nunca use gnome así que no se decirte cuál es la diferencia.
Lo que sí se es que pygettext te sirve para extraer de tus
fuentes las cadenas que supuestamente deberías traducir.
Ni siquiera es mandatorio que uses pygettext.  Es solo una
ayuda para crear el archivo inicial.  Luego, en tiempo de
ejecución, _(..) es una llamada a una funcion que dado un
string te devuelve otro segun la traducción especificada.

En tu caso deberías hacer algo como:

   def N_(message): return message
   CATEGORIES = {
       "default":  { "name": N_("Uncategorized") },
       "history" : { "name": N_("History")}
   }

y luego invocarlos como  _(CATEGORIES["default"]["name"])

Pero si lo haces así, en la herramienta de extracción
debes especificarle que busque las cadenas a traducir
como N_

-H.
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es