KumbiaPHP y gettext
El objeto de este pequeño tutorial es explicar como usar gettext para internacionalizar nuestras aplicaciones en KumbiaPHP.
Importante
Para que esta extesión funcione correctamente se debe tener instalado el servidor el programa locale, para Debian y derivados, (ejecutar como root):
aptitude install locale
Además tambien debe estar disponible el lenguaje al cual se quiere hacer traducción.
Tutorial
Lo primero que debes tener presente es que todos los textos que quieras que se muestren en diferentes idiomas los has de escribir en la vista de la siguiente forma: _("Texto a traducir"), por ejemplo en nuestra vista tenemos el siguiente formulario:
<?php echo Form::open('formularios/prueba') ?>
Nombre: <?php echo Form::text('nombre) ?>
Para que el texo Nombre: nos lo internacionalice lo habremos de escribir asi:
<?php echo Form::open('formularios/prueba') ?>
_("Nombre:") <?php echo Form::text('nombre) ?>
Con esto ya sabemos como tenemos que escribir los textos que queremos internacionalizar, otra cosa que hay que tener en cuenta es que deberemos crear (ahora explicare como) un archivo .po por cada idioma que queramos tener en nuestra aplicación, los códigos de idioma a utilizar son los que se definen en la norma ISO 639, por ejemplo, es (español), fr (francés); y que este ha de estar ubicado en la correspondiente carpeta de su idioma dentro de la aplicacion, por ejemplo si yo quiero que mi aplicacion se pueda mostrar en español y en ingles, la estructura sería esta:
kumbiaphp/ |-- app |-- locale |-- es_ES |-- LC_MESSAGES |-- es.po |-- en_EN |-- LC_MESSAGES |-- en.po |-- core
Generacion de los archivos .po
Para la generación de estos dos archivos utilizo el programa poedit, el cual podemos descargar desde su pagina oficial: www.poedit.net, para que veas como funciona vamos a generar los archivos .po y el idioma ingles:
Abrimos el programa, en el menú superior seleccionamos edicion->preferencias, en la ventana que se abre, nos vamos a la pestaña procesadores y seleccionamos PHP
ahora pulsaremos Editar, para indicarle las extensiones que usamos (que serán las que escanee el programa en busca de etiquetas _("xxx")), en nuestro caso le añadiremos *.phtml
ahora en Ejecución añadiremos -L php
con lo que la linea de comandos a a procesar nos quedaría como en el grafico de arriba, ahora pulsaremos en Aceptar, y con esto ya le hemos dicho al poedit como ha de trabajar, el siguiente paso será la cración de catálogos (un catálogo por cada idioma de nuestra aplicación), para ello pulsaremos Archivo->Nuevo catálogo, en la pestaña Información del proyecto pondremos los datos correspondientes al idioma que estamos creando, en nuestro caso el ingles
Luego vamos a la pestaña Carpetas y en Directorio Raiz, pondremos la ruta completa a nuestra app, y debajo en Carpetas, pondriamos las carpetas que queremos que nos escanee, pero mejor poner un . y así no se nos escapará ninguna
Pulsamos en Aceptar, ahora nos pedirá donde queremos guardar el archivo .po correspondiente, lo haremos dentro de locale, en la carpeta correspondiente al idioma que estemos creando, en este momento realizará el escaneo de los archivos en busca de todas las etiquetas con el formato _("xxx") que tengamos, y nos mostrará una pantalla como la siguiente, en la que estarán todos los textos encontrados.
En el gráfico anterior nos muestra que ha encontrado las siguientes etiquetas: 'esto es la prueba numero DOS' y 'esto es la prueba numero UNO', ya que en la vista correspondiente está como:
<h1> <?php echo _("esto es la prueba numero UNO") ?> </h1><br/>
<h1> <?php echo _("esto es la prueba numero DOS") ?></h1>
Ahora pulsaríamos Aceptar y ya tenemos nuestro archivo .po del idioma correspondiente y deberemos introducir las traducciones de las etiquetas correspondientes en é, ahora simplemente con cambiar el locale de nuestra aplicación nos la mostrara en el idioma seleccionado.
Como utilizar el archivo .po
Para que las etiquetas aparezcan traducidos habría que añadir el siguiente código en el aplication_controller, si quieres que este disponible en toda la aplicación o en el controlados en el que quieras usarlo
<?php
$language="en_EN";
putenv("LC_ALL=$language");
setlocale(LC_ALL, $language);
bindtextdomain("messages", "./locale");
textdomain("messages");
?>
Nota: El primer argumento de las funciones bindtextdomain y textdomain tiene que ser el nombre del archivo .po que se haya creado.
Ten en cuenta que con ese código nos lo mostraría en ingles, si quieres cambiarlo dinámicamente desde tu aplicación tendrás que adecuar el código, para que la variable $language, tome el idioma que te interese en cada momento.