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.