Localización e internacionalización
Miércoles, 16 Julio 2008
Vamos a ver cómo realizar la internacionalización de nuestra página web. Nos fijaremos únicamente en hacer nuestra página web en varios idiomas, sin atender a otras cuestiones como puede ser el formateo de las monedas o los números.
Los pasos a realizar son los siguientes:
1. Crear tantos ficheros de idiomas como queramos tener. Estos ficheros los meteremos en la carpeta /app/locale, creando una carpeta por cada idioma que tendrá por nombre el código de 3 letras del lenguaje (ISO 639-2, lista de lenguajes). Y dentro de esta carpeta, crearemos otro subdirectorio llamado LC_MESSAGES y por último, en éste, un fichero default.po.
Ejemplo para castellano y gallego:
Este fichero debe estar codificado en ISO-8859-1 y los strings no pueden tener más de 1014 caracteres. Se asocian las claves con los valores de la siguiente manera:
msgid “clave”
msgstr “valor”
Teniendo en cuenta que cada clave debe ser única.
2. Modificar el app_controller para establecer el lenguaje elegido.
uses('L10n');
class AppController extends Controller
{
function beforeFilter() {
$this->L10n = new L10n();
$languages = array('es', 'gl');
$paramLang = $this->params['plugin'];
$lang = $this->Session->check('lang') ? $this->Session->read('lang'): 'es';
if (isset($paramLang) && in_array($paramLang, $languages)) {
$lang = $paramLang;
}
$this->Session->write('lang', $lang);
$this->L10n->get($lang);
Configure::write('Config.language', $lang);
}
}
Lo que hacemos aquí es recoger el valor de la url, si existe, y si no obtenerlo de la sesión.
Recordar que el parámetro plugin de la url es el que se establece justo antes del nombre del controlador, por lo tanto las urls serán de la forma:
www.hospedaxes.com/es/controlador/accion/…
www.hospedaxes.com/gl/controlador/accion/…
3. Para usar los valores establecidos en los ficheros .po, tenemos que utilizar la función __(), al que se le pasa la clave y un booleano opcional [false si queremos que se comporte como un echo (valor por defecto), true para que devuelva únicamente una cadena].

