Symfony 1.1, la guía definitiva

13.2. Estándares y formatos

Las partes internas de una aplicación web no deben preocuparse por las diferencias culturales entre países. Las bases de datos por ejemplo almacenan las fechas y cantidades siguiendo estándares internacionales. Pero cuando los datos se envían o se reciben del usuario, es necesario realizar una conversión. Los usuarios normales no entienden lo que es un timestamp y prefieren llamar a su idioma en su propio idioma (por ejemplo "Français" en vez de "French"). Así que se debe aprovechar la posibilidad de realizar estas conversiones de forma automática en función de la cultura del usuario.

13.2.1. Mostrando datos según la cultura del usuario

Una vez que se define la cultura del usuario, los helpers que dependen de la cultura muestran automáticamente los datos de forma correcta. El helper format_number() por ejemplo, muestra un número en un formato familiar para el usuario, en función de su cultura, tal y como muestra el listado 13-3.

Listado 13-3 - Mostrando un número según la cultura del usuario

<?php use_helper('Number') ?>

<?php $sf_user->setCulture('en_US') ?>
<?php echo format_number(12000.10) ?>
 => '12,000.10'

<?php $sf_user->setCulture('fr_FR') ?>
<?php echo format_number(12000.10) ?>
 => '12 000,10'

No es necesario indicar a los helpers la cultura de forma explícita. Los helpers la buscan automáticamente en el objeto sesión. El listado 13-4 muestra todos los helpers que tienen en cuenta la cultura para mostrar sus datos.

Listado 13-4 - Helpers dependientes de la cultura

<?php use_helper('Date') ?>

<?php echo format_date(time()) ?>
 => '9/14/06'

<?php echo format_datetime(time()) ?>
 => 'September 14, 2006 6:11:07 PM CEST'

<?php use_helper('Number') ?>

<?php echo format_number(12000.10) ?>
 => '12,000.10'

<?php echo format_currency(1350, 'USD') ?>
 => '$1,350.00'

<?php use_helper('I18N') ?>

<?php echo format_country('US') ?>
 => 'United States'

<?php format_language('en') ?>
 => 'English'

<?php use_helper('Form') ?>

<?php echo input_date_tag('fecha_nacimiento', mktime(0, 0, 0, 9, 14, 2006)) ?>
 => input type="text" name="fecha_nacimiento" id="fecha_nacimiento" value="9/14/06" size="11" />

<?php echo select_country_tag('pais', 'US') ?>
 => <select name="pais" id="pais"><option value="AF">Afghanistan</option>
      ...
      <option value="GB">United Kingdom</option>
      <option value="US" selected="selected">United States</option>
      <option value="UM">United States Minor Outlying Islands</option>
      <option value="UY">Uruguay</option>
      ...
    </select>

Los helpers de fechas aceptan un parámetro opcional para indicar su formato, de modo que se pueda mostrar una fecha independiente de la cultura del usuario, pero no debería utilizarse en las aplicaciones con soporte de i18n.

13.2.2. Obteniendo información en una aplicación localizada

Si es necesario obtener información del usuario, se debería obligar al usuario, si es posible, a introducir datos que ya estén internacionalizados. Esta técnica evita tener que adivinar el formato en el que ha introducido el usuario sus datos. Por ejemplo, es complicado que un usuario introduzca una cantidad monetaria con la separación de los miles.

Se pueden restringir las posibilidades del usuario ocultando los datos realmente enviados al servidor (como por ejemplo mediante select_country_tag()) o separando las partes de un dato complejo en varias partes individuales sencillas.

No obstante, para datos como fechas esta técnica no siempre es posible. Los usuarios están acostumbrados a introducir las fechas en el formato propio de su país, por lo que se deben convertir a un formato internacional. Para ello se puede utilizar la clase sfI18N. El listado 13-5 muestra cómo utilizar esta clase.

Listado 13-5 - Obteniendo una fecha a partir de un formato propio del usuario en una acción

$fecha= $peticion->getParameter('fecha_nacimiento');
$cultura_usuario = $this->getUser()->getCulture();

// Obtener un timestamp
$timestamp = $this->getContext()->getI18N()->getTimestampForCulture($fecha, $cultura_usuario);

// Obtener las partes de una fecha
list($dia, $mes, $ano) = $this->getContext()->getI18N()->getDateForCulture($fecha, $cultura_usuario);