¡Hola a todos! En esta entrada comentaré resumidamente como se aborda la internacionalización de una aplicación realizada con PyQt/PySide. Como saben, la internacionalización en el mundo del software es un aspecto sumamente importante pues permite que personas de diferentes países, que hablen diferentes idiomas, puedan interactuar con tus aplicaciones de manera más fácil. Un ejemplo lo podemos encontrar en el software libre, en las diferentes distribuciones de Linux, que por cierto de manera general cuentan con un buen soporte en este sentido. Hecho que ha contribuido al creciente éxito del software libre a nivel global.

PyQt4-Full-Install

Evidentemente el proceso de internacionalización se realiza una vez esté completada la aplicación y haya sido completamente probada pero nunca está de más conocer las modificaciones a realizar en el código.

Los pasos a seguir son:

  1. Utilizar el método self.trUtf8(“cadena”) con todas las cadenas a traducir. Como ven, accedemos a trUtf8() como método de la clase, por lo que ésta debe heredar de QMainWindow o cualquier QObject.
  2. Obtener la configuración local del sistema e inicializar el traductor añadiendo las siguientes líneas. EjemploLinguist es el nombre del fichero .py que contiene el programa.
    local = unicode(QtCore.QLocale.system().name())
    # Aplicamos las traducciones realizadas con Qt Linguist.
    traductor = QtCore.QTranslator()
    traductor.load(os.path.join(os.path.abspath(os.path.dirname(__file__)),
                                "EjemploLinguist_" + local))
    aplicacion.installTranslator(traductor)
  3. Generar el fichero .ts para abrirlo con Qt Linguist y realizar las traducciones. Para ello basta con ejecutar el siguiente comando:  pylupdate4 EjemploLinguist.py -ts EjemploLinguist.ts. Si están usando PySide la herramienta se llama pyside-lupdate.
  4. Abrir el fichero .ts con Qt Linguist y realizar las traducciones de todas las cadenas del paso 1. Una vez acabado el proceso de traducción, hacer click en la opción “release” para generar el fichero .qm de traducción.

El código completo del ejemplo es el que sigue:

#!/usr/bin/env python
# encoding: utf-8
#
# Copyright (C) 2014 Yaisel Hurtado González 
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

__author__ = 'Yaisel Hurtado González '
__date__ = '7/4/14 2:44 PM'
__version__ = '0.1'

import sys
import os
from PyQt4 import QtCore, QtGui

class VentanaPrincipal(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        # Creamos la ventana principal
        self.setWindowTitle(self.trUtf8("Demo of Qt Linguist"))
        self.ventana = QtGui.QWidget()
        self.setCentralWidget(self.ventana)
        self.layout = QtGui.QVBoxLayout(self.ventana)

        # Añadimos una etiqueta que luego será traducida
        self.etiqueta = QtGui.QLabel(self.trUtf8(
            "This is a text which will be translated with Qt Linguist."))
        self.layout.addWidget(self.etiqueta)

if __name__ == '__main__':
    aplicacion = QtGui.QApplication(sys.argv)
    # Obtemos los ajustes locales del sistema
    local = unicode(QtCore.QLocale.system().name())
    # Aplicamos las traducciones realizadas con Qt Linguist.
    traductor = QtCore.QTranslator()
    traductor.load(os.path.join(os.path.abspath(os.path.dirname(__file__)),
                                "EjemploLinguist_" + local))
    aplicacion.installTranslator(traductor)
    # La ventana principal
    mw = VentanaPrincipal()
    mw.show()
    sys.exit(aplicacion.exec_())

El ejemplo fue desarrollado en PyQt4 pero funciona también para PySide. Solo tienen que sustituir PyQt4 por PySide en el código. El resultado es el mismo. ¡Hasta la próxima!

Fuentes: Linguist Manual , Sharpreve y OpenTelemetryAnalyzer.