Internacionalización con PHP/Smarty

septiembre 17, 2008 § Deja un comentario

Visión General

Este documento describe una solución para permitir desarrollar aplicaciones multilenguaje con soporte para Smarty.

Dicha solución se basa en la clase IntSmarty, que se trata de una extensión del motor de plantillas Smarty. Toda la información que aquí se comenta ha sido extraída del artículo Internalize your website with IntSmarty and Smarty.

Se supone conocimientos previos de Smarty, HTML y PHP, así como que se dispone de una configuración de Smarty que funciona correctamente de modo que la clase IntSmarty pueda incluirse sin problemas en la aplicación.

Paquete con el ejemplo en funcionamiento:

Funcionamiento

Preparación de los archivos de traducción

La idea es identificar en la plantilla entre las marcas {l} {/l} las cadenas que se desean traducir. Ayudándonos del script grep_lang.php,

<?php
/* grep_lang.php
Generate localization for IntSmarty
*/
$file = 'templates/' . $_GET['file']; // Modificar la ruta donde se encuentra la plantilla si es necesario
$fp = fopen($file, 'r');
$content = fread($fp, filesize($file));
$regex = '!{l}(.*?){/l}!s';
preg_match_all($regex, $content, $matches);
foreach($matches[1] as $m) {
echo '$__LANG[\'' . md5($m) . '\'] = \'' . $m . '\';<br>';
}
?>

se parsea este documento cuyo resultado servirá de base para la creación de los respectivos archivos de idioma. La plantilla se debe pasar al script grep_lang.php con el parametro file=. Como resultado se muestra en pantalla lista de todas las cadenas de la plantilla entre las marcas {l} y {/l} en el idioma que esté la plantilla, pudiendose editar posteriormente para crear el fichero de traducción correspondiente.

Un ejemplo de un archivo de idioma generado mediante la ayuda de este script podría ser el siguiente, que debe ser guardado en el PATH correspondiente al directorio donde se almacenaran los diferentes archivos de traducciones. Este PATH puede ser definido por el usuario, como veremos a continuación.

Uso de IntSmarty

El archivo base PHP deberá incluir la clase IntSmarty y especificar el PATH donde se guardaran los archivos de traducción.

Para especificar el PATH donde se guardaran los archivos de idioma, extendemos la clase IntSmarty donde se indicará el PATH de los archivos de idiomas así como la estructura de archivos necesaria para el sistema de plantillas Smarty.


Class Translate extends IntSmarty {
var $lang_path = 'lang/'; //include trailing slash
function Translate($lang = null) {
$this->Smarty();
$this->template_dir = 'templates/';
$this->compile_dir = 'templates_c/';
$this->config_dir = 'configs/';
$this->cache_dir = 'cache/';
parent::IntSmarty($lang);
}
}

Una vez hecho ésto sólo hay que instanciar la clase Translate, que como puede verse en el código no es más que una extensión de su clase base IntSmarty, pasando como argumento el idioma en el que se desea mostrar la página y llamar a la función display de Smarty con su correspondiente plantilla como argumento.

$IntSmarty = new Translate($lang);
$IntSmarty->display(‘int_smarty.html’);

Hay que considerar que los ficheros PHP de idioma deberán llamarse {$lang}.php. Así, por ejemplo si para identificar el idioma Catalán utilizamos el valor ‘cat’, el fichero de idioma correspondiente deberá llamarse cat.php y encontrarse en el PATH de idiomas que se definido.

int_smarty.html es el nombre de la plantilla que se encuentra bajo el directorio templates/ y que contiene las marcas de traducción {l} {/l} que se ha comentado al principio del documento.

Internationalization Smarty

{l}Choose your language{/l}: ES ||EN || CAT


{l}Hello{/l} {$name}

{l}Welcome to my tutorial{/l}

{l}Tutorial for Internationalization your PHP with IntSmarty{/l}

Por hacer (TO-DO)

Para montar un sistema multilenguaje fácil de mantener, sería conveniente desarrollar una pequeña aplicación que con la ayuda del script grep_lang.php muestre todas las frases a traducir y permita especificar el idioma que se desea crear y lo guarde con el nombre correspondiente en el directorio de idiomas especificado.

Welcome

septiembre 17, 2008 Comentarios desactivados en Welcome

Hola,

Bienvenid@ a este nuevo espacio en el que aún no sé muy bien que tipo de contenido voy a ir añadiendo. Seguramente el tiempo y las necesidades me den una orientación.

Por el momento he creado una página llamada Cajón Desastre en la que voy a ir poniendo diferentes TIPs técnicos, problemas puntuales que me encuentro y que en principio no me pareció trivial la solución. Si veo que va creciendo me plantearé estructurarlo de otra forma, aunque también es verdad que espero que las siguientes entradas tengan un sentido en sí mismas y no tengan por lo tanto cabida en este Cajón Desastre.

¿Dónde estoy?

Actualmente estás viendo los archivos para septiembre, 2008 en J. Manuel Velasco Weblog.