Como Hacer Una Actividad Sugar

Internacionalizarse con Pootle

Introducción

El objetivo de Sugar Labs y One Laptop Per Child es educar a todos los niños del mundo, y no podemos hacer eso con Actividades que sólo están disponibles en un idioma. Es igualmente cierto que hacer versiones separadas de cada Actividad para cada idioma no va a funcionar, y esperar que los desarrolladores de Actividades hablen muchos idiomas no es realista. Necesitamos una manera para que los desarrolladores de Actividades se puedan concentrar en la creación de las Actividades y que los que pueden traducir hagan precisamente eso. Afortunadamente, esto es posible y la forma en que se hace es mediante el uso de gettext.

Obtener texto con gettext

Seguramente recuerdas que nuestro último ejemplo de código usó una importación extraña:

from gettext import gettext as _

  La función "_()" se usa en sentencias como esta:

        self.back.set_tooltip(_('Back'))

En aquel momento se explicó que esta función singular se utilizó para traducir la palabra "Back" (Volver) en otros idiomas, de modo que cuando alguien ve la descripción del botón "Back", verá el texto en su propio idioma. También se dijo que si no era posible traducir este texto, el usuario vería la palabra "Back", sin traducir. En este capítulo vamos a aprender más sobre cómo funciona esto y lo que tenemos que hacer para apoyar a los voluntarios que traducen las cadenas de texto a otros idiomas.

Lo primero que hay que aprender es la manera correcta de armar las cadenas de texto a traducir. Este es un problema cuando las cadenas de texto son frases reales que contienen información. Por ejemplo podemos escribir un mensaje de la siguiente manera:

    message = _("User ") + username + \
        _(" has joined the chat room.")
 

Esto podría funcionar, pero las cosas serían demasiado complicadas para el traductor. Tiene dos cadenas separadas para traducir y no hay pista de que aparecerán juntas. Es mucho mejor hacer esto:

    message = _("User %s has joined the chat room.") % \
        username

Si sabemos que ambas declaraciones producen la misma cadena resultante, es fácil ver por qué un traductor prefiere la segunda opción. Usa esta técnica siempre que necesites una frase que tenga alguna información que se deba insertar en ella. Tambiéne es bueno tratar de limitarse a un único código de formato (el %s) por frase. Si utilizas más de uno puedes causarle problemas al traductor.

Creando el pot

Asumiendo que cada cadena de texto que puede ser mostrada por nuestra Actividad se pasa a través "_()", el siguiente paso es generar un archivo pot. Puedes hacer esto ejecutando setup.py con una opción especial:

./setup.py genpot

Esto crea un directorio llamado po y pone un archivo ActivityName.pot en ese directorio. En el caso de nuestro ejemplo, el proyecto ActivityName, es ReadEtextsII. Este es el contenido de ese archivo:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the
# PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-01-06 18:31-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: activity/activity.info:2
msgid "Read ETexts II"
msgstr ""

#: toolbar.py:34
msgid "Back"
msgstr ""

#: toolbar.py:40
msgid "Forward"
msgstr ""

#: toolbar.py:115
msgid "Zoom out"
msgstr ""

#: toolbar.py:120
msgid "Zoom in"
msgstr ""

#: toolbar.py:130
msgid "Fullscreen"
msgstr ""

#: ReadEtextsActivity2.py:34
msgid "Edit"
msgstr ""

#: ReadEtextsActivity2.py:38
msgid "Read"
msgstr ""

#: ReadEtextsActivity2.py:46
msgid "View"
msgstr ""

Este archivo contiene una entrada para cada cadena de texto en nuestra Actividad (msgid) y un lugar para poner una traducción de esa cadena (msgstr). Copias de este archivo se harán en el servidor Pootle para cada idioma que desee, y las entradas msgstr serán rellenadas por traductores voluntarios.

Subiendo a Pootle

Antes que eso puede suceder, necesitamos subir nuestro archivo POT en Pootle. Lo primero que tenemos que hacer es colocar el nuevo directorio en nuestro repositorio de Git y subirlo (push) a Gitorious.  Debemos estar ya familiarizados con los comandos necesarios:

git add po
git commit -a -m "Add POT file"
git push

Luego necesitamos darle al usuario autoridad "pootle" para hacer "commit" en nuestro proyecto Git. Para hacerlo, hay que ir a git.sugarlabs.org, iniciar sesión, y encontrar la página del proyecto y haga clic en el enlace "mainline". En la nueva página deberás ver esto:

 

 

Haz clic en el enlace Add committer y escribe el nombre pootle en el formulario al que te lleva. Cuando regreses a esta página pootle aparecerá listado bajo Committers.

El siguiente paso es ir al sitio web http://bugs.sugarlabs.org y registrarte para obtener un identificador de usuario. Con este usuario puedes abrir un "ticket" como este:

El campo Component debe ser ingresado como "localization" y el campo Type debe ser "task".

Lo creas o no, esto es todo lo que necesitas hacer para que tu actividad pueda ser traducida.

No prestes atención al hombre detrás de la cortina

Después de esto todavía debes hacer algunas cosas para obtener traducciones de Pootle en tu Actividad.

  • Al agregar cadenas de texto (etiquetas, mensajes de error, etc) a tu Actividad, siempre utiliza la función _() con ellos para que puedan ser traducidos.
  • Después de agregar nuevas cadenas ejecuta ./stup.py genpot para recrear el archivo POT.
  • Después de esto, hacer "commit" de los cambios y subirlos ("push") a Gitorious.
  • De vez en cuando, y especialmente antes de liberar una nueva versión, hacer un git pull. Si hay archivos de localization añadidos a Gitorious esto permitirá que puedas obtenerlos.
  • Después de conseguir estos archivos, debes ejecutar ./setup.py fix_manifest para incluir los nuevos archivos obtenidos en el archivo MANIFEST. Después edita el archivo MANIFEST con gedit para eliminar cualquiera entrada no deseada (pueden ser los archivos de proyecto del editor Eric, etc.).

La traducción con Pootle creará un gran número de archivos en el proyecto, algunos en el directorio po y otros en un nuevo directorio llamado locale. Siempre y cuando estos aparezcan listados en el archivo MANIFEST, se incluirán en el archivo .xo que vas a utilizar para distribuir tu Actividad.

 

C'est Magnifique!

Esta es una captura de pantalla de la versión en francés de Read Etexts leyendo la novela de Julio Verne "Le tour du monde en quatre-vingts jours":

 

Hay razones para creer que el libro también está en francés.

1  

 

  1. Traducido Gonzalo Odiard, Argentina^