Desarrollando en Manjaro: Como se hizo MPIS [Modulo traslate] parte 2

mpis_logo

Saludos amigos Manjaristas.

Seguimos con la serie Como se hizo MPIS, en la entrada anterior hablamos sobre decoradores, en esta entrada explicaremos como se dio soporte para varios idiomas en MPIS, a partir de los archivos *.tr se genera un diccionario donde se tiene las traducciones y una lista donde esta el texto a traducir y a partir de esta lista se genera la llave para las búsquedas en el diccionario luego cuando el decorador es llamado este intercepta un texto y genera la llave para luego buscar en el diccionario el texto traducido e inyectarlo de nuevo a la función decorada. les voy a mostrar el código para luego explicarle paso a paso como sucede todo:

class Translate:
     def __init__(self, f):
        self.f = f
        self._resource = Resource()
        self._db = Database(self._resource.path_db())
        self.ext = ".tr"
        self.lang = self._db.get_config('language')
        self.dic_tr = None
        self.list_tr = None
        self.dic_tr, self.list_tr = self.__read_tr()

    def __call__(self, string):
        def wrapper(*args, **kw_args):
            return self.f(self.__get_traduccion(*args, **kw_args))
        return wrapper(string)

    def __get_traduccion(self, _string):
        try:
            # Generates the key for the search of the translation.
            _key = "msg_" + str(self.list_tr.index(_string))
            tr_string = self.dic_tr.get(_key)
            return tr_string
        except ValueError:
            return _string

    def __read_tr(self):
        dic = {}
        list_tr = []
        if not self.dic_tr:
            file_tr = os.path.join(self._resource.path_tr_file(),
                                   str(self.lang + self.ext))
            # Fill in the translation dictionary
            with open(file_tr, "r") as _file:
                trs = csv.reader(_file)
                for reg in trs:
                    dic[reg[0]] = reg[1]
            file_tr = os.path.join(self._resource.path_tr_file(),
                                   str("EN_us" + self.ext))
            # Generates the list of indexes for the searches
            with open(file_tr, "r") as _file:
                trs = csv.reader(_file)
                for reg in trs:
                    list_tr.append(reg[1])
        dic_return = dic if not self.dic_tr else self.dic_tr
        list_return = list_tr if not self.list_tr else self.list_tr
        return dic_return, list_return


@Translate
def tr(string):
    return string

Dentro del método __init__(self, f): se crea una copia de la función a decorar f y se inicializan las demás variables necesarias para realizar la traducción, haciendo uso de una base de datos cargamos el lenguaje que el usuario selecciono. Luego tenemos el método __call__(self, string): que como vimos anteriormente es un decorador, dentro de él definimos una función envoltura [wrapper(*args, **kw_args)] la cual se define de esa manera para permitirle recibir cualquier cantidad de argumentos. Esta función envoltura devuelve una copia de la funcion a decorar.

La función:  __get_traduccion(self, _string): es la que busca dentro del diccionario la traducción,  devuelve el texto traducido si lo consigue en el diccionario de lo contrario devuelve el mismo texto, esto se logra mediante un bloque try – except.

La función: __read_tr(self): lee el archivo de idioma *.tr donde el * es sustituido por el idioma que el usuario seleccione para la aplicación y carga el diccionario con las traducciones, luego del archivo “EN_us.tr” se llena una lista con los textos a traducir, ¿porque del archivo EN_us.tr? – pues es el idioma por defecto de la aplicación, esta función devuelve un diccionario y una lista en forma de tupla ( return dic, list ), al final del modulo tenemos la función tr(string) la cual esta siendo modificada por el decorador @Translate, dicha función solo recibe una cadena y la devuelve ya traducida.

Actualmente se debe crear manualmente los archivos .tr, pero se le agregara la función de crearlos dinamicamente. para tener soporte a cualquier idioma solo se debe hacer una copia del archivo EN_us.tr y cambiar el nombre por el idioma que se quiere soportar ejemplo ES_es.tr y dentro de este reemplazar los textos después de la primera coma ( , ) por los textos ya traducidos al idioma correspondiente, ejemplo:

EN_us.tr:

msg_0,Restart to apply changes.
msg_1,Spanish (es).
msg_2,English (en).
msg_3,Languages available.

ES_es.tr:

msg_0,Reiniciar para aplicar los cambios.
msg_1,Español (es).
msg_2,Ingles (en).
msg_3,Idiomas disponibles.

En la próxima entrada hablaremos de como se generan los menús en MPIS, Como siempre a la espera de sus comentarios, con gusto responderé cualquier duda o pregunta.

hasta la próxima entrada.

Anuncios
Esta entrada fue publicada en General. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s