domingo, 5 de octubre de 2014

Codeigniter Multilenguaje

Codeigniter soporta por sí mismo el multilenguaje, sin embargo tiene un problema en cuanto a los motores de búsqueda, y es que sólo indexarán vuestra página en el lenguaje por defecto. 

Para que indexen en cada uno de los lenguajes que tengamos disponibles, deberíamos crear la típica estructura url amigable que estáis hartos de ver navegando por ahí:

Ej:

http://mytube.honor.es/es/login    ==>  'Español'
http://mytube.honor.es/en/login   ==>  'Inglés'
http://mytube.honor.es/ca/login   ==>  'Catalán'


Internationalization (i18n) for CodeIgniter 2.x

Esta utilidad que reside aquí, permite hacer exactamente esto. Podéis seguir las instrucciones en inglés o bien descargaros los archivos ya creados aquí y seguir leyendo en castellano cómo configurarlo. 

Los programas

Si no lo habéis hecho en el párrafo anterior, nos descargamos los programas de aquí.

Hay tres archivos:

MY_Lang.php
MY_Config.php
MY_language_helper.php   (Este programa falta en muchos paquetes que os podáis descargar por ahí)

Copiaremos los dos primeros en:

./application/core

y el helper en:

./application/helpers


No obstante, deberemos realizar una pequeña modificación en el fichero MY_Lang.php que consistirá en indicar en qué carpeta alojaremos cada lengua.


Siguiendo el ejemplo de las URL amigables al principio del artículo la modificación a realizar justo al principio del archivo, sería:

// languages

var $languages = array(

'en' => 'en',
'ca' => 'ca',
'es' => 'es'
);


Es importante reseñar que las abreviaciones de las lenguas no son triviales y corresponden a una normativa ISO, así que busca primero aquí cómo se representan las lenguas que vayas a usar.

Quitar el index.php

Si os fijáis, en las estructuras de ejemplo que hemos puesto arriba no aparece el index.php por ninguna parte, cosa que favorece la indexación en los motores de búsqueda. Hay mucha información en la web sobre esto y no voy a profundizar al no ser el cometido de este artículo. Yo lo he resuelto creando un archivo de nombre .htaccess en la raíz de mi site.

<Ifmodule mod_rewrite.c> 
     RewriteEngine On 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteRule ^(.*)$ /index.php/$1 [L] 
</IfModule>



<Ifmodule mod_rewrite.c> 

    ErrorDocument 404 /index.php
</IfModule>

Modificar archivos de configuración

Por una parte debemos realizar una modificación en el archivo config.php ubicado en la carpeta ./application/config consistente en precisamente eliminar el archivo index.php.

$config['index_page'] = '';

Por otro lado debemos modificar el archivo routes.php también ubicado en la misma carpeta, añadiendo a lo que tengamos las líneas siguientes con el fin de redireccionar la carpeta correspondiente. Fijaos que se refieren a los lenguajes que vamos a usar y seguimos utilizando la normativa ISO.


// URLs como '/es/login' -> usarán el controlador 'login'.

$route['^(es|ca|en)/(.+)$'] = "$2";



// '/es', '/ca' y '/en' URLs -> usarán el controlador por defecto.

$route['^(es|ca|en)$'] = $route['default_controller'];

Crear los archivos de lenguas

A partir de ahora debemos pensar en que ya no volveremos a usar textos en nuestras views, deberemos referenciar en su lugar una variable única para cada uno de los textos y crear un fichero  de traducción para cada lengua.

Por lo tanto, primero creamos la estructura de carpetas que vamos a usar dentro de ./application/language. 

En el ejemplo de las tres lenguas que usamos en el artículo, deberíamos crear:

./application/language/es/
./application/language/en/
./application/language/ca/

Según las características de nuestra aplicación nos puede convenir más crear un archivo de traducciones para cada controlador, uno general o hacer una cosa mixta. En el ejemplo crearemos uno general al que llamaremos global_lang.php. El nombre que le demos es indiferente con la única excepción de que debe terminar con el sufijo _lang. Este fichero lo debemos copiar en todas las carpetas de language.

./application/language/es/global_lang.php
./application/language/en/global_lang.php
./application/language/ca/global_lang.php

Este fichero deberá contener una entrada por variable con la siguiente estructura:

$lang['identificador_texto']='Texto_en_el_idioma_correspondiente';

Volviendo a nuestro ejemplo:

./application/language/es/global_lang.php

<?php
$lang['usuario']='Usuario';

$lang['registro']='Regístrate gratis';

?>

./application/language/en/global_lang.php


<?php
$lang['usuario']='User';
$lang['registro']='Sign up for free';
?>


./application/language/ca/global_lang.php


<?php
$lang['usuario']='Usari';
$lang['registro']='Registre gratuït';
?>



Creación del controlador

Sólo necesitaremos asegurarnos de llamar al helper language y cargar el formato del fichero antes de llamar al view. Esto sería un ejemplo para un posible login, usando nuestro fichero global_lang.php anterior:

function index()
 {

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

  // Carga el fichero de idioma. ATENCIÓN!!!  NO PONEMOS EL SUFIJO _lang!!!
  $this->lang->load('global');

  $this->load->view('login/login_view');

 }


Uso en las vistas

Es muy sencillo. Allí donde pondríamos el texto de nuestro ejemplo 'Regístrate Gratis', pondremos en su lugar:

<?php echo lang('registro'); ?>

Fijaos que es el nombre de la variable definida en el fichero global_lang.php


Remate final

Con todo lo que hemos visto ya funcionará el multilenguaje sólo!!!!

Pero como apunte final y colofón, dos utilidades que nos pueden ser (y lo serán) útiles.

Para saber en algún momento en qué lenguaje estamos:

$lenguaje = $this->lang->lang()

Esto lo podemos usar, por ejempo, para definir la lengua en nuestra vista:

<html lang="<?php echo $this->lang->lang();?>">

Otra utilidad interesante a tener en cuenta es el enlace necesario, para cambiar de lengua. Por ejemplo en una banderita con la bandera de la pérfida albión pondríamos:

anchor($this->lang->switch_uri('en'),'Muestra la página actual en inglés');




2 comentarios:

  1. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  2. Buen post amigo, por cierto Si llegan a darle un error como el siguiente:
    A PHP Error was encountered

    Severity: Runtime Notice

    Message: Declaration of MY_Config::site_url() should be compatible with CI_Config::site_url($uri = '', $protocol = NULL)

    Filename: core/MY_Config.php

    Line Number: 25

    Backtrace:

    File: C:\xampp\htdocs\holaWeb\index.php
    Line: 315
    Function: require_once

    Solo deben hacer lo siguiente en el archivo core/MY_Config.php:

    Lo que aparece: site_url($uri = '') cambiar por site_url($uri = '', $protocol = NULL)
    Con eso solucionan el error.

    Saludos,

    ResponderEliminar