multilenguaje en cakephp (Internationalization & Localization)

 

cakePhp, Emprendedor

La primera parte que es internacionalización, es muy importante tenerla prevista antes de empezar un proyecto en cakephp, lo que hago en cualquier proyecto por muy grande o pequeño que sea es dejarlo preparado.

Es fácil dejarlo listo para traducir, en vez de poner los textos sin más, hacelo de la siguiente manera.

__('texto para traducir', true);

Ya lo tenemos preparado por si nos piden multilenguaje en un futuro. Ahora si lo necesitamos hacer, el siguiente paso es crear los archivos con tantos idiomas se requiera, por ejemplo de ingles y español.

Crearíamos las siguientes carpetas y archivos dentro de la carpeta locale:
eng/LC_MESSAGES/default.po
esp/LC_MESSAGES/default.po

Ahora viene la parte que mas me ha costado, y más divertida, pasar el script que coge todos los textos traducibles, y crea archivos con las palabras a traducir . El script lo lanzo desde eclipse, os dejo un pantallazo de la configuración para lanzar el script.

Crea varios archivos, solo hay que abrir estos archivos, copiar lo que hay y pegarlo dento de los archivos que hemos creado default.po
Para editar los archivos .po os recomiendo el editor poedit, desde aquí ya se traduce con facilidad.

Ya tenemos una parte muy importante, podríamos cambiar de idioma copiando lo siguiente en app_controller.php

Configure::write('Config.language', 'esp');

o

Configure::write('Config.language', 'eng');

Ahora entramos en la segunda parte Localización.
Hay muchas maneras de hacerlo, os voy a presentar una sencilla, cuando estoy en la página en inglés tener el link para pasarla a castellano y viceversa.

En config/route.php copiar el siguiente código, para reconocer el idioma:

Router::connect('/:language/:controller/:action/*',
                       array(),
                       array('language' => '[a-z]{3}'));

En app_controller.php necesitamos definir el idioma predefinido, llamar a los componenetes cookie y session, ver y guardar en cookie el idioma que queremos.

$lang='esp';
Configure::write('Config.language', $lang);

class AppController extends Controller {

	var $helpers = array('Html', 'Form', 'Ajax','Javascript','Bonzzay');
	var $components = array('Session', 'Cookie'); 

	function beforeFilter() {
	    $this->_setLanguage();
	} 

	function _setLanguage() {

	    if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
	        $this->Session->write('Config.language', $this->Cookie->read('lang'));
	    }
	    else if (isset($this->params['language']) && ($this->params['language']
	             !=  $this->Session->read('Config.language'))) {     

	        $this->Session->write('Config.language', $this->params['language']);
	        $this->Cookie->write('lang', $this->params['language'], false, '20 days');
	    }
	}

}

Lo último que nos falta hacer es poner el link para cambiar el idioma, pero debemos saber en que idiomas estamos para saber que link poner, asi que primero vamos al controlador o en el mismo app_controller y ponemos el siguiente código, que recoge, que tenemos como lenguaje definido en cookie y lo envia a vista.

function beforeRender() {
		$idioma = $this->Cookie->read('lang');
		$this->set('idioma',$idioma);
	}

Recojo en vista el idioma definido y según el idioma definido tengo un link u otro.

$this->languageswitch($idioma);
function languageswitch($idioma){
		$content ="";
		if($idioma == 'esp'){
			$content .= $this->Html->link(__("English",true), array('language'=>'eng'));
		}else if($idioma == 'eng'){
			$content .= $this->Html->link(__("English",true), array('language'=>'esp'));
		}else{
			$content .= $this->Html->link(__("English",true), array('language'=>'eng'));
		}
		return $content;
	}

Bueno esto ya estaría, espero haberme explicado bien, se que son muchas cosas, muchos conceptos, pero leyendo antes el cookbook de cakephp, ayuda entender mejor como funciona.