Archive for 28 abril 2010

Internacionalización con PyQt4

En realidad debería decir traducción, porque la internacionalización incluye además convertir los formatos de fechas, monedas y todo eso, pero bueno, estos son los pasos necesarios para hacer traducciones de distintas partes de un programa usando PyQt4 (la octava maravilla moderna) y Qt Linguist (una herramienta que ya viene incluida cuando se instala PyQt). Yo usé la versión 2.6.4 de Python y la 4.5.1 de PyQt (la 4.7 no me anduvo en Windows 7, a pesar de mis esfuerzos).
 

  1. Marcar los strings a traducir en la aplicación de la siguiente manera:

    1. self.tr() en las clases que heredan de QMainWindow, QDialog o cualquier QObject (pero se suele hacer sobre la ventana)
    2. app.translate(<translation_string>, <translation>)
      
  2.  

  3. Crear un traductor y agregarlo a la aplicación (se pueden crear y agregar tantos como se quiera):

     
    from PyQt4.QtCore import Qlocale, QTranslator
    
    locale = QLocale.system().name()
    app_translator = QTranslator()
    path = "<app_name>_" + locale + ".qm"
     
    if app_translator.load(path):
        app.installTranslator(app_translator)
    

    Si el archivo de traducción va a estar embebido en el archivo de recursos:

     
    import resources #Para que funcione va a haber que llevar a cabo los pasos siguientes:
    
    path = "<app_name>_" + locale
     
    if app_translator.load(path, ":/"):
        app.installTranslator(app_translator)
    
  4.  

  5. Crear un archivo de recursos (ej. resources.qrc) que incluya el o los archivos de traducción:

     
    <!DOCTYPE RCC>
    <RCC version="1.0">
        <qresource>
            <file>staristics_es_AR.qm</file>
            <file><app_name>_<locale>.qm</file>
        </qresource>
    </RCC>
    
  6.  

  7. Crear un archivo pro (ej. .pro) con el siguiente formato:

     
    SOURCES = <main>.py <ventana>.pyw <…>
    TRANSLATIONS = <app_locale>.ts
    
  8.  

  9. Ejecutar el archivo pro desde la línea de comandos:

    directorio_del_proyecto>pylupdate4 -verbose .pro

  10.  

  11. Traducir los strings marcados usando Qt Linguist
  12.  

  13. Compilar el archivo de traducción (File > Release)
  14.  

  15. Compilar el archivo de recursos usando pyrcc4 desde la línea de comandos:

    directorio_del_proyecto>pyrcc4 resources.qrc -o resources.py

 
Actualización de las Traducciones

Cuando se agreguen strings nuevos para traducir en la aplicación, se repiten los pasos del 5 al 8 (modificando el archivo .pro antes de hacerlo si se agregaron archivos .py nuevos que contienen strings para traducir).

Anuncios

Una pequeña decepción

Desde el principio de marzo del año pasado, cuando vi que el sitio de Bedroom Eyes había abandonado su fondo de madera nostálgica para volverse blanco y poner en el centro “Let’s make of this one the best year ever – Debut album in studio” (o algo así) estuve esperando lo que iba a pasar hoy. O sea, que después de dos años y medio de haber escuchado por primera vez Hand-in-Hand Grenade como parte de Valentine Vacancy EP saliera el single oficial.
 

Esta mañana apareció finalmente en MySpace, y mientras escuchaba la versión nueva solamente dos palabras circulaban por mi mente: ¿por – qué?
No había que ponerle ni sacarle nada, tenía letras inteligentes, sentimiento en la voz, y un corno inglés. Pero no, apareció una discográfica y convirtió en otra canción más de plástico una cosa hermosa del indie-pop sueco.
 

Espero darme cuenta en un tiempo, al escuchar el album entero, que estaba equivocado. Pero por ahora me contento con tener conmigo la versión original.

Wind-Up Toys

Si algo nos enseñó el antiguo testamento es que Dios es celoso y vengativo, y que se divierte con nuestra miseria. Nos da libre albedrío para que hagamos lo que Él ya sabe que vamos a hacer, porque obviamente, Él fue quien nos hizo hacerlo.

Si abren la Biblia que siempre llevan en la mochila (¿cómo? ¿no es normal andar con una Biblia en la mochila?), en el Éxodo, van a encontrar que le dice a Moisés algo en las líneas de

Vas a ir a hablar con el faraón para que te deje ir a vos y al pueblo de Israel de Egipto. Pero no te va a dejar, porque le voy a endurecer el corazón para que no lo haga, aunque después lo voy a castigar por eso.
Y así sucesivamente hasta que los largue.

De todo esto se desprende una conclusión obvia: al faraón lo agarraron de pelotudo.

Y a nosotros también nos agarra de pelotudos, y nos humilla refregándonoslo en la cara con señales irónicas (como haciéndote caminar sobre baldosas flojas en el momento en el que estás pensando que todo se cae).

Pero si tuviera que elegir un dios, volvería a elegir a Éste, porque después de todo, no tengo otra opción :)

(Si alguien piensa que todo este post fue solamente una manera de justificar el día de mierda que fue hoy, tiene absolutamente toda la razón)

[Esto lo escribí el viernes pasado, pero no lo publiqué por causas inciertas]

¡Actua-actualización!

Después de mucho tiempo abro otra vez Google Earth ¿y con qué sorpresa me encuentro? ¡Las imágenes de Junín están actualizadas!

Hubo un tiempo del año pasado en el que esperaba ansioso que esto pasara, pero después me fui olvidando.
A simple vista ya se nota que hay algo distinto, empezando por esa carpa de circo (vamos, tienen 5 segundos para encontrarla).

La calidad es bastante mayor (aunque lejos de ser la de Gringolandia), y están todos los cambios de la última década y media (y los más recientes también), como la UNNOBA, y las nuevas versiones de las plazas, la terminal y el centro. También aparecen los edificios (¡con sombras y todo!).

Lamentablemente querer que aparezcan también los nombres de las calles es pedir demasiado. Pero algún día van a aparecer, quizá cuando lleguen los colectivos y haya cine :)