PlatesPHP: Sistema de plantillas para Codeigniter 3
PlatesPHP: Sistema de plantillas para Codeigniter 3
¡INSCRÍBETE A CUALQUIER CURSO CON UN 50% DE DESCUENTO PARA NUEVOS CLIENTES!

En este tutorial vamos a ver como crear webs multi idioma con gettext en codeigniter. Para el qué no lo sepa, gettext es la biblioteca GNU de internacionalización (i18n). Como dice la wikipedia, comúnmente se usa para escribir programas con interfaz en varios idiomas, que es lo que vamos a tratar de explicar.

Nosotros ya vimos en este tutorial como crear un site multi idioma en codeigniter, pero lo hicimos utilizando la clase language que codeigniter nos ofrece, ésto está bien, pero a veces no será lo que nuestro cliente necesita, ya que como sabemos, la clase language de codeigniter trabaja con arrays, algo así como lo que sigue.

Está claro que nosotros lo entendemos, pero no así el resto de personas que no son programadores y no están acostumbrados a la programación. Por otra parte decir que hay muchas empresas que se dedican a la traducción de archivos .po, éstos son los archivos necesarios para trabajar con gettext, son archivos que contienen texto con las claves y las traducciones, así como comentarios, los cuáles contienen unas líneas al principio del mismo que vienen a ser unos comandos internos para interpretarlo correctamente.

Nuestra aplicación debe tener por cada idioma dos archivos, uno con extensión .po y otro con extensión .mo, para que nos entendamos, los ficheros .po son compilados en un fichero binario .mo con msgfmt de forma que queden listos para ser distribuidos, finalmente, el archivo .mo es el que deberá leer la aplicación.

Cada vez que se añaden nuevos datos a nuestro archivo .po, debemos hacer una especie de compilación con un programa, nosotros utilizaremos poedit, este programa lo que hace es añadir toda la información en formato binario a nuestro archivo .mo, una vez hecho ésto, deberemos reiniciar nuestro server para que los cambios tengan efecto.

Instalación y uso de gettext en codeigniter

Lo primero que debemos comprobar es si en nuestro php.ini tenemos habilitada la siguiente extensión.

Si hay un ; delante eliminarlo, de otra forma no funcionará.

Lo siguiente será descargar poedit desde aquí, una vez hecho crea tu proyecto en codeigniter y abre tu carpeta language, y dentro crea la siguiente estructura de carpetas, nuestro ejemplo será para español, inglés y francés, pero puedes añadir todos los que quieras, la forma de crear para el resto de idiomas siempre será igual.

/application
  /language
    /locale
        /en_US
            /LC_MESSAGES
        /es_ES
            /LC_MESSAGES
        /fr_FR
            /LC_MESSAGES

Una vez hayas creado la anterior estructura de carpetas, crea un nuevo helper en el directorio helpers llamado my_lang_helper.php y añade el siguiente código.

Ahora debes dirigirte al archivo autoload.php y cargar el helper que hemos creado con la siguiente línea.

Llegados hasta aquí, tenemos toda la configuración para empezar a trabajar con gettext, simplemente necesitamos en cada uno de los directorios que hemos creado, dentro de cada carpeta llamada LC_MESSAGES, dos archivos, uno llamado lang.po y otro llamado lang.mo, de ahí que el parámetro de textdomain sea lang, porque es el nombre que le vamos a dar a nuestros archivos .po y .mo, éstos archivos los vamos a crear utilizando poedit, y es muy sencillo, sigue los siguientes pasos.

Con el programa poedit abierto, pulsa en archivo, ahora en new y busca español(España), dale a aceptar, una vez hecho, pulsa en guardar, dirígete al directorio LC_MESSAGES dentro de la carpeta es_ES y cambia el nombre del archivo, que por defecto poedit nos dará en este caso es_ES por lang y pulsa en guardar.

Si ahora abres dicho directorio verás que se han creado nuestros dos archivos, lang.po y lang.mo, perfecto, ahora, repite la operación con cada uno de los idiomas que hemos escogido.

Una vez tengas los archivos creados, simplemente debemos abrir el lang.po de cada uno de los idiomas, y seguir los siguientes ejemplos para ver como llenarlos y utilizarlos, así que abre el archivo que se encuentra en es_ES/LC_MESSAGES con extensión .po y al final del mismo, añade el siguiente código.

Lo mismo con en_US.

Y finalmente lo mismo con fr_FR.

Como podemos ver, tenemos comodines, trabajamos la pluralización, y creo que todo es muy sencillo de entender, cada cadena tiene un msgid, que es el qué llamaremos en cada lugar de nuestra aplicación, pero lo más importante, en nuestro ejemplo, para utilizar cada uno de los archivos de lenguaje haremos lo siguiente.

Escoge el que necesites de forma dinámica, eso ya es cosa tuya.

Una vez hemos creado los textos que necesitamos, podemos utilizarlos de la siguiente forma en una vista, por ejemplo.

Simplemente léelo, verás que es todo muy obvio, si te es complicado, te aseguro que es más complicado encontrar este tipo de información, así que si tienes dudas, léelo de nuevo.

Ésto todavía no funciona, para que lo haga, debemos generar de nuevo nuestros archivos lang.mo de cada una de las carpetas de nuestros idiomas, para ello, simplemente abre con poedit cada uno de los archivos lang.po que hemos modificado, si te dice que el nombre del proyecto no está seteado, dale un nombre, a continuación, pulsa sobre validar, y seguido sobre guardar, haz ésto con todos los archivos .po que hemos creado, ahora ya tenemos todo listo, simplemente, reinicia tu servidor apache.

Eso es todo, así de sencillo es utilizar gettext en codeigniter, espero que te sirva y sobre todo que te funcione, antes de preguntar o decir que no funciona, busca en google, es muy útil, a la par que escribo el ejemplo lo voy haciendo, así que funciona, saludos.