lunes, 1 de abril de 2013

Internacionalización con FuelPHP


FuelPHP es un marco libre y de código abierto, basado en el PHP 5.3+. Implementa una arquitectura HMVC (Modelo-Vista-Controlador jerárquico) donde el controlador juega un papel central, la vista y el modelo estando completamente separados (no pueden comunicarse entre sí). También ofrece otras características, como una implementación RESTful, una análisis sintáctica de modelos, un mapeo objeto-relacional (ORM), un paquete de autenticación y un sistema de caché entre otras cosas. Aquí nos enfocamos en la forma en la cual maneja la internacionalización en su versión 1.5.1 de enero de 2013. El desarrollo de la nueva base de código 2.0 ya ha empezado pero la gestión de la internacionalización debería ser la misma.

Un ejemplo muy sencillo


En este primer enfoque, vamos a implementar el código para mostrar un modelo a través un controlador (vamos a sobrepasar completamente la vista).

Vamos a empezar con nuestro propio controlador Controller_Test colocado en fuel/app/classes/controller/test.php. Ponemos un poco de contenido dentro, es decir, el título y el contenido textual del modelo para mostrar. La clase View es un objeto contenedor para páginas HTML conteniendo PHP. Su método forge acepta tres parámetros: la ruta de acceso al archivo de la vista (el template, o modelo), ruta relativa al directorio app/views (aquí, test/template), una matriz asociativa de variables y valores PHP ($data), y un parámetro booleano de codificación (opcional, puesto a true, su valor por defecto, indica que seguimos la directiva de codificación del archivo de configuración app/config/config.php, que sustituye la del archivo core/config/config.php). La codificación interna de los juegos de caracteres es el UTF-8 por defecto.
class Controller_Test extends Controller
{
    public function action_index()
    {
        $data = array();
        $data['title']   = "Test Page";
        $data['content'] = "Test page content";

        return View::forge('test/template', $data, true);
    }
}
El modelo fuel/app/views/test/template.php es el siguiente:
<!DOCTYPE html>
<html>
<head>
    
    <?php echo $title ?>
</head>
<body>
    
<?= $content ?>
</body> </html>

Idiomas y locales


El idioma por defecto es el inglés (en), definido en el archivo de configuración app/config/config.php, que reemplaza la del archivo core/config/config.php. Si desea cambiar su valor durante la ejecución, sólo tiene que utilizar la siguiente llamada:
Config::set('language', 'es');
También puede directamente establecer el idioma y la configuración regional en el fichero app/config/config.php.
return array(
    'language'           => 'en', // Default language
    'language_fallback'  => 'en', // Fallback language when file isn't available for default language
    'locale'             => 'en_US', // PHP set_locale() setting, null to not set
    'locales'            => array(
        'en' => 'en_US',
        'es' => 'es_ES'
    ),
);
  • language es el idioma por defecto de la aplicación
  • language_fallback es el idioma que se utilizará si no se encuentra el idioma por defecto
  • locale es la configuración regional actual, utilizado por la función PHP set_locale(). Se puede poner null
  • locales son las configuraciones regionales compatibles con la aplicación. Puede utilizar la configuración regional que desee (lenguaje + región), y obligarles a utilizar un idioma en particular
En este ejemplo, hemos elegido el inglés (Estados Unidos) por defecto, y hemos añadido el soporte para el castellano (España).

Almacenamiento de datos sobre las lenguas


FuelPHP admite cuatro formas diferentes para almacenar datos sobre las lenguas:
  • una matriz PHP:
    return array('key' => 'value');
    
  • un archivo de configuración INI:
    [group]
    key=value
    
  • un archivo de configuración YAML:
    group:
       key: value
    
  • un archivo de configuración JSON:
    {
    "group":
        {
            "key": "value"
        }
    }
    
Ahora vamos a crear el archivo de idioma para el castellano app/lang/es/test.php
return array(
    'test_page' => 'Página de prueba',
    'penguin' => 'Alca',
    'hello' => '¡Hola!',
    'hello_name' => '¡Hola!, :name',
    'test_group'=> array('hello' => 'Hola, :name.')
);
Y su equivalente en inglés app/lang/en/test.php
return array(
    'test_page' => 'Test page',
    'penguin' => 'Penguin',
    'hello' => 'Hello!',
    'hello_name' => 'Hello, :name!',
    'test_group'=> array('hello' => 'Hello to you, :name.')
);
El controlador fuel/app/classes/controller/test.php es ahora:
class Controller_Test extends Controller
{
    public function action_index()
    {
        Config::set('language', 'es');
        Lang::load('test');

        $data = array();
        $data['title'] = Lang::get('test.test_page');
        $data['content1'] = Lang::get('hello');
        $data['content2'] = Lang::get('hello_name', array('name' => Lang::get('penguin')));
        $data['content3'] = Lang::get('test_group.hello', array('name' => Lang::get('penguin')));

        return View::forge('test/template', $data, 'UTF-8');
    }
}
Y el modelo (fuel/app/views/test/template.php):
<!DOCTYPE html>
<html>
<head>
    
    <?= $title ?>
</head>
<body>
    
<?= $content1 ?> <?= $content2 ?> <?= $content3 ?>
</body> </html>
El resultado en castellano es:
¡Hola!
¡Hola!, Alca
Hola, Alca.
Mientras que en inglés (comentando la línea Config::set('language', 'es');), obtenemos:
Hello!
Hello, Penguin!
Hello to you, Penguin.
Para cargar un archivo de idioma, la clase Lang propone el método load. En este ejemplo, cargamos los datos del lenguaje por completo, pero habríamos podido igualmente cargar únicamente el grupo test con:
Lang::load('test', 'test_group');
Como lo pueden ver, también es posible utilizar un marcador de posición denominado en la cadena traducida, precedida de dos puntos (aquí, :name).
En una nota aparte, la clase Lang de FuelPHP contiene métodos para definir una línea específica en el archivo de idioma (set), para eliminar una línea específica del archivo de idioma cargado (delete), y para grabar un archivo de idioma (save), lo que le permite actualizar dinámicamente un archivo de idioma.


Internationalization with FuelPHP (en inglés)
Internationalisation avec FuelPHP (en francés)
Internacionalização com FuelPHP (en portugués)

No hay comentarios:

Publicar un comentario