miércoles, 26 de octubre de 2011

Codeigniter Multilenguaje web, por URLS

Este tutorial se lo voy a dedicar a explicar como se hace para crear un sistema Multilenguaje en Codeigniter, en internet hay varios tutoriales de como hacer esto en nuestro idioma, pero lo hacen usando cookies, y aunque no están mal, no permiten a un buscador almacenar correctamente el contenido de nuestra pagina en los diferentes lenguajes y así atraer a más gente a nuestra pagina Web.
Codeigniter Multilenguaje

Aquí les dejo un articulo sobre SEO y el MULTILINGUAL SEO, por si se quieren documentar un poco más: http://www.searchenginejournal.com/multilingual-seo/19903/

Ahora bien, para empezar deben conocer primero como se trabaja con lenguajes de manera básica con Codeigniter, aqui les dejo un pequeño tutorial que hice: http://sosinformatico.blogspot.com/2011/10/codeigniter-language-class.html

Para hacer que codeigniter sea multilenguaje hay dos maneras que yo conozco, una es a través de hooks y otra extendiendo la clase que lang.php en la carpeta core de nuestra aplicación. En este tutorial voy a explicar la ultima forma, y despues publicara otro con la otra forma.

Configurando el archivo Routes.php

En application/config/routex.php vamos a agregar dos lineas:


$route['(\w{2})/(.*)'] = '$2';

$route['(\w{2})'] = $route['default_controller'];


En el primer array se establece que cualquier ruta que tenga dos caracteres y una barra inclidada y algo mas, sera rederigida a ese algo más, y al segunda estable que cualquier ruta con dos caracteres llamara al controlador por defecto.

Configurando el archivo Config.php

En application/config/config.php, cerca de la configuración de lenguaje vamos a agregar:


$config['languages'] = array("es" => "espanol", "en" => "english");



$config['redirect_urls']=false;


Esto es para definir la configuración de nuestro sistema de lenguajes, y que después solo deba ser modificada desde aquí, si queremos agregar un lenguaje aparte o cualquier cosa. Ademas tambien nos permite definir si queremos usar la redirection de url o no, que sirve para que si alguien entre a "hhttp://nuestrositio.com/" lo redirige automaticamente o no a "hhttp://nuestrositio.com/xx" las dos x significan el idioma que tengamos por defecto.

Extendiendo lang.php

Para extender esta libreria del nucleo de Codeigniter, debemos crear dentro de la carpeta application/core  un archivo que debe empezar con la variable definida $config['subclass_prefix'] en el config.php (por defecto es MY_) y luego lang.php, en mi caso el nombre es MY_Lang.php, y dentro colocamos el siguiente codigo:

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');

class MY_Lang extends CI_Lang
{
 function __construct()
 {
  parent::__construct();  
  $config =& get_config();
  if(isset($config['languages']) && isset($config['redirect_urls']))
  {
   global $URI, $CFG, $IN;
   //var_dump($URI);
   $lang = (isset($URI->segments['1']))?$URI->segments['1']:'';
   $uri=$URI->segments;
   if(strlen($lang) == 2 && array_key_exists($lang,$config['languages']) == true)
   {
    $config['language']=$config['languages'][$lang];
   }
   elseif($config['redirect_urls'] == true || strlen($lang) == 2 && array_key_exists($lang,$config['languages']) == false)
   {
    $url=$config['base_url'];
    $url.=(empty($config['index_page']))?'':$config['index_page'].'/';
    $url.=array_search($config['language'],$config['languages']).'/';
    if(strlen($lang)==2)
    {
     array_shift($uri);
     $url.=implode('/',$uri);
    }else
    {
     $url.=implode('/',$uri);
    }
    header("location: $url");
   }
  }
 }
}


Este código es el que va a dar la funcionalidad de muli lenguaje, es bastante sencillo, lo que hace es comprueba cuales son los primeros caracteres en la url, comprueba que estén definidos en la configuración y si es así cambia al idioma correspondiente, sino redirige al idioma por defecto. SI la variable redirect:url esta en true, el sistema comprobara que la url empieza con los dos caracteres del idioma por defecto y si no es así lo redirige a la url del idioma por defecto, si esta en false esta variable pues no hace nada y deja el idioma por defecto.

Probando el sistema Multilenguaje.

Esto no es un sistema automatizado que va a traducir toda tu aplicación, lo que hace es modificar solamente el idioma que usa la aplicación dependiendo de la url, para verlo funcionando debemos crear una aplicación que tenga varias idiomas ya definidos y esto se encargara del resto.

De todas maneras aquí les dejo una aplicación con el welcome_message en español y ingles, y los links para cambiar de idioma. Y así la prueban y comentan como funciona.






7 comentarios:

  1. Para cuando enseñas la seguna forma con hooks?

    ResponderEliminar
  2. jajaja, ya se me habia olvidado, cuando termine de hacer uno de jqgrid hago el de hooks.

    ResponderEliminar
  3. Hola, que es mejor hacerlo de esta forma o con el hook??

    ResponderEliminar
  4. Hola, no sé cómo hacerlo funcionar cuando empiezo a agregar más controllers, en la página de inicio se ve todo muy bien, pero a la hora de cambiar de página todo vuelve al lenguaje por default, cómo le puedo hacer para que cuando un usuario escoja el segundo lenguaje se mantengan todas las cadenas de ese segundo lenguaje? Muchas gracias por la ayuda.

    ResponderEliminar
  5. Tengo la misma duda, me está pasando lo mismo. ¿Alguien tiene alguna solución?

    ResponderEliminar
    Respuestas
    1. Tienes que crear una funcion extendiendo la que usas para crear los url que se encargue de eso. Yo hace tiempo lo hice pero ya no me acuerdo bien. Dejame buscarle y te aviso.

      Eliminar
  6. A mi me pasa lo mismo, el metodo es buenisimo pero estaria bien poder completarlo. Gracias

    ResponderEliminar