sábado, 29 de diciembre de 2012

Internacionalización de CodeIgniter


CodeIgniter es un framework PHP de código abierto que sigue la arquitectura MVC (Modelo-Vista-Controlador). Su principal ventaja es de ser más sencillo y ligero (4Mb todo mojado) que Zend o Symfony, con una curva de aprendizaje más fácil. Vamos a detallar en este post la internalización con los archivos de idioma en la versión 2.1.3 de este framework.

Gestión de la internacionalización


El idioma predeterminado se define en el archivo de configuración application/config/config.php
$config['language'] = 'en';
Los archivos de idioma caen en el directorio application/language/

Nosotros optamos aquí por un código de idioma de dos letras (en, código ISO 639-1), pero habríamos podido muy bien utilizar un código de tres letras (eng, código ISO 639-2 o 639-3), un código de dos letras localizado (en-ca para el inglés de Canadá, códigos de idioma ISO 639-1 y de país ISO 3166-1), el nombre de la lengua en letras (english), o cualquier otro formalismo.

El uso recomendado es prefijar el nombre del archivo de idioma (_lang.php) por una unidad semántica (aquí, el nombre del controlador, o sea test).

Asímismo, para evitar la colisión de claves entre los archivos, es habitual prefijar cada clave por la misma unidad semántica.

system/language/en/test_lang.php
$lang['test_test'] = "Let's test";
$lang['test_my_view'] = "My view";
system/language/es/test_lang.php
$lang['test_test'] = "Vamos a probar";
$lang['test_my_view'] = "Mi vista";
La llamada a una variable localizada se realiza en el controlador cargando el archivo de idioma a través del método load a lo cual pasamos dos parámetros: el prefijo del archivo de idioma (aquí, el nombre del controlador en minúsculas) y el código de idioma usado como subdirectorio del directorio de idiomas (si el segundo parámetro se omite, es el idioma por defecto del archivo de configuración que se utilizará).

Luego, asignamos las variables que contienen las cadenas del archivo de idioma con el método line (parametrizado por la clave del array asociativo $lang), con tantas claves como las del array asociativo $data.

Entonces, el controlador se presenta así:
public function view() {
    $this->lang->load('test', 'es');

    $data['lets_test'] = $this->lang->line('test_test');
    $data['my_view'] = $this->lang->line('test_my_view');

    $this->load->view('test', $data);
}
Del lado de la vista, las variables se pueden visualizar directamente: $lets_test y $my_view.

Utilización de parámetros en un archivo de idioma


El enfoque directo consiste en insertar tantos marcadores de posición que sea necesario en la cadena localizada siguiendo el formalismo de la función PHP sprintf (o sea %s para una cadena estándar).

application/language/en/test_lang.php
$lang['test_lets'] = "Let's %s now";
$lang['test_program'] = "program";
application/language/es/test_lang.php
$lang['test_lets'] = "Ahora vamos %s";
$lang['test_program'] = "programar";
El controlador inserta la subcadena que falta cuando está llamado.
$data['lets_dance'] = sprintf($this->lang->line('test_lets'), $this->lang->line('test_program'));
La visualización en la vista será entonces, o Let's program now, o Ahora vamos programar.

El problema se agrava cuando varias subcadenas están pasadas como argumentos, su orden pudiendo ser diferente según el idioma utilizado.

El truco entonces es utilizar parámetros numerados con la función sprintf. Las variables pueden así ser reutilizadas.

application/language/en/test_lang.php
$lang['test_there'] = "There are %1\$s in the %2\$s. I like %1\$s.";
$lang['test_monkeys'] = "monkeys";
$lang['test_banana_tree'] = "banana tree";
application/language/es/test_lang.php
$lang['test_there'] = "El %2\$s está lleno de %1\$s. Me gustan los %1\$s.";
$lang['test_monkeys'] = "monos";
$lang['test_banana_tree'] = "plátano";
El controlador inserta las subcadenas que faltan en el mismo orden cuando está llamado, independientemente de la lengua.
$data['there'] = sprintf($this->lang->line('test_there'), $this->lang->line('test_monkeys'), $this->lang->line('test_banana_tree'));
La visualización en la vista será entonces, o There are monkeys in the banana tree. I like monkeys, o El plátano está lleno de monos. Me gustan los monos.

Resumen


Hemos visto en este breve tutorial cómo internacionalizar una aplicación creada con el framework CodeIgniter: cómo configurar los archivos de idioma, cómo cargarlos en los controladores, luego mostrar sus variables en las vistas, mientras manejando su parametrización y el problema del orden de las variables.

En un futuro post, vamos a ver cómo hacer las URLs de CodeIgniter SEO-friendly e internacionalizadas.

Libro

Professional CodeIgniter

Para ir más lejos, recomiendo la lectura de este libro: Professional CodeIgniter, por Thomas Myer (2008, 336 páginas).


Internationalisation de CodeIgniter (en francés)
CodeIgniter internationalization (en inglés)
Internacionalização de CodeIgniter (en portugués)

No hay comentarios:

Publicar un comentario