[Linux] Crea scripts multilenguaje de forma simple (Alternativa a gettext)

Bienvenidos a otro corto tutorial de JKANetwork

Estos días, haciendo traducciones para unos scripts de un nuevo proyecto por parte de JKANetwork, vimos que había varias formas para traducir programas, siendo sin duda la más utilizada (y con más herramientas) gettext. Pero, hay veces que, por bien no complicarse, o por simplificar, o bueno, por cualquier otra razon, quieres algo más «sencillo» sin archivos en carpetas aparte, etc. Aquí se me ocurrió una idea, usando una funcion, a la que llamaremos T (De translate, si,muy currado). En esta funcion se iban poniendo los textos, y sus traducciones en diferentes idiomas además de la del texto original. Evidentemente, con soporte multiidioma por parte de la distribucion (Recogiendo el idioma), o poniendo tu menu de idioma, para gustos los colores.

Primero os mostrare la funcion en si metida en un script, y después lo explicaré trozo por trozo añadiendo también un fichero al final descargable.

El codigo .sh sobre el que haré la explicación es el siguiente:

#!/bin/bash
sclang=$(echo $LANG | cut -c1-2)

function T {
case «$1» in
    «Hello»)
        case $sclang in
            «es»)    echo «Hola»;;
            *)    echo «$1»;;
        esac;;
    «Goodbye»)
        case $sclang in
            «es»)    echo «Goodbye»;;
            *)    echo «$1»;;
        esac;;
    *)    echo «$1»;;
esac
}

echo «$(T «Hello»)»

Explicación por lineas..
sclang=$(echo $LANG | cut -c1-2) – Esta linea mete en una variable el idioma del ordenador en el que se ejecuta, en este caso solo con la parte general (Es decir, «es», «en»…), si cambiais el 2 por un 4 seria entero tipo es_ES, en_UK, etc, pero habría que hacer más traducciones claro, y aquí tratamos de simplificar

La funcion T es la que hace el proceso, empieza con un case «$1» in , siendo $1 lo que va a traducir (Es decir, el argumento de la función, la palabra o frase a traducir)

Dentro de ese case se forma la siguiente estructura repetida muchas veces:    «Hello»)  -> Palabra a traducir
        case $sclang in  -> Aquí hace otro «case» para traducir al idioma de la máquina concreta, con la variable de antes
            «es»)    echo «Hola»;; -> Y en cada uno, se añade la traducción, en este caso es la «es» de castellano/español
            *)    echo «$1»;; ->Al final, siempre una con * que devuelve lo mandado a la función (Que normalmente se escribe en inglés), es un fallback
        esac;; -> Cerramos el case

Al acabar todas las traducciones, evidentemente hay que cerrar el otro case «$1» in con otro esac;;

En mi caso puse un fallback de la función debajo de las traducciones con «*)    echo «$1»;;» para que siempre aparezca algun texto, mejor mal que nada

Para mandar algo a traducir ahí es tán facil como mandar a la función la palabra
Ejemplo:
echo «$(T «Hello»)»

Eso manda «Hello» a la función, y nos devolverá el texto traducido, en nuestro caso, al español

Hasta aqui la parte básica del tutorial, pero para gente que quiera un poco más, ampliamos.

Por ejemplo, que pasa si quieres que añada un «argumento» , palabra, o parametro a esa traduccion? Por ejemplo, si queremos que responda «Hola Kevin» o «Hola Rosa» etc?

La función lee $1 que sería el primer argumento, el texto, y luego, puedes añadir otro más que leería como $2 (y más si se quiere claro)

Entonces.. Mandas por ejemplo echo «$(T «Hello» «Kevin»)»  , como ves, Kevin esta entrecomillado aparte, lo manda como $2. Ahora bien, la función cambia un poco, pero muy poco

    «Hello»)
        case $sclang in
            «es»)    echo «Hola $2»;; -> Como se puede ver, añadí $2 para que muestre Kevin por ejemplo en este caso
            *)    echo «$1 $2»;;
        esac;;

Asi de facil sería

Por cierto, como decía al principio, algunos querréis tenerlo en un archivo separado, verdad?
Entonces solo tenéis que tener un bash (Llamalo como quieras, en el ejemplo será traduccion.sh) con el «#!/bin/bash» y la funcion T, y luego, donde lo queráis usar, llamadlo asi:
source ./traduccion.sh
Así cargará la función, y podréis usarla igual que si estuviera en el fichero original

Aquí teneis un fichero de ejemplo de todo lo dicho, para que hagáis pruebas. https://mirror.jkanetwork.com/Scripts/blogjkanetwork/funciontraduccion.sh (Si el fichero no se abre, comprobad si tiene permisos de ejecucion [chmod +x fichero] )

 

Espero que esto os sirva para aprender otras formas de traducción no tan estandar, y esta es bastante.. «customizable». Si me expresé mal, hacedmelo saber y corregiré el tutorial 🙂

Actualización: Corrección de la explicación y subida de un ejemplo

6 comentarios en “[Linux] Crea scripts multilenguaje de forma simple (Alternativa a gettext)”

  1. Gracias. Sería bueno ejemplos para usar dentro de funciones. Por ejemplo mira el enlace de abajo, que hice precisamente esta pregunta para que tengas una idea del grado de complejidad de la traducción. Tu propuesta me parece buena. gettext es basura.
    http://unix.stackexchange.c

  2. Hmm… Normalmente en las funciones yo llamo al texto sin mas, con $(T «palabra») , a veces tambien entrecomillando el programa. No sabría darte ejemplos demasiado exactos, pero a ver si con esto puedo ayudarte a entenderlo mejor, esto son dos funciones, la segunda llama a la primera y muestra un dialog, todo traducido
    Subido aqui: http://pastebin.com/0cGE60X0 porque el sistema de comentarios y el codigo fuente se llevan mal..
    También, si quieres,puedes verlo en un script grande creado con este método, con mas cosas aun en https://gitlab.com/JKANetwo… (Quiza viendo esto por encima entiendas como meterlo entre comandos y tal)

  3. +acg , si..tienes razón de que no esta muy bien explicado, voy a intentar en unas horas hacer una actualización con una explicación más detallada de cada parte y dejar archivos de ejemplo para que sea fácil
    Muchas gracias por visitar el blog 🙂

  4. de todas maneras mil gracias. me sirvió bastante (100 veces mejor que gettext), pero para script no muy complejos. Para funciones y cosas más complejas uso la solución que dieron en ese enlace (hago un mix de ambos en dependencia de lo que necesito)
    Buen aporte

  5. muy bueno pero sin mucha claridad. Podrías explicar este jeroglífico más «despacio y por partes». Tengo un script y no quiero sacar dos versiones (inglés y español). Cómo podría usar esto para no tener que crear dos scripts

  6. +acg , genial que te haya servido, me alegro
    Me hizo mucha gracia cuando dijiste que gettext era malo y lo comparto, me parece demasiado complicado sobretodo para cosas simples
    Si.. Esto es como para todo en informática, no hay una solución unica, ni lo mismo vale para todo, pero me alegro que te haya servido 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

16 + tres =