martes, 11 de diciembre de 2012

Tratamiento de idiomas en CodeIgniter

Siguiendo con la serie de artículos sobre la programación del framework CodeIgniter hoy hablaré de las posibilidades de CodeIgniter respecto al tratamiento de idiomas: Veremos como convertir todo el framework al español, como hacer un proyecto multiidioma y hablaremos de la clase Language y del helper Language.


Como poner CodeIgniter en Español.

CodeIgniter como la mayoría de frameworks PHP proporciona un mecanismo para poder cambiar el idioma en que se muestra un página web. Los archivos de idioma del framework se encuentran en la carpeta "/system/language/". Dentro de dicha carpeta habrá una carpeta para cada idioma: "english" para Inglés, "spanish" para español, etc. Inicialmente sólo se proporcionan traducciones para el idioma Inglés. Si queremos el framework en español tendremos que crear la carpeta "/system/language/spanish/", copiar los archivos de la versión inglesa y traducir los textos.

El formato de los archivos de idioma lo vemos en el siguiente ejemplo:

$lang['cal_sunday'] = "Sunday";
$lang['cal_monday'] = "Monday";
$lang['cal_tuesday'] = "Tuesday";
$lang['cal_wednesday'] = "Wednesday";
$lang['cal_thursday'] = "Thursday";
$lang['cal_friday'] = "Friday";
$lang['cal_saturday'] = "Saturday";

Este fragmento es parte del archivo "calendar_lang.php". Para crear la versión en español crearíamos el archivo "/system/languge/spanish/calendar_lang.php" y traduciríamos los textos, pero no los literales:

$lang['cal_sunday'] = "Domingo";
$lang['cal_monday'] = "Lunes";
$lang['cal_tuesday'] = "Martes";
$lang['cal_wednesday'] = "Miércoles";
$lang['cal_thursday'] = "Jueves";
$lang['cal_friday'] = "Viernes";
$lang['cal_saturday'] = "Sábado";

En Internet se pueden encontrar archivos con las traducciones para los distintos idiomas. Por ejemplo en una búsqueda rápida he encontrado en github un proyecto de traducción de CodeIgniter al Español, pero los packs de idiomas no están actualizados. Lo que sí hay es está actualizado a la última versión en un manual de CodeIgniter en Español (PDF). También he encontrado un "CodeIgniter 2.0.2 Spanish Pack" en el blog de César de la Cruz. A partir de ese trabajo que creado mi propio CodeIgniter Spanish Pack actualizado a la versión 2.1.3, que es la versión oficial de CodeIgniter en el momento de escribir este artículo.

CodeIgniter 2.1.3 Spanish Pack (ZIP/8Kb). Licencia libre.


Cambiando el idioma de un proyecto.

Además de los archivos de idioma del sistema, también podemos definir nuestros propios archivos de idioma para el proyecto PHP. Estos se guardarán en la carpeta "/application/language/{lang}/" donde {lang} es el nombre del idioma (english, spanish, etc). El nombre de los archivos de idioma debe acabar en "_lang.php". Por ejemplo un archivo con mensajes de error se llamaría "error_lang.php". El formato del archivo será el mismo que se ha comentado más arriba:

$lang['error_resource_not_found'] = "Recurso no encontrado.";
$lang['error_resource_unavailable'] = "Recurso no disponible.";
//... etc.

Para poder usar un archivo de idioma primero tendremos que cargarlo. Para ello se utiliza la clase Language. Esto se hará en el controlador:

$this->lang->load('error', 'spanish');

Si no se especifica idioma, se usará el idioma por defecto, definido como una variable dentro del archivo "/application/config/config.php". Generalmente su valor es "english", pero podemos modificarlo si hemos creado la carpeta de idiomas correspondiente:

$config['language'] = 'spanish';
Luego para obtener una cadena traducida hay que llamar a la función line():
$var = $this->lang->line('error_resource_unavailable');

Esto es todo lo que se necesita para cambiar de idioma en CodeIgniter. Si queremos hacer una web multi-idioma podemos crear una cookie con el idioma del usuario y usar ese valor al cargar los archivos de idioma.


El helper Language.

En CodeIgniter un helper es un conjunto de funciones que ayudan a realizar una tarea. Podríamos traducir helper como ayudante o asistente. En concreto el helper Language contiene funciones que ayudan al programador en el tratamiento con archivos de idioma. Para poder usar este helper lo primero será cargarlo, cosa que haremos en el controlador:

$this->load->helper('language');

Una ver cargado podemos usar la función global lang() para cargar los textos de los ficheros de idiomas en lugar de $this->lang->line(). Se aconseja el uso de este helper en las vistas para favorecer la lectura de los archivos fuente. Ejemplo:

<div class="error">
<h1><?= lang('error_heading'); ?></h1>
<p><?= lang('error_resource_unavailable'); ?></p>
</div>

Fuentes y referencias:

1 comentario: