Localización en cakePHP

Uno de los factores para que una aplicacion tenga éxito es en cuantos lenguajes se encuentra disponible, solo hechemos un vistazo a facebook (ya esta disponible en mas de 50 lenguajes), google, entre muchas más.

CakePHP cuenta con una estructura que nos permite internacionalizar nuestra aplicación, solo es necesario agregar los lenguajes que utilizara nuestro desarrollo, tomando el ejemplo de nuestro blog http://cakephp1.com/2009/03/20/desarrollando-un-sencillo-blog-con-cakephp/, vamos a traducir algunos valores a ingles.

El primer paso a seguir es agregar una carpeta dependiendo del idioma que vamos a utilizar (eng, esp, fra, etc.) en /app/locale/ quedaria de la siguiente manera /app/locale/eng/LC_MESSAGES/, cada carpeta de debe tener un archivo default.po que tiene la traduccion, el resultado final seria /app/locale/eng/LC_MESSAGES/default.po.

Para traducir algun texto solo hay que escribir el msgid y msgstr, veamos.

msgid "El post se guardo correctamente"
msgstr "Post saved"
 
msgid "El post se modifico correctamente"
msgstr "Post modified"
 
msgid "El post se elimino correctamente"
msgstr "Post deleted"
 
msgid "Entradas"
msgstr "Posts"
 
msgid "Agregar post"
msgstr "Add post"

En este caso no voy a traducir toda la aplicación, ya que solo es para cuestiones informativas. Algunos se estaran preguntando ¿pero de donde sale msgid?.

El siguiente paso va ser utiliza el metodo __() de cake, ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
/app/controllers/posts_controller.php
function agregar() {
 
	if(!empty($this->data)) {
 
		if($this->Post->save($this->data)) {
 
			$this->Session->setFlash(__('El post se guardo correctamente', true));
			$this->redirect(array('action' => 'index'));
		}
	}
}

Hechemos un vistazo a la linea 8 estamos utilizando el metodo __() y como segundo parametro le enviamos true para que no devuelva salida de echo. Utilizando este metodo ya es posible utilizar la internacionalizacion de cake, en este caso msgid seria El post se guardo correctamente’

¿Como seleccionar que lenguaje se va utilizar?
Primero necesitamos importar la libreria l10n del core de cake.

App::import('Core', 'l10n');

El siguiente paso va ser seleccionar el lenguaje que vamos a utilizar con la funcion beforeRender() en el controlador

function beforeRender() {
 
	$this->L10n = new L10n();
	$this->L10n->get("eng"); //puede ser esp, fra, etc.
}

Aqui seleccionamos el idioma a utilizar en este caso eng que seria ingles.

PostsController completo:

<?php
 
// app/controllers/posts_controller.php
App::import('Core', 'l10n');
class PostsController extends AppController
{
	var $name = 'Posts';
 
	function beforeRender() {
 
		$this->L10n = new L10n();
		$this->L10n->get("eng"); //puede ser esp, fra, etc.
	}
 
	function index() {
 
		$posts = $this->Post->find('all');
		$this->set('posts',$posts);
	}
 
	function agregar() {
 
		if(!empty($this->data)) {
 
			if($this->Post->save($this->data)) {
 
				$this->Session->setFlash(__('El post se guardo correctamente', true));
				$this->redirect(array('action' => 'index'));
			}
		}
	}
 
	function editar($id = null) {
 
		if(!empty($this->data)) {
 
			if($this->Post->save($this->data)) {
 
				$this->Session->setFlash(__('El post se modifico correctamente', true));
				$this->redirect(array('action' => 'index'));
			}
		}
 
		$this->Post->id = $id;
		$this->data = $this->Post->read();
	}
 
	function eliminar($id = null) {
 
		if($this->Post->del($id)) {
 
			$this->Session->setFlash(__('El post se elimino correctamente', true));
			$this->redirect(array('action' => 'index'));
		}
	}
}
 
?>

Archivo completo con más traducciones y utilizando el metodo __(), como se daran cuenta msgid es el primer parametro.

El msgid “Entradas” en nuestro archivo /app/locale/eng/LC_MESSAGES/default.po corresponde al archivo de la vista /app/views/posts/index.ctp

<h1><?__('Entradas')?></h1>

Como debe tener salida de echo no le pasamos el segundo parametro como en los ejemplos anteriores.

Resultado final http://cakephp1.com/blog/posts, como lo mencione anteriormente no esta traducida toda la aplicación ya que solo es para un fin de ejemplo.

4 Comentarios to “Localización en cakePHP”

  1. tuxsoul  on Abril 1st, 2009

    Me imagino que este ejemplo es para cakephp v1.2 ?.
    saludos.

  2. gomflo  on Abril 1st, 2009

    Asi es tuxsoul, en este ejemplo fue utilizado cakephp 1.2.

    Saludos.

  3. Robert Rodriguez  on Junio 30th, 2009

    ¿qué entradas de la tabla i18n no se usan en una aplicación cakephp?

  4. Cakero  on Noviembre 30th, 2009

    Después de estar buscando en internet 1000 ejemplos de escritores anglosajones… caigo aquí y me das una alegría :D … Perfecto… Solo una duda; como hago para que el usuario cambie de idioma?


Dejar un comentario