domingo, 3 de febrero de 2013

Gestión de los plurales con el framework PHP Yii


Yii (para Yes, it is) es un framework PHP de código abierto y libre iniciado por Qiang Xue en 2008. Basado en el desempeño, en la arquitectura MVC y siguiendo el paradigma de programación orientada a eventos, también ofrece la traducción de mensajes, el formateo de la fecha y de la hora, los diferentes formatos de números y la localización de interfaz. Nos centraremos aquí en la forma en la cual Yii gestiona los plurales en la función de traducción de mensajes de su versión actual (1.1.13).

La internacionalización con Yii


Llevaremos a cabo una implementación mínima del framework Yii que sólo contiene un controlador y un único método.

La internacionalización de textos con Yii se puede hacer con diversas fuentes:
  • un array asociativo de claves/valores en un conjunto de directorios: esta es la opción predeterminada que utiliza la clase CPhpMessageSource
  • una base de datos que contiene una tabla fuente y una tabla mensajes: esta solución utiliza la clase CDbMessageSource
  • una fuente GNU Gettext basada en archivos .po o sus equivalentes binarios .mo: esta solución está definida por la clase CGettextMessageSource
Cada uno de estos métodos puede utilizar cachingDuration, un parámetro que pone en caché el resultado de la traducción durante el tiempo especificado.

En nuestro ejemplo, utilizamos un array asociativo PHP.

La arquitectura de los archivos es la siguiente:
framework/
test/protected/controllers/SiteController.php
test/protected/messages/es/test.php
test/index.php
Para visualizar correctamente los caracteres acentuados codificados en UTF-8, necesitamos que el archivo de idioma protected/messages/es/test.php sea por supuesto codificado en UTF-8, y que el archivo índice de la aplicación test/index.php indique la codificación de caracteres con la siguiente línea:
header("Content-Type: text/html; charset=utf-8");
El archivo test/protected/messages/es/test.php contiene el array asociativo de las claves de traducción en el idioma fuente (el inglés por defecto) y sus valores traducidos.
return array (
    'You have a message.' => 'Tiene un mensaje.',
);
En el controlador, empezamos por indicar el idioma de consulta (aquí, el castellano), y luego utilizamos el método t de la clase YiiBase (definida en YiiBase.php) que toma como parámetros la categoría de mensaje (aquí, el nombre del archivo que contiene el array asociativo en messages/es/, o sea test), y la clave (o la cadena en el idioma de origen).
echo Yii::t('test','You have a message.')
Obtenemos: Tiene un mensaje.

La pluralización con Yii


Volvamos a nuestro problema de pluralización de mensajes presentado en un post anterior (Unos plurales muy singulares). Recuerdamonos que existen dependiendo de las lenguas diferentes formas de números gramaticales, y no sólo un singular y un plural como en español.

En este ejemplo, una interfaz puede mostrar 0 mensaje (o Ningun mensaje), 1 mensaje (o Un mensaje), o n mensajes, n siendo un marcador de posición para ser reemplazado durante el tratamiento.

El helper CChoiceFormat (que encontramos en el directorio framework/i18n/) permite expresar simplemente los diferentes valores posibles de un mensaje gracias a las reglas de pluralización de los idiomas ya soportadas por el framework, que se encuentran en el directorio framework/i18n/data/, en los archivos dedicados a cada idioma y locale.

Hay por ejemplo las del castellano en el archivo es.php :
'pluralRules' =>
    array (
        0 => '(n>=0&&n<=2)&&n!=2',
        1 => 'true',
    ),
Es la clase CLocale que accede a ello a través de su método getPluralRules(). Este método es llamado por el método t (utilizado encima) de la clase YiiBase y del cual se puede apreciar el código.

Para obtener más información sobre los tipos de plural por idioma, los remito al Common Locale Data Repository del Unicode, onde se encuentran explicitadas las reglas de pluralización que permiten establecer las fórmulas anteriores.

La compacidad del uso de estas reglas se ilustra aquí con una palabra.
for ($i=0; $i<3; $i++)
{
    echo Yii::t('test', "mensaje|mensajes", $i);
}
Muestra con los valores del 0 al 2:
mensaje
mensaje
mensajes
Sin embargo, una expresión más significativa también se puede utilizar.
for ($i=0; $i<4; $i++)
{
    echo Yii::t('test', "Tiene {n} mensaje.|Tiene {n} mensajes.", $i);
}
Muestra:
Tiene 0 mensaje.
Tiene 1 mensaje.
Tiene 2 mensajes.
Tiene 3 mensajes.
También es posible refinar los mensajes utilizando directamente una expresión PHP o un valor.
for ($i=0; $i<3; $i++)
{
    echo Yii::t('test', "0#No tiene ningun mensaje.|1#Tiene un mensaje.|n>1#Tiene algunos mensajes.", $i);
}
Muestra:
No tiene ningun mensaje.
Tiene un mensaje.
Tiene algunos mensajes.

Internationalización y pluralización


El siguiente paso es, por supuesto, gestionar al mismo tiempo la internationalización y la pluralización. Para hacerlo, sólo tiene que utilizar el mensaje completo con sus variaciones de expresiones en el idioma fuente (aquí, el inglés) y utilizarlo como clave en el array de idiomas.

Con un archivo de idioma tal que éste:
return array (
    "0#You don't have any message.|1#You have one message.|n>1#You have many messages." => "0#No tiene ningun mensaje.|1#Tiene un mensaje.|n>1#Tiene algunos mensajes.",
);
El controlador:
for ($i=0; $i<3; $i++)
{
    echo Yii::t('test', "0#No tiene ningun mensaje.|1#Tiene un mensaje.|n>1#Tiene algunos mensajes.", $i);
}
Todavía muestra en español:
No tiene ningun mensaje.
Tiene un mensaje.
Tiene algunos mensajes.
Y en inglés (comentando la línea Yii::app()->setLanguage('es');) :
You don't have any message.
You have one message.
You have many messages.

La última palabra


Como ha podido verlo en estos ejemplos, los desarrolladores del framework Yii fueron capaces de implementar una solución muy elegante de la gestión de los plurales permitiendo de expresar una gran complejidad debida a la variedad de casos posibles mientras manteniendo una facilidad relativa de uso. Se cubre una parte de los diferentes tipos de plurales entre idiomas con números gramaticales diferentes, pero también se maneja fácilmente muestras contextuales diferentes para el mismo idioma.

Lectura


Para ir más lejos en la comprensión del framework Yii, recomiendo la lectura de estos dos libros:
Yii Rapid Application Development

Yii Rapid Application Development, por Lauren J. O'Meara y James R. Hamilton III (2012, 340 páginas)

Usted descubrirá el desarrollo de una aplicación completa en la forma de proyectos y misiones centrados en características y puntos claves tanto del framework que de una aplicación real.
Web Application Development with Yii and PHP

Web Application Development with Yii and PHP, por Jeffrey Winesett (2012, 332 páginas)

Usted encontrará una introducción al framework, pero sobre todo el desarrollo paso a paso de una aplicación web completa.

Crédito de la imagen: gringer


Gestion des pluriels avec le framework PHP Yii (en francés)
Handling plurals with the Yii PHP framework (en inglés)
Gestão dos plurais com o framework PHP Yii (en portugués)

No hay comentarios:

Publicar un comentario